Мне нужно проанализировать ответ от устройства (SIM900) следующим образом:
\r\n+CIPRXGET:1
+CIPRXGET: 2,1,3
DATA COMPOSED BY A WHITESPACE AND MAYBE OTHER
OK
поэтому я использую sscanf дважды: сначала для удаления последней строки «ОК», а затем для анализа данных.
char buffer[256] = sim900.getResponse();
char data[256];
int bytesRead, bytesToRead;
sscanf(buffer, "%[^OK]", buffer);
sscanf(buffer, "%*s,%d,%d\r\n%[^\\0]", &bytesRead, &bytesToRead, data);
мой ответ начинается с пробела (символ 0x20), и я получил грязный вывод, то есть «\ r \ n \ r \ n» (или в шестнадцатеричном представлении «0x0D 0x0A 0x20 0x0D 0x0A»).
Я попробовал все, но я не могу правильно разобрать только пробельные символы в выходной буфер.
Проблемы:
sscanf(buffer, "%[^OK]", buffer);
попытки чтения и записи в один и тот же буфер. Это неопределенное поведение. Используйте разные буферы. @EOF
"%[^OK]"
Выглядит для всех char
это не 'O'
и не 'K'
так что останавливается на \r\n+CIPRX ... DATA C
"%*s"
в sscanf("%*s,%d..."
делает 2 вещи 1) сканирует и не сохраняет все начальные пробельные символы. 2) сканировать и не сохранять (из-за '*'
) все символы без пробелов. Там никогда не будет ','
следующие «все символы, не являющиеся пробелами», так sccanf()
останавливается.
Когда используешь sscanf()
и имея проблемы, первое, что нужно кодировать, это проверка возвращаемых значений sscanf()
,
Неясно, какова общая цель ОП, но, возможно, поможет следующее.
#include <stdio.h>
char *text =
"\r\n+CIPRXGET:1\r\n+CIPRXGET: 2,1,3\r\nDATA COMPOSED BY A WHITESPACE AND MAYBE OTHER\r\nOK";
int main(void) {
char data[256];
int bytesRead, bytesToRead;
if (sscanf(text, "%*[^,],%d,%d %255[^\r\n]", &bytesRead, &bytesToRead, data) == 3) {
printf("bytesRead:%d\nbytesToRead:%d\ndata:'%s'\n",bytesRead, bytesToRead, data);
}
return 0;
}
Выход
bytesRead:1
bytesToRead:3
data:'DATA COMPOSED BY A WHITESPACE AND MAYBE OTHER'
Других решений пока нет …