历史上的今天

今天是:2024年10月14日(星期一)

正在发生

2021年10月14日 | STM32串口通讯协议浅析

发布者:mu22 来源: eefocus关键字:STM32  串口  通讯协议 手机看文章 扫描二维码
随时随地手机看文章

通讯协议是指在嵌入式开发中,不同的硬件系统或者操作系统之间进行数据交换的方式,是一种数据通讯的规约。


通讯协议有很多种,而我今天要说的是串口通讯协议,而且是基于STM32来说的。


首先说串口通信,串口是单片机最常见的外设。常见的UART串口主要有两个线,一个线是发送、一个是接收。至于串口发送数据的时候数据线上的高低电平是怎么变化的,这个大家可以自行查阅相关知识,我们常见的单片机自带的串口已经把这个最底层的电平级别的协议做好了,我们使用的时候,收发都是以一个字节为单位来进行的。


举个例子,我们想使用串口连接STM32的串口1到PC机,然后通过PC上位机给STM32发送一个字节0x01,然后在STM32接收到之后,判断一下是不是0x01,如果是的话,点亮一个小灯,如果不是的话,就不点亮灯。这个很多人都可以理解而且实现起来非常容易,基本上几行代码就实现了。


那么把刚才的例子扩展一下,假如STM32连接了很多很多灯,然后我们要使用串口发送一个指令来控制所有灯,这时候应该怎么操作?


把问题再扩展一下,假如我们要控制或通信的不是一个灯,而是一个更复杂的东西,比如是一个电机控制模块、是一个GPS模块、是一个物联网模块呢,这些东西在数据交互的时候都有很大的数据量,不可能一个一个字节去发送数据。


这时候我们就可以联想一下人类是怎么交互的,首先经过上万年的潜移默化,人类形成了很多种语言,同一个国家的人说话基本上都可以听懂,而不同国家的人说话的时候,如果不懂外语是听不懂的。这是为什么呢,因为同一个国家的人,说话的时候使用的协议是相同的,你说桌子,我就知道是桌子。而不同国家的人,通讯协议是不一样的,所以说话的时候不能理解,比如你说apple,我如果没有学过英语,我就不知道你说的是苹果。但是我学习了你的语言,也就是协议。就可以听懂你说的是苹果了。


所以,STM32和PC通讯,或者扩展到更多的场景,STM32和GPS,其他单片机和WIFI等等,这样的通讯都需要通讯双方执行同样的协议。那么对于刚接触单片机的人而言,就产生了几个问题,协议是什么样的,如何执行协议?


还是以最简单的场景来举例子。以使用PC机发指令来控制STM32点亮8个小灯中的若干个小灯固定时长(一秒到255秒之间)然后关闭这样一个实际小项目为例,我们现在明白了,如果只发一个指令,是没办法完成以上任务的。所以我们需要制定一个简单的协议。比如我STM32的程序这么写:当串口收到0xAA然后又收到0x55的时候,我就开始不断收集,并把收集到的所有数据都放在一个数字中,直到收到0xA5x5A这两个的时候就停止收集。接下来我把收集到的数组里面的第一个拿出来,使用if进行判断,如果是0x01的话就点亮第一个小灯,如果是0x00或者其他的话,就不点亮灯,然后看看数组的第二个字节是多少,是多少就给延时多少。相当于通过前两个字节来控制第一个灯亮灭固定时间长度。同样的接下来的两个字节是第二个灯的亮灭和时间长度。按这样的节奏来,要控制这8个灯需要16个字节。那么我们是否可以优化一下这个协议呢?


假如把8个灯的亮灭信息只用一个字节来表示,后面加8个字节,分别用来表示每个灯的亮灭时间长度,这样的话,就可以用9个字节来完成这个任务。


现在我们再想想,假如在这个数据传输的过程中,出了一点小错误,其中有一个电平在跳变的时候受到了干扰,没有按照发送方的数据跳变,这时候接收方接收到的数据就是错误的,假如这个错误发生在第一个灯的亮灭位上,那这个灯就会发生错误的反应,这不是发送方想要的结果。那如何避免这种情况发生呢?使用校验位,校验位是什么意思呢,就是我在给你发的时候,我把9个字节的数据做一个运算。运算有很多种方式,以求和为例子,把9个字节的数据求和,然后拿出里面低八位的数据,放在我要发送的9个字节后面。这样,发送的内容除了0xAA,0x55,0xA5和x5A之外,还多了一个位,我们把多出来的这个通过数据位运算得到的这一字节称为校验位。当发送出去之后,接收方在接收完这些数据之后,也对数据位做一个求和,然后取出低八位,和发送方发送过来的那个校验位做比较,如果相等,说明数据发送过程中没有出错,如果不相等,说明数据发送过程中有地方出错了,那么我们整个不要这一包数据了,然后给发送方通知一下,告诉他让他重新发送一下刚才的数据。


现在回到数据收发,PC端发数据,STM32端接收,这时候STM32也就要每过一会儿(很短暂的时间)就去看看串口是否有数据收到,这种方式称为扫描。扫描有一个缺点,就是需要不断的去看,结果可能去看了一百次,才有一次有数据收到,这样效率太低了,老板(cpu)肯定不高兴,就给串口说,以后你自己处理,有数据来了给我说一下我去处理就行,别让我自己去看,手里事情多着呢。所以就有了中断,中断就是当串口上有数据接了,就会产生一个接收中断,这时候串口就去通知老板来处理。原本要不断过来看看有没有数据,现在他有数据了才通知老板,老板开始还感觉不错,比以前扫描的时候轻松了点。


过了一段时间,老板想,这样每来一包数据,我得去拿几十次呀,太累,于是扔给串口一个仓库(数组),然后说,我给你一个特殊的通道(DMA)你以后收完一包数据直接通过这个通道把数据放在这个仓库里,放完了再通知我来处理,别让我来一次处理一个,手里事情多着呢。然后就有了串口空闲中断,串口每次收到一帧数据之后,才会产生一个中断通知cpu处理。串口空闲中断+DMA的方式简直是处理串口通讯的神器,没有之二。


接下来我们再想想,如果我们有一天突然觉得只控制8个灯不够用了,需要扩展几个呢,这时候,灯加上去之后,协议上还要有很大的改动,比如要把灯的控制位插在数据位的后面,就要把校验位往后挪挪,这样程序就需要改改,那么有没有一种方式,可以允许你在一定范围之内随意改灯的数量而不需要修改协议呢?这就需要设计一个不定长的通讯协议了。既然不定长,那也就意味着,发送方每次都可能发送出不同长度的数据给接收方,这也就要求发送方在发送数据的时候,在这个数据包的前面要加上数据有几个字节,这样接收方才好根据这个数量去接收(串口空闲中断+dma的方式不需要根据这个数量去接收),并且根据这个数量去解析,进而控制灯。


关键字:STM32  串口  通讯协议 引用地址:STM32串口通讯协议浅析

上一篇:STM32之IIC通讯升级版--SHT30温湿度读取
下一篇:STM32学习笔记3——stm32系统时钟树

推荐阅读

