使用 HAL_UART_Transmit 发送 null
Posted
技术标签:
【中文标题】使用 HAL_UART_Transmit 发送 null【英文标题】:sending null with HAL_UART_Transmit 【发布时间】: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
。
【参考方案1】:
感谢codo,我发现我走错了路。使用 AT+COMMAND 发布可能包含 NULL 字符的代码的最佳方法是使用 AT+MQTTPUBRAW。这是我的代码:
sprintf(PubTopic, "AT+MQTTPUBRAW=0,\"Data/%s\",%d,0,0", SerialNumber, DataLength);
StrPrintln(&huart1, PubTopic);
HAL_Delay(50);
/*
* SendCommand is a uint8_t variable that contains commands
* that need to be published
*/
HAL_UART_Transmit(&huart1, SendCommand, DataLength, 10);
【讨论】:
以上是关于使用 HAL_UART_Transmit 发送 null的主要内容,如果未能解决你的问题,请参考以下文章
STM32 MX Cube生成的工程中 使用printf向Uart发送数据