GPIO模拟串口TX与RX,波特率115200

串口协议的简单介绍:

UART使用异步模式工作,不需要时钟信号,其一般格式为:起始位+数据位+校验位+停止位。其中起始位1位,数据位5~8位,校验位0或1位,停止位1、1.5或2位。不过最常用的格式是1位起始位、8位数据位、没有奇偶校验、1位停止位,简记为8/N/1。

波特率:

串口异步通讯中由于没有时钟信号,所以通讯双方需要约定好波特率,即每个码元的长度,以便对信号进行解码。常见的波特率有4800、9600、115200等。比如:115200,表达的意思为每秒传输115200比特数据。

起始位、停止位:

数据包从起始位开始,到停止位结束。起始信号用逻辑0的数据位表示,停止信号由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。

数据校验:

由于在通讯过程中易受到外部干扰导致传输数据出现偏差,所以在有效数据之后加上校验位解决。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)及无校验(noparity)。奇校验要求有效数据和校验位中“1”的个数为奇数,比如一个8位长的有效数据为:01101001,此时共有4个“1”,为达到奇校验效果,校验位为“1”,最后传输的是8位有效数据加1位校验位,共9位。
偶校验刚好相反,要求有效数据和校验位的“1”数量为偶数,则此时为达到偶校验效果,校验位为“0”。而0校验则无论有效数据中是什么数据内容,校验位总是为“0”,1校验校验位总是为“1”。

模拟串口:

使用单片机的GPIO口去模拟串口的TX与RX进行数据的发送和接收处理,里面主要需要关注的和使用的为:GPIO的初始化,时钟频率的设置,引脚中断的设置。

模拟串口的TX:

首先初始化对应的GPIO口。
然后以115200的波特率对数据进行发送。
首先按照串口数据的格式,将要发送的1字节数据以起始位加结束位的形式进行封装:
u8 byte = 0x01;
u8 bit[10] = {0};
bit[0] = 0;//起始位
bit[1] = (byte & 0x01)? tmp_bit1 : tmp_bit0;
bit[2] = ((byte>>1) & 0x01)? tmp_bit1 : tmp_bit0;
bit[3] = ((byte>>2) & 0x01)? tmp_bit1 : tmp_bit0;
bit[4] = ((byte>>3) & 0x01)? tmp_bit1 : tmp_bit0;
bit[5] = ((byte>>4) & 0x01)? tmp_bit1 : tmp_bit0;
bit[6] = ((byte>>5) & 0x01)? tmp_bit1 : tmp_bit0;
bit[7] = ((byte>>6) & 0x01)? tmp_bit1 : tmp_bit0;
bit[8] = ((byte>>7) & 0x01)? tmp_bit1 : tmp_bit0;
bit[9] = 1;//结束位
形成一个8:1:1的数据格式
然后就是将封装好的数据bit按照115200的时序写入到对应IO的寄存器上就可以完成一个字节数据的发送。其中15200的时序就是每8us的时间间隔发送1比特的数据。
对于时序的使用可以使用硬件定时器或者空指令(空指令指的是空运行一条语句,一般运行一条语句的时间为1/系统时钟频率,所以根据语句的时间可以间隔一个发送1位比特数据时间)。

模拟串口的RX:

首先初始化对应的GPIO口。
然后以115200的波特率对数据进行接收。
在接收数据时我们可以通过引脚的中断判断起始位数据。然后对数据位进行时序接收。
在接收数据时我们可以通过引脚的中断判断起始位数据。然后对数据位进行时序接收。
后面将接收到的bit位数据拼接为1个字节的数据。
for(unsigned char i = 0;i < 8;i++)
{
    Byte |= Bit[i] << i;
}
其中时序的判断依然是可以使用时钟频率使用空指令去间隔。如果在不能使用中断的情况下可以直接去监听当前引脚上的电平,来完成对起始位的判断。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

浮若于心

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

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

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

打赏作者

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

抵扣说明:

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

余额充值