掌握这招,串口通信高频收发32W数据,0丢包!

我做过挺多串口通讯类的产品,有用485通讯的pdu,有wifi/4G/蓝牙通讯类的网关...

做串口的应用,把串口外设调通只是第一步,串口只是数据传输的媒介,在此基础上,两个设备/器件要进行通信,传递更有意义的信息,还需要一个通讯协议。

如果没有协议设计经验,可以用标准协议,比如Modbus。

也可以自己设计通信协议,比如我们无际项目特训营的物联网串口通讯协议。

该协议负责网关和云平台/APP的数据交互。

串口通讯的难点和重点,不在于串口外设本身,而是基于串口的增值功能,比如协议设计和解析,其稳定性的考量。

早期做pdu的时候,用485通讯,Modbus协议,我是做从机,当时没什么经验,总是做不稳定,如果是碰上那种对成本要求很苛刻的产品,比如连一个电容钱都要省的,调起来极其恶心,想把公司电脑都砸了。

解析协议数据时,写程序也非常头疼,最常见的就是定义数组作为缓存,去接收数据,不过用这种方式程序写起来比较麻烦,全局变量满天飞。

如果一边接收,一边解析,然后再发送数据,难免会有多个程序同时访问和修改数组的情况,这样管理数据的插入和删除,就会大大增加了程序的复杂性。

如果没有足够的经验,很容易引起数据错乱,丢包,就是一帧协议数据,丢了其中1个或者几个字节。

所以,这篇文章,是解决如何用应对高频数据流的问题,这种方法,不仅仅能用于串口,也适用其它大数据流处理的场景。

这个时候,需要用到一种数据结构,叫队列

队列可以更好地保证数据的完整性和顺序,因为队列是先进先出(FIFO)的数据结构,而数组可能会因为覆盖或重新分配而导致数据顺序混乱。

其实队列,也没想象中这么玄乎,就是在数组/内存里面,写一些入列/出列的小算法,去管理这些数组/内存。

如果想学写队列这种数据结构,我知道的两个渠道。

第一,可以看我2018年录制的那套程序架构教程,里面有手把手教写队列代码的章节。

通过这些结构体,可以根据应用场景,定义不同大小的队列。

然后通过4个函数,去管理定义好的队列,比如清空、入列、出列、判断队列有效数据长度。

这个队列相对简单,缺点是只能入列单个字节的数据类型,不过大多数单片机项目也够用。

第二,RTOS也有队列代码,不过是用链表这种数据结构,更加复杂一点,优点是支持任意数据类型入列。

我一般是用自己写的那个,因为能100%掌控,使用也简单,而且经过了大批量产品验证,稳得一批。

下图是我们用无际单片机特训营项目3做的实验,单片机型号为STM32F103,以10ms的频率发送和接收串口数据,测试了32.5W个字节数据,0丢包。

这个代码,我并没有用DMA,如果用DMA,效率更高。

下面讲下我是怎么做的,其实贼简单。

DebugTxMsg是全局队列,大小为256个字节,这个可以根据单片机资源、实际应用的数据量大小、频率去调节。

当串口收到一个字节数据,我就直接丢进队列里。什么数组下标++,判断数组是否满之类的操作,其实是在队列入列函数里完成的,一次写好后,无限复用。

然后,有专门的函数,用来处理队列的数据,如果判断队列里有数据,就通过串口1再发送出去。

QueueDataOut是一个队列数据出列函数,函数内部实现了先进先出的算法,所以我们完全不用管什么数组下标,数组还有多少数据之类的,也是一次写好,无限复用,大大简化了程序。

hal_debugProc这个函数,是一直main函数里轮询执行的,所以只要队列有数据,就会被发送出去。

这个阶段,能够测试数据接收是否完整,稳定,测试通过以后,再去实现协议解析的代码。

写程序有点像下棋,走一步看百步,前期搭好程序架构,后期做细节功能会很高效稳定。


最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单

片机最佳学习路径+单片机入门到高级教程+工具包」全部无偿分享给铁粉!!!

除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手

教程资料包和详细的学习路径可以看我下面这篇文章的开头

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

《单片机入门到高级开挂学习路径(附教程+工具)》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/27065.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx 启动报错:Failed to start The nginx HTTP and reverse proxy server.

1,启动 nginx报错 systemctl start nginx[rootlaoban yum.repos.d]# systemctl start nginx Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "jetails. [rootlaoban…

react用ECharts实现组织架构图

找到ECharts中路径图。 然后开始爆改。 <div id{org- name} style{{ width: 100%, height: 650, display: flex, justifyContent: center }}></div> // data的数据格式 interface ChartData {name: string;value: number;children: ChartData[]; } const treeDep…

未来之门开启:探索电子墨水屏日历的无界可能

导语: 在科技的浪潮中&#xff0c;一种全新的电子产品正悄然改变我们的生活——电子墨水屏日历。不同于传统日历&#xff0c;它以极简的设计、超低的功耗和无光污染的特性&#xff0c;掀起了一场桌面革命。无需插座&#xff0c;一年一充&#xff0c;便携易用&#xff0c;它是如…

计算机网络 —— 应用层(应用层概述及服务方式)

计算机网络 —— 应用层&#xff08;应用层概述及服务方式&#xff09; 应用层服务方式C/S&#xff08;客户端-服务器&#xff08;C/S&#xff09;模型&#xff09;基本概念特点B/S&#xff08;Browser/Server&#xff09;基本概念特点应用场景 p2p &#xff08;对等网络&#…

【UML用户指南】-13-对高级结构建模-包

