使用 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发送数据

stm32-HAL库串口收发

Stm32L0串口中断接收使用

STM32-HAL库-UART学习

在 STM32CubeIDE 上打印(用 C 语言)到 IDE 控制台

重定向printf