【发布时间】:2021-11-05 20:48:59
【问题描述】:
我在 Keil IDE 中为 STM32103F 使用 HAL 驱动程序。我需要将代码传输到通过串口连接到我的 STM32 的 ESP。此代码使 ESP 将命令 (CMD2) 中的任何内容发布到我正在使用的代理,但是当命令 (CMD2) 包含 0x00 (NULL) 时会出现问题,因此 ESP 不会向代理发布任何内容。这是我正在使用的代码:
char Appendix[8] = "\",0,0\r\n";
// DataLength = the length of the data stored in CMD2
// CMD2 might contain 0x00 in it
for(int i = 0; i < 7; i++) CMD2[DataLength+i] = Appendix[i];
CMD2[DataLength+7] = 0x00;
sprintf(PubTopic, "AT+MQTTPUB=0,\"Data/%s\",\"", SerialNumber);
SizeOfPub = strlen(PubTopic);
for(int i = SizeOfPub; i < SizeOfPub+DataLength+8; i++) PubTopic[i] = CMD2[i-SizeOfPub];
HAL_UART_Transmit(huart, (uint8_t *) PubTopic, SizeOfPub+DataLength+7, 10);
当我的命令 (CMD2) 包含 0x00 (NULL) 时,ESP 无法正确执行到最后一行,但是当命令 (CMD2) 中没有 0x00 (NULL) 时,此代码可以正常工作。例如:
1)CMD2 = 0x45 0x55 0x53
2)CMD2 = 0x45 0x00 0x53
在第一种情况下,代码没有问题,但在第二种情况下,ESP没有发布任何东西。
【问题讨论】:
-
AT+MQTTPUB无法传输二进制数据(例如空值)。而sprintf也无法处理二进制数据。请查看AT+MQTTPUBRAW。 -
我在将
CMD2添加到PubTopic时没有使用sprintf,因为它无法处理二进制数据。我会检查AT+MQTTPUBRAW并更新这个问题。非常感谢。 -
你是对的。您可以使用
sprintf。
标签: stm32 esp8266 at-command keil messagebroker