单片机学习小组
登录
直播中
张健
7年用户
1388经验值
私信
关注
如何去实现两对SX1278模块的全双工通信呢
开启该帖子的消息推送
串口通信
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方案上。
前言须知
本文章假定读者已经熟悉单片机串口基本使用,若您对单片机串口开发还不熟悉,建议先快速学习如何使用单片机串口再来阅读本文章。本人开发水平有限,若有不足之处,欢迎提出。
发现问题
大四寒假制作毕业设计,考虑到通信距离问题,于是买了一对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方案上。
举报
更多回帖
rotate(-90deg);
回复
相关问答
串口通信
sx1278
全双工通信
怎样
去
移植
SX1278
模块
的LoRa功能
呢
2022-02-21
1273
sx1278
2016-04-26
5853
Lora
sx1278
是怎样利用串口协议
去
实现
数据传输的
呢
2022-02-21
1841
sx1278
编程问题,求解。
2015-04-07
8029
无线收发器芯片
SX
1268与
SX1278
、
SX
1276的区别是什么?
2021-04-19
2462
433无线
模块
除了
SX1278
外,用哪款
模块
比较好?
2017-09-01
5616
两
个
SX1278
串口
模块
之间是怎样进行通讯的
2022-02-21
1774
求一种基于
SX1278
的DEMO代码
2021-06-29
1364
sx1278
驱动移植时报错怎么办?如何解决
2022-02-21
1424
请问
SX1278
在STM32F103驱动中如何
实现
收发数据功能?
2021-12-14
3070
发帖
登录/注册
20万+
工程师都在用,
免费
PCB检查工具
无需安装、支持浏览器和手机在线查看、实时共享
查看
点击登录
登录更多精彩功能!
首页
论坛版块
小组
免费开发板试用
ebook
直播
搜索
登录
×
20
完善资料,
赚取积分