完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
前言须知
本文章假定读者已经熟悉单片机串口基本使用,若您对单片机串口开发还不熟悉,建议先快速学习如何使用单片机串口再来阅读本文章。本人开发水平有限,若有不足之处,欢迎提出。 发现问题 大四寒假制作毕业设计,考虑到通信距离问题,于是买了一对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方案上。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:29 , Processed in 1.204168 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号