找回密码
 立即注册

QQ登录

只需一步,快速开始

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

串口通信踩坑指南

[复制链接]
跳转到指定楼层
楼主
今天在研究串口调试的时候发现了一个极其吊诡的现象。
单片机从下位机发送字符“A”(二进制 01000001)给上位机,但上位机始终受到的是“”(二进制00000101)


于是乎我打开示波器,但发现其波形与理论上的波形没有任何区别。




发送的 01000001 为何会变成 00000101。经过分析后大概知道了其中的缘故。


由于停止位和下一个起始位离得太近。如果上位机非常不巧地把数据位当成了起始位,那么所有的数据就完全错位了,就像图中那样。
所以建议发送每个字节之间加上一点延时。防止这种极端的情况发生

评分

参与人数 1黑币 +40 收起 理由
admin + 40 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:365802 发表于 2021-1-6 15:41 | 只看该作者
嗯, 是不是把停止位設置長一點會有改善.

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:874380 发表于 2021-1-6 17:22 | 只看该作者
如果用软件模拟的串口,发生这种情况的概率会不小,如果是硬件模块发送出现这种情况建议换器件,带缓冲的发送器会在发送移位寄存器为空时自动把缓冲器内的数据装入移位寄存器,接收反之。接收一般会在检测到起始位的中点(由波特率算出)对RX引脚进行采样,由于波特率的误差累计,数据帧越长,采样点就会前后移动,偏离数据位中心。一般的经验是:波特率理论误差0.2%以内,加上振荡器误差2%(内部、最大),则数据帧长度不超过128位,这样粗略计算在接收最后一位时采样点偏移不超过30%,相对安全

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:224104 发表于 2021-1-6 21:32 | 只看该作者
ping264888 发表于 2021-1-6 15:41
嗯, 是不是把停止位設置長一點會有改善.

嗯嗯,差不多是这么个道理
回复

使用道具 举报

5#
ID:224104 发表于 2021-1-6 21:42 | 只看该作者
qq863 发表于 2021-1-6 17:22
如果用软件模拟的串口,发生这种情况的概率会不小,如果是硬件模块发送出现这种情况建议换器件,带缓冲的发 ...

其实硬件串口也没有那么糟糕,而且只要主频足够高,波特率误差就可以足够小。

核心问题还是上位机采样时机晚了、或者说单片机太"着急"了,我觉得串口有必要遵循一定的逻辑步骤。例如,在程序里加一步"按钮触发",单片机启动后先不发字符,然后上位机打开串口等待接收,单片机按下按键触发中断开始发送字符。这样其实可以不需要每次发送字符都要延时,也可以非常完美地传输数据。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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