参考链接
1、使用GPIO来模拟UART
2、STM32之IO模拟串口篇
1、工作原理
单片机IO口模拟串口的实现原理通常是通过软件来模拟串行通信的传输和接收。下面说明了单片机IO口模拟串口的实现原理:
配置IO口:选择两个IO口作为模拟串口的发送和接收引脚。通常使用的是GPIO引脚。
设置通信参数:设置波特率、数据位、停止位和校验位等串口通信参数。
发送数据:通过控制发送引脚的电平变化来模拟串口数据的传输。根据通信参数,将要发送的数据进行位的切换操作,逐位通过发送引脚发送出去。
接收数据:通过读取接收引脚的电平变化来模拟串口数据的接收。根据通信参数,读取接收引脚的电平状态,逐位组装接收到的数据。
确保同步:为了确保发送和接收的同步性,可以在发送和接收的开头和结尾添加起始位和停止位。发送时在数据的起始位置输出一个低电平的起始位,接收时检测到低电平的起始位后开始接收数据,接收完毕后检测到高电平的停止位表示接收完成。
单片机IO口模拟串口的实现原理相对简单,但通信速率可能受到单片机性能和IO口速度的限制,因此在高速通信或实时性要求较高的场景下,可能需要选择硬件串口或其他更高级的通信方式。
2、UART协议:
空闲位:当uart处于空闲状态(线路没有数据传输)时,TX、RX线都处于高电平状态(逻辑“1”),一般需要把相应IO口配置为上拉。
起始位:由高电平跳变为低电平,且持续一个位宽度,表示触发起始信号。
数据位:数据位可以5、6、7或8位,从最低位开始一位接着一位的传送。
校验位:有奇、偶或无校验。
奇校验:数据位+校验位的“1”的位数总和为奇数;
偶校验:数据位+校验位的“1”的位数总和为偶数;
1
2
例如:奇校验中,数据位“1”的位数为偶数个,则此时校验位为“1”。
无校验:顾名思义就是没有校验位,数据位后面接停止位。(通常配置为无校验。)
停止位:将数据线拉为高电平,可以设置停止位宽度为1位、1.5位或者2位。
波特率:在串口中波特率为每秒传送的bit数;通信双方必须设置相同的波特率,否则接收的数据为乱码。波特率9600时,传输1bit所需时间为(1/9600)us,大约为104us。