打印
[电机应用]

51单片机的串口乱码问题

[复制链接]
2819|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
_gege|  楼主 | 2017-11-12 17:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从上位机发送一位数字到单片机,(例如发送8),使用  a=SBUF;去接收这个数字,此后在将a送给1602显示发现是乱码,
unsigned char code dat[10]={'0','1','2','3','4','5','6','7','8','9'};     
                        writecom(0x80);                 
                        writedate(dat[a]);   //大致的显示部分
求问是什么原因,是否需要通过scanf函数去接受串口送来的数据才行,可是这个函数该怎么使用呢,求教各位大神。
沙发
Mozarts| | 2017-11-12 17:19 | 只看该作者
scanf函数不能接受串口送来的数据。keil c中的scanf和printf函数并非80C51串行口真正的I/O操作,而是C51编译器利用80C51串行口,通过C51库函数“Stdio.h”在PC机上输入/输出数据信息。

使用特权

评论回复
板凳
Listate| | 2017-11-12 17:22 | 只看该作者
应该是显示函数有问题吧

使用特权

评论回复
地板
bbapple| | 2017-11-12 17:24 | 只看该作者
用串口助手调一下试试看

使用特权

评论回复
5
handleMessage| | 2017-11-12 17:25 | 只看该作者
Mozarts 发表于 2017-11-12 17:19
scanf函数不能接受串口送来的数据。keil c中的scanf和printf函数并非80C51串行口真正的I/O操作,而是C51编 ...

canf和printf只能在和上位机通信的时候用吗

使用特权

评论回复
6
zhouhuanの| | 2017-11-12 17:28 | 只看该作者
scanf和printf函数在keil c中也能运行。
你可在keil c中运行该例程序,观测scanf和printf函数在keil c中的功能。

使用特权

评论回复
7
wanglaojii| | 2017-11-12 17:29 | 只看该作者
首先确认MCU收到了正确的数据,然后确认1602显示驱动程序是正常的;scanf函数可以百度一下;

使用特权

评论回复
8
laozhongyi| | 2017-11-12 17:33 | 只看该作者
显示是由点阵或段构成的,它不懂12345……,只知道什么地方亮,什么地方暗。你让它显示1,送1给它无用,要送1所对应的点阵才行。

使用特权

评论回复
9
Edisons| | 2017-11-12 17:34 | 只看该作者
你的波特率没设置对吧

使用特权

评论回复
10
feiqi1| | 2017-11-12 17:36 | 只看该作者
乱码的原因有很多,把程序贴上来看看

使用特权

评论回复
11
androidbus| | 2017-11-12 17:37 | 只看该作者
1602不能直接显示HEX吧 要转换成DEC然后一位一位显示吧

使用特权

评论回复
12
litengg| | 2017-11-12 17:40 | 只看该作者
是不是波特率设置不对啊

使用特权

评论回复
13
qiangweii| | 2017-11-12 17:40 | 只看该作者
在1602上显示ASCII码 显示函数后面加个0X48 试试

使用特权

评论回复
14
shashaa| | 2017-11-12 17:42 | 只看该作者
单片机从上位机接收到的数据是ASCII码格式(你发送8则对应的ASCII吗值为56),你将该数据保存在变量a,通过dat[a]获取对应的数据,此时,索引越界了,所以是乱码。

使用特权

评论回复
15
sourceInsight| | 2017-11-12 17:43 | 只看该作者
在writedate(dat[a]);  语句前面添加一条 a = a - '0';语句就不会有乱码现象了。

使用特权

评论回复
16
caijie001| | 2017-11-12 19:11 | 只看该作者


  若你的串口是字符发送的话,你直接读取到的SBUF中的 “8” ,它不是数字的 “8”  那是字符型的东西,你不能直接这样子用 writedate(dat[a])
hex发送的话。好像a = a - '0'就行了

使用特权

评论回复
17
coody| | 2017-11-12 23:39 | 只看该作者
先别管显示,先将收到数据原样返回(至少20字节以上一个数据块),通过这个测试再说。

使用特权

评论回复
18
cjseng| | 2017-11-13 11:31 | 只看该作者
分两步:
1.收到上位机数据,原样返回,看看上位机收到的是什么;
2.直接让1602显示一个“8”,看看是什么

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

1357

帖子

1

粉丝