【全文大纲】 : https://blog.youkuaiyun.com/Engineer_LU/article/details/135149485
1 . 概要
1 . 作为嵌入式玩家,串口是必备的技能
2 . 串口之所以称之为串口,是因为数据串行传输,这篇文章详述异步串口
3 . 接下来从物理层,协议层,应用层,从下往上深入浅出剖析
2 . 物理层
- 无图无真相,直接上图,如图所示,结构及其简洁,双方共地情况下,TX,RX互联,TX发送,RX接收,需要注意双方的电平识别“0”,“1”的阈值电压,若一方5V供电,另一方3.3V供电,此时需要加电平转换电路
3 . 协议层
- 无论任何协议,直接看通信波形分析直截了当,如图所示,数据量一共由三个部分组成,起始位,数据位,停止位。最后就是波特率,常用波特率9600,115200,若设9600,则一秒内传输9600个位,则一个位的持续时长为104.16us
- 起始位:串口常态为高电平,第一个下降沿后的电平为起始位
- 数据位:高电平则为1,低电平则为0,一般8个数据位组成一个字节,个别场合选择9个数据位,第9个数据位为基偶校验位
- 停止位:当传输完数据位后,最后一个位就是停止位,状态为高电平
4 . 应用层
- 芯片自带串口 : 当物理层,协议层都明确后,就可以把数据交给应用层,一般来说芯片外设都自带了串口,因此,软件中配置好串口寄存器,就可以进行收发了,这里建议一种异步轮询方式进行串口通信,即发送数据后,在发送中断轮询下一个字节,莫要在后台循环等待发送完成,我个人框架从时间上考虑向往无阻塞运行。
- 普通IO模拟 : 有时候串口数量过多,芯片无额外资源时,可尝试此方案,不过这个方案比较考验芯片以及个人对时序上的把控,对于发送,只需卡好预设波特率时长轮询发送,主要难点在于接收,这里分享一个接收思路,把接收口设为外部中断口,若持续一段时间高电平,触发了下降沿,则串口进行接收,并启动定时中断根据波特率设置中断间隔轮询接收,轮询次数完毕停止往复循环,虽然这里提供了方案,但还是能不用则不用,此方案远不如硬件串口可靠。
- 应用层主要再次制定用户通信协议,一般通信的组成部分由帧头,数据长度,数据内容,校验码组成,根据此结构制定的通信协议一般比较可靠且简洁,因此行业内多数采用此结构
5 . 小结
个人风格秉承深入浅出,简洁风格描述,谢谢观看。
技术交流QQ群 : 745662457
群内专注 - 问题答疑,项目外包,技术研究
图片资源本人在网上下载,若有侵权行为,请告知,本人会立刻删除