[经验分享] IO模拟串口原理

[复制链接]
3455|27
sanfuzi 发表于 2025-8-23 16:14 | 显示全部楼层 |阅读模式

大部分的通信方式都是通过电平传递信号,高电平表示1,低电平表示0,制定通信电平01的时间和空间规则,通信双方就可以根据对应的规则进行解析数据,从而进行信息的传递,下面作者简单把串口通信的物理通信格式跟大家板书一下,以便后面模拟串口进行参考。

通信物理格式

下面作者以8个数据位,1个停止位,无奇偶校验位为例:



分析一下:

上图就是一帧简单的串口数据帧,总线处于空闲的时候处于高电平,通过一个起始位,作为一帧数据的开始,然后以LSB->MSB的方式依次传输一个8位的数据,最后以1bit的停止位结束,这样就结束了一个byte数据的传输。

那么但我们发送N个数据,总线上就会有N个这样的数据帧传输,这样就形成了大家平常所谓的"字节流",在一个总线上所有的bit所维持的电平时间是固定的,这个时间的由波特率来决定,比如9600bit/s,也就是说其一个电平维持的为(1/9600)s。那个这个参数就也成了模拟串口信号的基础时间约束。

值得大家注意的是串口通信的数据帧格式并不是全是(8个数据位,1个停止位,无奇偶校验位)同样的格式,其中数据位个数也有7,8,9个,停止位也有2个的,这个具体根据双方协议格式来进行选择,同时通信还有同步、异步,全双工和半双工等等,大家不太理解可以找时间补补。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
louliana 发表于 2025-9-8 10:20 | 显示全部楼层
模拟串口的时序依赖定时器的定时精度,波特率误差需≤3%
eefas 发表于 2025-9-8 10:55 | 显示全部楼层
为了确保发送和接收的同步性,可以在发送和接收的开头和结尾添加起始位和停止位。发送时在数据的起始位置输出一个低电平的起始位,接收时检测到低电平的起始位后开始接收数据,接收完毕后检测到高电平的停止位表示接收完成。
earlmax 发表于 2025-9-8 14:54 | 显示全部楼层
高频时CPU无法及时响应              
pmp 发表于 2025-9-8 20:39 | 显示全部楼层
        添加软件去抖动              
primojones 发表于 2025-9-9 13:46 | 显示全部楼层
发送(TX):软件按位设置GPIO输出电平,依次输出起始位、数据位、停止位。
接收(RX):软件定时检测GPIO输入电平,识别起始位后,按位采样数据位和停止位。
timfordlare 发表于 2025-9-9 21:06 | 显示全部楼层
采用“起始位+数据位+校验位(可选)+停止位”的帧格式,起始位触发接收,停止位标志结束
adolphcocker 发表于 2025-9-10 10:38 | 显示全部楼层
每位数据的持续时间由波特率决定。可通过两种方式实现:①基于软件延时函数;②基于定时器中断。
belindagraham 发表于 2025-9-10 13:22 | 显示全部楼层
启用外部中断或定时器轮询检测起始位。
belindagraham 发表于 2025-9-13 11:07 | 显示全部楼层
波特率决定了每秒传输的位数。通信双方必须设置相同的波特率,否则接收的数据会是乱码。
phoenixwhite 发表于 2025-9-13 16:57 | 显示全部楼层
使用硬件定时器(如TIM)生成精确中断,替代软件延时循环。
yorkbarney 发表于 2025-9-13 19:17 | 显示全部楼层
需通过软件循环或定时器中断实现时序控制
wengh2016 发表于 2025-9-13 19:49 | 显示全部楼层
接收的定时器中断优先级需高于其他非关键中断,避免采样时机被打乱。
uytyu 发表于 2025-9-14 07:37 | 显示全部楼层
在单片机中用软件实现串口模拟,需重点处理时序精度和中断冲突问题
maudlu 发表于 2025-9-14 09:02 | 显示全部楼层
通过精确延时(定时器中断或软件循环)生成每位电平的持续时间。
i1mcu 发表于 2025-9-14 10:30 | 显示全部楼层
发送端通过一个 GPIO 引脚(配置为输出),按照串口协议的时序输出高低电平,步骤如下:

起始位:先输出 1 个低电平(逻辑 0),持续时间为1/波特率(如 9600 波特率时,每个比特持续约 104μs),告知接收端开始传输。
数据位:紧接着输出 8 位(或 7 位)数据,从最低位(LSB)到最高位(MSB) 依次发送,每个比特的高低电平对应逻辑 0 或 1,每位持续时间同波特率周期。
校验位(可选):根据约定(奇校验 / 偶校验 / 无校验),输出 1 位校验位(确保数据位中 1 的个数为奇数或偶数)。
停止位:最后输出 1 位或 1.5 位或 2 位高电平(逻辑 1),表示一帧数据结束。
kkzz 发表于 2025-9-14 13:20 | 显示全部楼层
采用异步串行通信方式              
everyrobin 发表于 2025-9-14 14:00 | 显示全部楼层
单片机IO口模拟串口是通过软件控制GPIO引脚的电平变化,模拟串行通信
robertesth 发表于 2025-9-14 15:13 | 显示全部楼层
遵循 “起始位→数据位→停止位” 的顺序构造一帧数据。其中起始位为低电平,用于通知接收方开始数据传输;数据位按照低位在前的顺序依次传输;停止位为高电平,标识当前帧结束
wwppd 发表于 2025-9-14 15:49 | 显示全部楼层
在检测到起始位后,启动定时器或延时函数,按照波特率的时间间隔对RXD引脚进行采样。采样点通常选择在每位时间的中间时刻,以提高抗干扰能力
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

3389

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部