单片机学习小组
直播中

张健

7年用户 1388经验值
私信 关注

如何去实现两对SX1278模块的全双工通信呢

如何去实现两对SX1278模块的全双工通信呢?有哪些操作步骤?

回帖(1)

李万寿

2022-2-21 09:40:18
前言须知

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

    大四寒假制作毕业设计,考虑到通信距离问题,于是买了一对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方案上。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分