【记录】一次51单片机串口乱码问题排查

【记录】一次51单片机串口乱码问题排查

项目场景

在51串口收发仿真实验中使用两个单片机互相通信,程序设定A上电1s后通过串口以16进制给B发送AA,直到B收到AA后回复BB,当A机确认收到AA后开始发送数据,若接受过程中出现错误,B给A发送FF,A确认收到后重新发送。


问题描述

前几天,老师发给我一份实验文件让我帮助排查一个问题,实验目的如项目场景介绍,但在Proteus中仿真遇到乱码问题。


原因分析

解压文件后,我将整个工程备份后直接打开Proteus仿真软件(这里我电脑上使用的是Proteus 8 )直接运行,观察现象如图:
在这里插入图片描述

可见,串口监视器接收到的数据,明显发生偏差,出现乱码。停止仿真后,检查各元件配置,因为程序设定通信数据为16进制,串口通信波特率为9600,监视器数据模式对应设置为16进制如图:
在这里插入图片描述

确定保存配置参数,重新点击运行按钮,问题发生变化。即,原来乱码不变为数据简介乱码,发现A循环发送的数据不管是否正确,如图监视器显示为16进制了:
在这里插入图片描述

此时尚未检查程序,于是打开keil 编辑器,检查程序,在大体上并未发现什么明显问题,但发现串口波特率配置是12MHz晶振模式下的9600。于是返回仿真软件,点开单片机配置界面,发现晶振配置也是12MHz,如此一来似乎并没有什么逻辑上的错误。陷入一阵沉思,想了想是不是老师也是看到这里才问我的呢?

顿悟: 正当我起身伸懒腰的时候,想到了STC ISP这个软件,因为恰好在老师发来文件的前一刻,正好在他们官网看有没有什么新品,于是想到使用它生成串口配置程序,在重写一个完成任务。
但是,当我选好参数,12MHz 、9600、8为数据,选用定时器1做波特率发生器,点击生成C代码后,看到了误差百分数,,,,,顿感不妙。
果然,当我将程序编译添加到仿真后,串口监视器打印不稳定。到这前面的问题也就算是解决了,只需要稍作修改。


解决方案

将A、B两个单片机晶振频率改为11.0592,因为这个频率是最常用的,用它来产生的串口波特率误差较小。
在这里插入图片描述
知道了,原因,返回程序将串口配置一改,然后将仿真单片机晶振改为11.0592即可:
在这里插入图片描述
改完后,添加修改后的程序,重新进行仿真,结果如下,问题解决。

在这里插入图片描述


结语

我们在使用各单片机的时候总会遇到问题,无论是学习还是做项目的过程其实都是在不断积累经验,不断成长,有时候可能就是一个和很简单或很小的问题,但如果你没有意识到或者自认为没有问题,就像一开始排查,检查程序的仿真软件配置都没有问题,最后却是因为误差。。。
最后,欢迎留言交流。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Guard_Byte

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值