Использование sscanf в Arduino дает несоответствие с const char *, и возвращаемое значение всегда одинаково, несмотря на разные значения для ввода - PullRequest
1 голос
/ 12 февраля 2020

Компилятор arduino IDE довольно прост и позволяет определять переменные как "byte", который представляет собой uint8_t или unsigned char, и, похоже, он работает. Но он не подключается напрямую с этим тестовым кодом. Я использую Arduino IDE и PlatformIO для сравнения результатов. Для отладки я вставляю этот код в симулятор OnlineGBD C ++. Мне нужно предоставить байты в шестнадцатеричном формате, представляющие двоичные значения, как если бы я подключил его следующим образом:

const char s [] = {0x37, 0x74, 0x37, 0}; // 00110111,01110100,00110111,0 writeTextPacket (s)

Мне нужно изменить "byte b [6]" в симуляторе на "char b [6]", чтобы запустить его, но printf выглядит как будто он дает мне указатели, а не то, что находится в местах памяти. Мой второй Printf пытается отформатировать переменную "b" как% p, а также% x для тестирования, и перед значением ставится 0x7ffe, поэтому (void **) b равно 0x7ffexxxxxxxx, а значение b равно xxxxxxxx.

И, наконец, возвращаемое значение для nBytes всегда равно "7". Очевидно, он должен дать мне количество найденных байтов. Я думаю, что я путаюсь между указателями и символами. Спасибо.

void RegisterList::writeTextPacket(const char *s) volatile{

  int nReg;
  byte b[6];
  int nBytes;
  nBytes=sscanf(s,"%x %x %x %x %x %x",&nReg, b, b+1, b+2, b+3, b+4)-1;  // return number of bytes

  printf("%d\n",nBytes);
  printf("%d, %p, %x, %x, %x, %x, %x", nReg, (void**) b, b, b+1, b+2, b+3, b+4);

  loadPacket(nReg,b,nBytes,0,1);  // loadPacket(int nReg, byte *b, int nBytes, int rep, int flag)
} 

1 Ответ

0 голосов
/ 14 февраля 2020

Успех! Спасибо за большую помощь. Изменив «byte» на «uint8_t» (для этого Arduino имеет «байт typdef uint8_t») и заменив% hhx на% x, избавился от предупреждений. И этот тестовый код:

  const char *s="16 A9 69 55 C6 A8";
  int nReg;
  uint8_t b[6];
  int nBytes;
  nBytes=sscanf(s,"%d %hhx %hhx %hhx %hhx %hhx",&nReg, b, b+1, b+2, b+3, b+4)-1;  // return number of bytes

  printf("%d\n",nBytes);
  printf("%d, %X, %X, %X, %X, %X", nReg, *b, *(b+1), *(b+2), *(b+3), *(b+4));

дает этот правильный результат и считает только шестнадцатеричные числа, которые идут после целого числа nReg:

5

16, A9, 69 55, С6, А8

...