SSCANF анализ ответа с пробелами

Мне нужно проанализировать ответ от устройства (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»).

Я попробовал все, но я не могу правильно разобрать только пробельные символы в выходной буфер.

-1

Решение

Проблемы:

  1. sscanf(buffer, "%[^OK]", buffer); попытки чтения и записи в один и тот же буфер. Это неопределенное поведение. Используйте разные буферы. @EOF

  2. "%[^OK]" Выглядит для всех char это не 'O' и не 'K'так что останавливается на \r\n+CIPRX ... DATA C

  3. "%*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'
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]