找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6086|回复: 17
打印 上一主题 下一主题
收起左侧

51单片机的串口乱码问题

  [复制链接]
跳转到指定楼层
楼主
从上位机发送一位数字到单片机,(例如发送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函数去接受串口送来的数据才行,可是这个函数该怎么使用呢,求教各位大神。

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:111634 发表于 2017-10-14 23:11 | 只看该作者
scanf函数不能接受串口送来的数据。keil c中的scanf和printf函数并非80C51串行口真正的I/O操作,而是C51编译器利用80C51串行口,通过C51库函数“Stdio.h”在PC机上输入/输出数据信息。
回复

使用道具 举报

板凳
ID:164363 发表于 2017-10-14 23:57 | 只看该作者
显示函数有问题
回复

使用道具 举报

地板
ID:239563 发表于 2017-10-15 09:05 | 只看该作者
先用串口助手调一下试试
回复

使用道具 举报

5#
ID:239244 发表于 2017-10-15 10:04 | 只看该作者
zl2168 发表于 2017-10-14 23:11
scanf函数不能接受串口送来的数据。keil c中的scanf和printf函数并非80C51串行口真正的I/O操作,而是C51编 ...

是吗,scanf和printf只能在和上位机通信的时候用吗。。。。
回复

使用道具 举报

6#
ID:111634 发表于 2017-10-15 19:01 | 只看该作者
Endover 发表于 2017-10-15 10:04
是吗,scanf和printf只能在和上位机通信的时候用吗。。。。

是的。scanf和printf函数在keil c中也能运行。
你可在keil c中运行该例程序,观测scanf和printf函数在keil c中的功能。



以上摘自张志良编著
80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学。
回复

使用道具 举报

7#
ID:221145 发表于 2017-10-15 22:22 | 只看该作者
首先确认MCU收到了正确的数据,然后确认1602显示驱动程序是正常的;scanf函数可以百度一下;
回复

使用道具 举报

8#
ID:123289 发表于 2017-10-16 00:05 | 只看该作者
很简单,显示是由点阵或段构成的,它不懂12345……,只知道什么地方亮,什么地方暗。你让它显示1,送1给它无用,要送1所对应的点阵才行。
回复

使用道具 举报

9#
ID:219796 发表于 2017-10-16 01:46 来自手机 | 只看该作者
加减48试试
回复

使用道具 举报

10#
ID:239880 发表于 2017-10-16 13:20 | 只看该作者
波特率没设置对吧
回复

使用道具 举报

11#
ID:239244 发表于 2017-10-16 15:36 | 只看该作者

试过了,不行。。。。
回复

使用道具 举报

12#
ID:239244 发表于 2017-10-16 15:37 | 只看该作者
hello1314 发表于 2017-10-16 13:20
波特率没设置对吧

波特率没问题啊
回复

使用道具 举报

13#
ID:151348 发表于 2017-10-16 16:37 | 只看该作者
乱码的原因有很多,把程序贴上来看看
回复

使用道具 举报

14#
ID:47286 发表于 2017-10-16 17:22 | 只看该作者
1602不能直接显示HEX吧 要转换成DEC然后一位一位显示吧
回复

使用道具 举报

15#
ID:239991 发表于 2017-10-16 17:53 | 只看该作者
波特率是否正常
回复

使用道具 举报

16#
ID:228543 发表于 2017-10-16 18:06 | 只看该作者
是不是波特率设置不对啊
回复

使用道具 举报

17#
ID:79358 发表于 2017-10-17 11:38 | 只看该作者
接收到的是字符串,在1602上显示ASCII码 显示函数后面加个0X48 试试
回复

使用道具 举报

18#
ID:240256 发表于 2017-10-17 15:24 | 只看该作者
单片机从上位机接收到的数据是ASCII码格式(你发送8则对应的ASCII吗值为56),你将该数据保存在变量a,通过dat[a]获取对应的数据,此时,索引越界了,所以是乱码。在writedate(dat[a]);  语句前面添加一条 a = a - '0';语句就不会有乱码现象了。祝你学习愉快,谢谢。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表