RS232接收十六进制值异常求助:PC与STM32通信收值不符
问题分析与解决方法
核心原因
你遇到的问题是PC串口工具的控制字符转义功能导致的:0x01(ASCII SOH控制字符)、0x03(ASCII ETX控制字符)这类不可见的控制字符,被串口工具自动替换成了0x7F、0x7E这类可见ASCII字符发送,而STM32是直接接收原始字节,所以出现接收值错误。两台PC通信正常是因为双方工具都做了相同转义,所以能匹配。
易懂的解决步骤
1. 关闭串口工具的控制字符转义功能
打开你使用的PC串口工具(比如串口助手、Putty、SecureCRT等),找到以下类似选项并关闭:
- “控制字符转义”
- “ASCII控制字符替换”
- “不可见字符转换”
- 部分工具会标注“Send raw bytes”(发送原始字节),请勾选该选项
2. 切换到十六进制发送模式
确保发送时直接发送原始十六进制值,而非ASCII字符:
- 在串口工具中选择“十六进制发送”模式
- 输入
01对应0x01、03对应0x03,不要输入字符'1'或'3'
3. 调整STM32的接收参数
使用HAL_UART_Receive时,注意接收字节数要和发送的字节数匹配:
如果只发送1个字节比如0x01,应将第三个参数设为1,避免等待超时引发异常:
HAL_UART_Receive(&huart3, receiveData, 1, 100);
4. 验证通信正确性
- PC端发送十六进制
01,在STM32端打印receiveData[0],确认是否为0x01 - 发送
03,确认接收值为0x03
内容的提问来源于stack exchange,提问作者Wee How Woon
相关产品推荐
相关产品推荐

