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

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

现象

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

自己规定的数据帧格式为: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".

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

相关推荐
不悔哥1 天前
开源OV-Watch:怎么做一个智能手表
单片机·开源·嵌入式
XiHongShi20161 天前
STM32F407 RTC定时器例程,建议保存
stm32·单片机·学习
深圳老胡1 天前
STM32F407 控制 L6470 步进电机驱动 —— 控制过程简介
笔记·stm32·单片机·嵌入式硬件·代码规范
女神下凡1 天前
嵌入式设计的各种存储芯片的硬件/软件设计规范,非常全面。
arm开发·单片机·嵌入式硬件
梅梅9661 天前
一款mipi转lvds的lcd调试(LT8912B)
单片机·计算机外设·电脑·显示器·pd芯片
开发笔记-阿牛1 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
从零开始的嵌入式之旅1 天前
day47
arm开发·经验分享·笔记·嵌入式硬件
恒锐丰科技林技术员1 天前
EG1164 高压大电流升压同步整流芯片解析
经验分享·嵌入式硬件·硬件工程
一只小透明啊啊啊啊1 天前
Socket、AIDL、SOME/IP
c++·mcu
CHENKONG_CK1 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip