Нашел такую особенность модема.
Дано.Суть инициализации:
AT+CIPMUX=0
AT+CIPMODE=0
AT+CIPRXGET=1
AT+CIPQSEND=1
Если на сокет приходят данные, то модем выводит +CIPRXGET: 1
Если эти данные из сокета не забрать, и придут еще данные, то этот URC не выведется.
Нормальная работа с сокетом:
Код
<в сокет приходят данные (4 байта)>
+CIPRXGET: 1
AT+CIPRXGET: 2, 128 // забираем данные из буфера
+CIPRXGET: 2,4,0 // возвращено 4 байта, остаток в буфере - 0 байт
<данные>
OK
Проблема.В
очень редких случаях может случиться следующее.
Код
<в сокет приходят данные (4 байта)>
+CIPRXGET: 1
AT+CIPRXGET: 2, 128
<в сокет приходят еще данные (4 байта) !!!>
+CIPRXGET: 2,4,0 // возвращено 4 байта, остаток в буфере - 0 байт !!!
<данные>
OK
То есть URC потеряется, если новые данные придут в момент вытаскивания старых из буфера. А при вытаскивании, модем скажет, что в буфере осталось 0 байт.
Решение.Вариант 1. Помимо того, чтобы забирать данные из буфера по URC +CIPRXGET: 1, периодически проверять буфер на наличие данных.
Варинат 2. Сразу после вытаскивания данных из буфра, проверить буфер на пустоту еще раз.
Код
+CIPRXGET: 1
AT+CIPRXGET: 2, 128
+CIPRXGET: 2,4,0
<данные>
OK
AT+CIPRXGET: 2, 128
+CIPRXGET: 2,4,0
<данные>
OK