半双工通信模块碰撞问题

前言须知

    本文章假定读者已经熟悉单片机串口基本使用,若您对单片机串口开发还不熟悉,建议先快速学习如何使用单片机串口再来阅读本文章。本人开发水平有限,若有不足之处,欢迎提出。

发现问题

    大四寒假制作毕业设计,考虑到通信距离问题,于是买了一对sx1278模块(正点原子的),等读了相关的文档后才发现这种模块只能做半双工通信,也就是说,如果A、B两个模块同时发送数据那就会发生碰撞,导致双方都不能正确接收数据。那该怎么解决碰撞问题呢?如下有两种方案。

A方案:两对SX1278模块,实现全双工通信

这是我最先想到的方案,如下图:
在这里插入图片描述
    A1—>A2以及B1<—B2,这两条线路都是单工通信,合起来便成了全双工通信。已知STM32至少都有三个串口,两个用于SX1278的数据收发。
    这时又出现了新的问题。STM32要和两个串口模块通信(如同时与A1和B1通信),多个串口同时运作有冲突的可能。比如,串口2在收数据时,又有串口3发数据的需求。这时我的做法是让串口2使用DMA传输,让串口3使用中断方式来传输(反正大部分时候DMA传输是不占用CPU的,只有在传输完毕或错误时才短暂地需要CPU)。
    通过两对半双工模块来解决通信碰撞,顺便连全双工通信都实现了,确实是个可行的方案,只是成本也跟着翻倍了。

B方案:环线列车法(自己瞎取的名字)

示意图如下:
在这里插入图片描述
简单地描述一次环线的流程:
    列车到达A站,若A有乘客(也就是想发的数据),则上列车,列车驶向B站。到达B站,有乘客则下车。同理,此时若B站有乘客上车,则搭上此次班车,接着列车从B站出发驶向A站,在A站下客。
因为列车始终是朝着一个方向行驶,所以不会出现列车迎面相撞的情况(也就是碰撞)
    如果乘客上下车的速度足够快(也就是单片机处理速度够快),则可以考虑在这条铁路上多放几辆列车,加快传输速率。
    这里要小心列车追尾(也就是这一趟数据还没有接收完,下一趟数据就到了,就是因为数据列车太多了)
    实现了数据列车后,碰撞问题就迎刃而解了。
    虽然成本是A方案的一半,但传输效率也打了一些折扣。

环线列车法的改进1

    坐地铁有这样的经历,无论有没有上下车的乘客,列车都会在站台上停一下再出发。如果数据列车也这么做呢?没错,便可实现心跳包机制。简单的说,就是即便没有想发的数据,也发一个空数据包给对方,以便通知对方这条线路没有断开。这样数据列车就不断地在AB两站间环线行驶了。

环线列车法的改进2

    可靠传输。这里我是理解了TCP的重传机制后想到的一种可靠传输的方法。给每个待发送的数据包都标上ID(空数据包除外),并且都暂存它们的副本。如果传输出错,则根据ID进行重传。
    我用的是STM32–f103–c8t6,很头疼,因为它的处理速度还是慢了点,数据校验用的还是校验和法,都还没用CRC校验呢,如果用STM32F4或F7或许可以考虑。
    重传机制和心跳包机制同样也可以用在A方案上。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值