目录 1、名称 2、元素 3、可见性 4、引入与引出 用包把建模元素安排成可作为一个组来处理的较大组块。可以控制这些元素的可见性&#xff0c;使一些元素在包外是可见的&#xff0c;而另一些元素要隐藏在包内。也可以用包表示系统体系结构的不同视图。 狗窝并不复杂&#x…

【单片机毕业设计选题24003】-基于STM32和阿里云的家庭安全监测系统

系统功能: 此设计采用STM32单片机采集环境温湿度,烟雾浓度和一氧化碳浓度显示在OLED上&#xff0c;并将这些信息上报至阿里云平台。 1. 上电连接手机热点后自动连接阿里云&#xff0c;可通过阿里云平台收到系统上报的温湿度&#xff0c;烟雾 浓度&#xff0c;一氧化碳数据以…

一个顶级产品经理的自我修养,从掌控AI工具开始

前言 在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;技术的快速发展正深刻地改变着各行各业的运营模式与竞争格局。产品经理&#xff0c;作为连接用户需求与产品设计之间的桥梁&#xff0c;在这场变革中扮演着至关重要的角色。随着AI技术的广泛应用&…

1. NAS和SAN存储

NAS和SAN存储 一、存储设备1、根据工作方式2、DAS 直接附加存储3、NAS存储4、SAN存储 二、模拟配置SAN存储1、创建虚拟机、安装openfiler2、访问openfiler webUI3、创建RAID设备4、开启iSCSI服务5、配置SAN存储设备共享空间5.1 设置IQN 6、业务服务器连接使用存储6.1 安装客户端…

OceanBase 并行执行参数 parallel_servers_target 理解

为了最大程度降低 PX 使用难度&#xff0c;OceanBase 3.1 版起&#xff0c;parallel_max_servers 参数废弃。 用户只需用好 parallel_servers_target 即可。 target 的用途 用一个酒吧的例子来粗略理解下 parallel_servers_target 的意思&#xff1a; target 先生开了一个酒…

【中科蓝讯BT896X】app.lst、ram.ld、map.txt文件的分析和使用

【中科蓝讯BT896X】app.lst、ram.ld、map.txt文件的分析和使用 测试SDK版本&#xff1a;《SDK_BT896X_S12685_20240314》 文章目录 【中科蓝讯BT896X】app.lst、ram.ld、map.txt文件的分析和使用前言一、app.lst、ram.ld、map.txt文件介绍1.1 app.lst文件1.2 ram.ld文件1.3 map…

【FPGA项目】bin文件ram存取回环测试

&#x1f389;欢迎来到FPGA专栏~bin文件ram存取回环测试 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大…

探秘大数据信用报告:最佳查询方式

大数据信用报告查询方式一般有几种?哪种比较好?在了解这个问题之前&#xff0c;想必你对大数据信用与人行信用的区别都是比较清楚了&#xff0c;本文呢就着重讲一下大数据信用报告查询方式有几种&#xff0c;哪种比较好&#xff0c;感兴趣的朋友不妨一起去看看。 大数据信用报…

跟卖五种常用采集方式,关键词采集升级,更加让新手上手更快!

今天给大家分享一个跟卖选品软件&#xff0c;相信很多卖家都在为选品而苦恼&#xff0c;人工筛选一天也筛选不出几个能用的链接&#xff0c;不仅耗费时间精力&#xff0c;还提升不了选品效率&#xff0c;今天就分享一款实用的选品工具&#xff0c;它能够帮助我们节省选品时间&a…

诊所管理系统哪家会好一点

随着医疗行业的快速发展和信息化进程的加速&#xff0c;诊所作为医疗服务的重要基层单位&#xff0c;其运营管理效率与服务质量的提升愈发依赖于现代化的管理工具。诊所管理系统应运而生&#xff0c;旨在通过集成化、智能化的技术手段&#xff0c;帮助诊所实现诊疗流程优化、资…

Python 显示笔记本电脑的电池状态和百分比

方法一&#xff1a; import psutil import psutil battery psutil.sensors_battery() if battery is None:print("No battery is found.")exit() print (battery) percentagebattery.percent print(f"Battery Percentage: {percentage}%")Battery的信息…

『大模型笔记』缩放定律(scaling laws)是由记忆而非智力解释的吗?

MAC 文章目录 一. 缩放定律(scaling laws)是由记忆而非智力解释的吗?1. 视频原文内容2. 要点总结一般智能的定义规模最大化的论点性能衡量的方式及其影响大语言模型的基准测试大语言模型的本质与记忆基准测试插值的概念与基准测试实例人类和模型的推理与样本效率二. 参考文献一…

期末测试2--函数题---指针链表如何输出?

总结写代码时候遇到的问题 1.遍历指针链表 指针head在做for循环遍历的时候 for&#xff08;head, head!NULL;head&#xff09; head不能 for(head,head!NULL;headhead->next)-------正确的写法 int i; for(ihead;head!NULL;headhead->next) i 是 int 类型的&#x…

chrome浏览器设置--disable-web-security解决跨域

在开发人员于后台进行接口测试的时候&#xff0c;老是遇到跨域问题&#xff0c;这时前端总是会让后台添加跨域请求头来允许跨域请求&#xff0c;今天介绍一个简单的方法跨过这一步操作的设置。 –disable-web-security参数&#xff0c;禁用同源策略&#xff0c;利于开发人员本…

嵌入式系统复习(一)

第一章 嵌入式系统的定义、特点 嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;软件硬件可裁剪&#xff0c;适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。 特点&#xff1a;嵌入性 专用性 计算机系统 嵌入式系统典型组成…