半双工通信模块碰撞问题_半双工碰撞_PYJTLK的博客-程序员秘密

技术标签: 串口通信  stm32  单片机  

前言须知

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

发现问题

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/PYJTRK/article/details/104090551

智能推荐

目标检测中多尺度:特征金字塔FPN_Feature Pyramid Networks for Object Detection_多尺度 特征金字塔_huangyiping_dream的博客-程序员秘密

原始内容来源于:https://blog.csdn.net/cdknight_happy/article/details/100528127https://blog.csdn.net/WZZ18191171661/article/details/79494534包含理解!参考文献:https://arxiv.org/abs/1612.03144代码实现:http://www.yueye....

学生信息管理系统Java版(信息自动生成)_zhen-yu的博客-程序员秘密

文章目录前言一、学生信息管理系统内容要求二、实现思路1.储存学生对象(集合)2.构造工具类3.实现控制台交互三、代码实现总结前言本案例作为对Java基础学习后的练习,掌握集合的使用方法,字符串的处理操作以及一系列循环开关语句的运用。在eclipse编译环境下实现,体会类的封装,方法的封装与调用,适合初学者学习和理解!提示:以下是本篇文章正文内容,下面案例可供参考一、学生信息管理系统内容要求存储学生对象实现增、删、改、查四个功能进行简单的封装实现交互信息示例:pandas 是基于Nu

JAVA死锁发现解除_Hello World程序员的博客-程序员秘密

死锁代码。解除 加wait notify即可package nowcode.test;public class DeadLock { public static void main(String[] args) throws InterruptedException { final DeadLock dd1 = new DeadLock(); final DeadLock dd2 = new DeadLock(); Thread t1 =.

使用 Python 给图片添加水印,其中一种还是隐形的盲水印呢!_python盲水印_Bill Chan的博客-程序员秘密

这里写目录标题一级目录二级目录三级目录一级目录二级目录三级目录

托盘图标、气泡以及任务栏崩溃后的自动添加——Shell_NotifyIcon_weixin_34026276的博客-程序员秘密

托盘图标使用函数Shell_NotifyIcon创建、修改和删除,参数主要使用NOTIFYICONDATA结构。任务栏启动时会给所有顶层窗口发送TaskbarCreated消息,由于不同系统消息标识不一样,所以需要使用RegisterWindowMessage向系统获取消息标识。程序在VS2015 Win32编译通过,XP SP3测试通过。Win10气泡无反应,或者我该用...

sql中的group by 用法解析_pl sql group by_opera321的博客-程序员秘密

转自:https://www.cnblogs.com/hui814101/p/5763685.html这是以前学习数据库查询时从网上找的资料,都保存到本地的word文档,现在也拿出来分享分享吧,是别人的。 -- Group By语句从英文的字面意义上理解就是“根据(by)一定的规则进行分组(Group)”。--它的作用是通过一定的规则将一个数据集划分成若干个小的区域

随便推点

未授予用户在此计算机上的请求登录类型_weixin_33920401的博客-程序员秘密

未授予用户在此计算机上的请求登录类型:除了常规的权限设置、启用guest帐号、启动server服务以外,在被访问者的组策略中注意查看一下,是否登录被访问者所用的帐号被设置在“拒绝从网络登录”的列表中。 转载于:https://blog.51cto.com/yaowangjiaju/104691...

【代码】图像处理、机器学习常用工具包汇总_阿卧鹅的博客-程序员秘密

【图像处理篇】skimage包读出的是numpy格式的图像数据。下面这篇文章介绍了 图像读取、图片信息获取(如尺寸)、绘制(子图、属性设置等)、颜色空间变换、图像数据类型转换、图像缩放、图像批量处理、图像直方图等实验代码。很全面,可以当参考手册。https://www.jianshu.com/p/f2e88197e81d下面这篇文章是图像滤波、图像二值化、二值化图像形态学操作、...

PopupMenu样式修改_jpopupmenu css样式_wuxin_9102的博客-程序员秘密

一、修改PopupMenu的背景颜色编写样式&lt;style name="PopupMenuBgStyle" parent="@android:style/Widget.PopupMenu"&gt; &lt;item name="android:popupBackground"&gt;@android:color/white&lt;/item&gt;&lt;/style&gt;然后在主题中加入样式&lt;item name="popupMenuStyle"&gt;@s

第九周项目3,星号图的输出_张旺华的博客-程序员秘密

/**Copyright (c)2014,烟台大学计算机与控制工程学院*All rights reserved.*文件名称:d.cpp*作 者:张旺华*完成日期:2014年10月16日*版 本 号:v1.0**问题描述:输出※号图*输入描述:无*程序输出:※号图*/#include //预命令的执行using namespace std

推荐文章

热门文章

相关标签