人工智能早就已经成为最热门的赛道,不仅仅是创业公司,重要的科技公司都把人工智能列为自己的重要战略。作为中国最重要的科技公司之一,华为也在10月9日发布了自己的人工智能战略,同时还公布了华为要做的两款人工智能芯片。 华为轮值CEO徐直军在演讲中,把华为的人工智能战略概括为五个方面:投资基础研究;打造全栈方案;投资开放生态和人才培养;把AI...
Waymo 与雷诺(Renault)正在与巴黎合作,探索在戴高乐机场与巴黎都会区中心商务区拉德芳斯(LaDéfense)之间建立自动运输路线的可能性。拉德芳斯位于巴黎市郊之外,那里有许多企业大厦,其中还包括大型购物中心。这是雷诺日产今年早些时候与 Waymo 签署的合作协议的一部分,该协议旨在将自动驾驶汽车引入法国、日本和世界其他地区。这条路线正在作为...
据外媒报道,法国NAWA Technologies公司推出新型碳纳米管电极。据称,这种超快电极可将电池功率提高10倍,储能能力提高3倍,寿命延长5倍,并使充电时间从几小时缩短至几分钟。(图片来源:NAWA)据这家总部位于普罗旺斯艾克斯的公司介绍,限制电池功率、能量和生命周期的主要因素之一是制造电极用的粉末。低效粉末可能会导致电导率、导热性和离子传导率较...
Android 12已经登场,小米11系列、Redmi K40 Pro系列已开启Android 12内测。  小米集团公关部王化指出,Android 12目前才刚刚适配,这时候不仅适配的APP很少,而且还有很多BUG,毕竟不管是谷歌还是应用开发商都还有很多工作要做。  就拿很多银行APP来说适配就需要时间,所以现在冲Android12的猛士大多数都是有动手能力、有时间折腾、还...

史海拾趣

问答坊 | AI 解惑

Reflection Oscillator Design Tutorial

      This paper discusses the design of a basic reflection oscillator, using a distributed resonator and micro-strip circuit elements. The first design is of a fixed frequency oscillator and the seco ...…

查看全部问答∨

请各位高手指教,下面的电路能不能成立,不能成立的原因是什么?

电路是我自己画的,个人分析如下,有不对的地方希望大家指正:谢谢~ 1》通电,12V经R1到Q1的C极,经R2加至Q1的B极,Q1饱和导通,C极等于0 此时Q2,Q3,Q4的B极全部为0 Q2为PNP管,此时是导通状态,但对电路没影响 2》按S1, ...…

查看全部问答∨

第五届全国大学生电子设计竞赛获奖作品选编(2001)

本帖最后由 paulhyde 于 2014-9-15 09:23 编辑 我自己看过的,有一些用处吧,需要的下来看看。 =============== 压缩包里面已经有了打开pdg格式的软件  …

查看全部问答∨

我觉得最好的:如何写无错健壮的C语言程序教程

看到大家最近学习C 的热情,共享下: 这是 微软工程师编写的一本我觉得最好的如何写无错的健壮的C语言程序的进阶教程 ─── Microsoft 编写优质无错C 程序秘诀 目录 序 ⋯⋯⋯⋯⋯⋯⋯⋯⋯Y ...…

查看全部问答∨

请教STM32单片机的EEPROM读写出现BUS fault

STM32单片机的EEPROM读写出现BUS fault.不知谁有同类应用的经验.…

查看全部问答∨

有关tcsetattr的问题

tcsetattr(0,TCSANOW,&term); tcsetattr(1,TCSANOW,&term);   中的“0”和“1”表示啥意思啊?…

查看全部问答∨

求教:如何时间PC与单片机之间的文件发送与接受

    急!如何实现PC机与单片机之间进行文件发送和接收(最好是双向的那种),接收方还要给传输方一个响应,编程思路是怎样. …

查看全部问答∨

问关于结构体MSGQUEUEOPTIONS

结构体MSGQUEUEOPTIONS下面的cbMaxMessage字段代表什么?和dwMaxMessages有何区别?谢谢!…

查看全部问答∨

我的C3怎么超不了频?

大家好:     我用的是顶星TM810-T主板,C3主频为1G的CPU,我想将主频超到1.33G,在BIOS中按照以下的设置后,保存退出,怎么还是原来的1G(100*10)主频呢?我的设置如下: Auto Detect DIMM/PCI Clk [Enabled] 默认,没有改 Spread Sp ...…

查看全部问答∨

【求助】写LCD液晶不能写

我想写一个计算的东西东西 但是不能显示 //****************************************************************************** // MSP-FET430P440 Demo - Timer_A Toggle P5.1, CCR0 upmode ISR, 32kHz ACLK // // Descripti ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved