蓝桥杯嵌入式--串口收发数据异常的解决
创始人
2025-06-01 06:07:30
0

前言

最近在做题的时候遇到了一个问题,就是单片机与上位机之间的通信出现问题。例如我发送这样一个数组Data:{1,2,3,4},即使用:

HAL_UART_Transmit(&huart1,Data,4,500);

但是上位机并没有收到1,2,3,4这四个数字,而是收到了乱码。同理我使用上位机软件给下位机发送数据时,例如发送:1234,单片机中使用:

HAL_UART_Recieve_IT(&huart1,R_Data,4);

进行接收,我们可以发现收到的数据并不是我们预想当中的1,2,3,4;这究竟是什么原因呢?

原因

造成这样的结果在于上位机给我们发送的是ASCII码,并且上位机接收显示的也是ASCII码,而不是数值大小。

总所周知,ASCII码是由八位二进制小数进行一映射的,从0-127的数字分别对应了不同字符:

也就是说,我们给上位机发 “1”,上位机实际接收到的是0000_0001(B),对应ASCII为SOH(SOH(start of headline) 标题开始),因此上位机并不显示1,而是显示SOH,要想上位机显示1,应该给它发送49(u8)才对。

同理,上位机发送“1“,我们实际接收到的为49(u8),因此应该减去48才为我们需要得到的数字1。

在单片机中,我们的数字一律是实际的数值,我们定义变量时,定义为u8,u6,就是代表无符号的整数,单片机串口发送也是发送这些数值。

而在上位机中,则是发ASCII码,显示ASCII码。

解决办法

即所有发送的数字数据都+48,接收的数据都-48即可。对于字母来说,单片机和上位机都是使用ASCII码表征,因此不需要切换。

值得注意的是,使用单引号这个技巧:

‘A’,‘1’,‘2’

我们如果把发送的数据改成:

uint8_t Data[10]={'1','2','3','4'};

那么这样上位机就可以完美接收到1234。

单引号代表取这个符号的ASCII值,因此比较字符串,可以使用Data[x]=='A',这样的操作进行比较。

相关内容

热门资讯

一款9分甜脆的超大新品蓝莓,为... 导语:京东七鲜超市石家庄首店开业近半个月后,当地的消费者仍热情不减地排着购物长队,尤其在一个货架前,...
黄金投资全景指南 作者:烟雨导语:对普通投资者而言,黄金投资品类繁杂,从实物黄金到黄金ETF再到黄金期货交易,风险与门...
亮剑了,震撼台海军演,三大意外... 作者 | 子期智谷趋势出品 | ID:zgtrend这么近那么美,随时到台北?没想到2025年的最后...
东杰智能:终止筹划重大资产重组... 新京报贝壳财经讯 12月30日,东杰智能发布公告称,公司决定终止筹划发行股份及支付现金购买遨博(北京...
A股再现“天价离婚案”:时创能... A股再现“天价离婚”。12月30日,时创能源(688429.SH,常州时创能源股份有限公司)公告称,...
又遇质量风波 同仁堂蜕变在路上... 独立 稀缺 穿透烈火出真金,越挫越勇真英雄!作者:陈晨编辑:楚逸风品:张戈来源:铑财——铑财研究院以...
首发丨募资17.6亿,年末一只... 许久未见这么漂亮的人民币基金募资了。近日,来自深圳的华业天成宣布五期基金完成终关,总规模定格在17....
国家出手,教育“反内卷”越来越... 作者 | 王战新智谷趋势出品 | ID:zgtrend国家出手,教育“反内卷”越来越严、越来越细了。...
近4个月涨超718%!天普股份... 尽管AI芯片公司中昊芯英(杭州)科技有限公司(简称“中昊芯英”)多次否认“借道”天普股份(60525...
储能与新能源汽车需求持续拉动 ... 12月26日,碳酸锂主力合约强势站上13万/吨关口,创下2023年11月以来的新高。其年内累计涨幅超...