关于单片机与上位机串口通信的问题

记录最近在开发上位机软件时出现了一些问题以及原因和解决过程

现象

在使用串口进行通信时,能够使上位机在文本框内打印出字符,但读取不到发送的数据。

自己规定的数据帧格式为:[12 58 00 00 00 00 68]即帧头占两个字节,帧尾占两个字节,中间有四个字节的数据。上位机在接收数据时根据这个格式检验帧头和帧尾就能在一堆信息中识别出哪些是数据信息,并把这四字节数据保存到缓存数组(若没有识别到帧头和帧尾,或识别到帧头后,隔固定字节后没有收到帧尾,则缓存清零)。

然而在调试过程中发现上位机文本框能够打印出来接收到的信息,但无法收到数据帧的数据(文本框内能够打印出来数据帧),现象是不管发送什么数据,接收缓存的数据都是0。

解决过程

后来通过让上位机吧接受到的字节全都输出显示,发现很多"49","50"这种数。然后发现49是字符"1"对应的ASCII码,50是字符"2"对应的ASCII码。然后在接收到的字节中也发现了"5""8"和"6""8"对应的ASCII。由于上位机的程序里面对数据帧进行校验,只有正确的帧头和帧尾中间的数据才会被存入缓存数组进行进一步处理,若格式错误则不会被写入缓存数组,或将缓存清零。这也就是出现上述现象的原因。

我发现我为了图省事,把单片机的printf映射到USART0,并将USART0接到电脑进行打印数据,这样是为了方便调试和打印日志信息。但是如果用printf来发送数据,例如:

cpp 复制代码
u8 a = 12;//定义八位二进制数a=12,及对应16进制数"0x0C"
printf("%d",a);

本来这样串口能够发送数字"12",但实际上发送的是字符"1"和"2".

老老实实改为用串口发送函数来发送就好了。

相关推荐
WangLanguager1 小时前
foc最终要求的是相电压,还是线电压
单片机
LCG元1 小时前
基于STM32CubeMX的HAL库串口通信与DMA传输深度优化
stm32·单片机·嵌入式硬件
嵌入小生0072 小时前
硬件 --- GPIO/中断/定时器/蜂鸣器
单片机·嵌入式硬件·定时器·pwm·gpio·蜂鸣器·中断
forAllforMe2 小时前
LAN9252 从机模式寄存器的配置代码示例
stm32·单片机·嵌入式硬件
不想起床&2 小时前
51单片机
单片机·嵌入式硬件·51单片机
我在人间贩卖青春2 小时前
单片机复位源
单片机·嵌入式硬件·复位源
项目題供诗2 小时前
51单片机入门-温度传感器DS18B20(十三)
单片机·嵌入式硬件·51单片机
莎士比亚的文学花园3 小时前
硬件通信——UART串行口
单片机·嵌入式硬件
guygg883 小时前
基于STM32的贪吃蛇游戏实现(OLED屏)
stm32·嵌入式硬件·游戏
BackCatK Chen4 小时前
STM32保姆级入门教程|第4章:GPIO输入+外部中断 实现按键控制LED(手把手全流程)
stm32·单片机·外部中断·按键控制 led·stm32cubeid·gpio 输入