0

我与此代码进行了为期 4 天的战斗:

  unsigned long baudrate = 0;
  unsigned char databits = 0;
  unsigned char stop_bits = 0;

  char parity_text[10];
  char flowctrl_text[4];

  const char xformat[] = "%lu,%hhu,%hhu,%[^,],%[^,]\n";
  const char xtext[] = "115200,8,1,EVEN,NFC\n";
  int res = sscanf(xtext, xformat, &baudrate, &databits, &stop_bits, (char*) &parity_text, (char*) &flowctrl_text);

  printf("Res: %d\r\n", res);
  printf("baudrate: %lu, databits: %hhu, stop: %hhu,   \r\n", baudrate, databits, stop_bits);
  printf("parity: %s \r\n", parity_text);
  printf("flowctrl: %s \r\n", flowctrl_text);

它返回:

资源:5
波特率:115200,数据位:0,停止:1,
奇偶校验:
flowctrl:NFC

缺少数据位奇偶校验

实际上奇偶校验变量下的内存是'\0'VEN'\0',看起来第一个字符被sscanf过程以某种方式覆盖。

sscanf 的返回值为 5,这表明它能够解析输入。

我的配置:

  • gccarmoneeabi 7.2.1
  • 视觉工作室代码 1.43.2
  • PlatformIO 核心 4.3.1
  • PlatformIO 主页 3.1.1
  • 库 ST-STM 6.0.0 (Mbed 5.14.1)
  • STM32F446RE (Nucleo-F446RE)

我试过(没有成功):

  • 使用 mbed RTOS 编译且不使用
  • 变量类型 uint8_t, uint32_t
  • gccarm 版本:6.3.1、8.3.1、9.2.1
  • 使用另一个 IDE (CLion+PlatformIO)
  • 在另一台计算机上编译(相同的配置)

实际上有什么帮助:

  • 使变量静态
  • 在 Mbed 在线编译器中编译

sscanf 的行为总体上是非常不可预测的,混合变量的顺序或数据类型有时会有所帮助,但通常以输出中的另一个缺陷结束。

4

1 回答 1

0

这花了我比我愿意承认的时间更长的时间。但就像大多数问题一样,它最终变得非常简单。

  char parity_text[10];
  char flowctrl_text[4];

需要改为:

  char parity_text[10] = {0};
  char flowctrl_text[5] = {0};

flowctrl_text 数组在大小为 4 时不够大,无法容纳“EVEN”和 NULL 终止。如果你把它撞到 5 的大小,你应该没有问题。为了安全起见,我还将数组初始化为 0。

一旦我增加了大小,我现有的代码就有 0 个问题。让我知道这是否有帮助。

于 2020-03-27T19:31:47.280 回答