使用普通GPIO模拟串口,解决串口不够用的问题

串口在我们日常的开发中不可或缺,但是有的板子的板载资源有限,如stm32f1c8t6只有三个串口,如果你想要留下一个串口打印调试信息的话,你仅仅只剩下了两个串口可以用于模块的驱动,这在很多时候是明显不够用的。下面,我将介绍如何使用普通的GPIO按照串口通信的协议来模拟一个硬件串口,可以使用它来驱动模块。

一,通信双方波特率为什么要统一。

串口不像其它的一些协议,有自己的数据线(SDA)与时钟线(CLK),通信双方可以按照时钟线上升或下降的不同状态来进行数据的收发。串口的通信全靠内部的一个波特率发生器来指挥数据的运输。这里可能会有人有疑问:为什么不在接收方的接收寄存器接收到八位数据(寄存器满)就直接中断呢,一旦我收到了八位数据我直接中断就好了啊,这样不就可以不用统一波特率了吗。试想一种情况:发送方发送的速度是接收方的接收速度的八倍(发送方1秒发送1个bit,接受方8秒接收一个bit并将接收寄存器移动一位)。开始通信8秒后,此时发送方已经将8bit数据发送完了,但是,接收方仅仅只读出数据了1bit数据并移入了接收寄存器,但是你会发现,也就是说,接收方并不能够正确接收这段时间内发送方发送的数据。还有一种情况是接收方的波特率大于发送方,你们可以按照上面的方法去推导会发生什么错误(速度同样是八倍的情况下,发送方仅仅发送了1bit,接收方接收了8bit,发送了一个bit位1,接收会认为是1111 1111 (0xFF))。所以出现0xFF,0x00,或其它乱码情况,极有可能是波特率(其它协议可以叫收发速率)不匹配导致的。

二,如何使用普通GPIO模拟串口,并正常通信

串口协议,一般我们使用的是10位的帧进行通信(1位起始位,8位数据位,1位停止位),一般不带校验位。

起始位:发送的数据线的电平由高到低

数据位:采用移位的方式逐位发送,这里特别注意串口协议是低位先发送的

停止位:发送的数据线的电平由低到高

以9600波特率为例,1秒发送9600个位,约104us发送一个bit位。

那么,实现代码下:

串口助手配置及运行结果如下 

可以看到,串口助手成功与单片机进行通信,使用普通GPIO模拟串口成功!!! 

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值