GPRS Shield принимает SMS но обрезает сообщения до 14 символов.

Тема в разделе "Arduino & Shields", создана пользователем Вячеслав, 21 ноя 2012.

  1. Проблема в том, что GPRS Shield принимает SMS но обрезает сообщения до 14 символов.
    Инициализирую вот такими командами:


    gprsSerial.print("AT+CMGF=1\r");
    gprsSerial.print("AT+IFC=1, 1\r");
    gprsSerial.print("AT+CPBS=\"SM\"\r");
    gprsSerial.print("AT+CNMI=1,2,2,1,0\r");


    Отправляю на шилд SMS: 12345678901234567890

    Шилд отвечает:


    AT+CMGF=1

    OK
    AT+IFC=1, 1

    OK
    AT+CPBS="SM"

    OK
    AT+CNMI=1,
    +CMT: "+79264927004","","12/11/21,17:54:09+16"
    12345678901234


    Обратите внимание что текст сообщения обрезан до 14 символов.

    Ни кто не сталкивался с такой проблемой?
     
  2. Текст сообщения - последняя строчка.
     
  3. hibiki

    hibiki Гик

    а код?
     
  4. Код всей программы большой.
    Все что относится к модулю GPRS я привел,
    А ответ вываливается в монитор серала. Обработка ни какая не проводится.

    В сериале видно, что Модуль получил СМС но текст сообщения обрезает. Я думаю что проблема в инициализации модуля. Это 4 команды выделенные болдом.
     
  5. nailxx

    nailxx Официальный Нерд Администратор

    А точно там дальше по ходу оперы не приходит новая порция? Когда Serial.available() вновь возвращает не ноль и т.п.
     
  6. partizan86

    partizan86 Нуб

    У меня такая же хрень, тока вот что ещё: +CMT: "+79264927004","","12/11/21,17:54:09+16" как видно после номера телефона стоит "", это потому что на сим-карте для этого номера нет записи в записной книжке. Если она будет, например +CMT: "+79264927004","Vasya","12/11/21,17:54:09+16", то сообщение ещё больше обрежется (на длину имени!!!)...
     
  7. Корней

    Корней Гик

    With Arduino 1.0 you should be able to use the SoftwareSerial library included with the distribution (instead of NewSoftSerial). However, you must be aware that the buffer reserved for incoming messages are hardcoded to 64 bytes in the library header, "SoftwareSerial.h":
    1. define _SS_MAX_RX_BUFF 64 // RX buffer size

    This means that if the GPRS module responds with more data than that, you are likely to loose it with a buffer overflow! For instance, reading out an SMS from the module with "AT+CMGR=xx" (xx is the message index), you might not even see the message part because the preceding header information (like telephone number and time) takes up a lot of space. The fix seems to be to manually change _SS_MAX_RX_BUFF to a higher value (but reasonable so you don't use all you precious memory!)
     
  8. Корней

    Корней Гик

  9. nailxx

    nailxx Официальный Нерд Администратор

    Отличная находка, Корней! Большое спасибо.

    Что-то мне только пока не приходит в голову мыслей, как можно без правки встроенной библиотеки обойтись. Исключительно #define, #undef в своём скетче.
     
  10. Корней

    Корней Гик

    Код обработки RX SoftwareSerial возвращает управление после приема 8 бит. Соответственно код, который "вычитывает" ответ GPRS модуля в цикле serial.available(); serial.read(); должен успевать освобождать циклический буфер. Код считывания из библиотеки SIM900 (на которую ссылается Вики), так и делает - бодро заполняет собственный буфер.
    Аналогично работают serial.readBytes/readString.
    Если же требуется что-то долго делать между отправкой команды в модуль и приемом ответа, то нужно либо увеличивать буфер SoftwareSerial, либо использовать более интеллектуальную модификацию SoftwareSerial.
    К слову, у HardwareSerial такой же циклический буфер на 64 байта.