stm32 HAL库 串口DMA接收不定长度数据及粘包处理.docx
《stm32 HAL库 串口DMA接收不定长度数据及粘包处理.docx》由会员分享,可在线阅读,更多相关《stm32 HAL库 串口DMA接收不定长度数据及粘包处理.docx(23页珍藏版)》请在三一办公上搜索。
1、串口接收不定长度数据及数据粘包解析的实现1、如何让串口接收不定长度数据想让Stm32串口接收不定长度数据,这就需要我们开启串口空闲中断(IDLE) 方式,所谓串口空闲中断指的是stm32的数据总线在接收数据的过程中,如果总 线在接收一个字节所需要的时间内没有再接收到数据,单片机就会判定此时数据 已经接收完成了,这时单片机会自动触发空闲中断IDLE标志位,引发空闲中断, 我们只需要进入中断取数据就可以了。使用IDLE空闲中断我们就可以用串口接 收任意长度的数据了。2、串口接收不定长度数据的实现思路我们实现串口接收不定长度数据的思路是:首先我们要定义一个接收数据的 缓冲区,一般用数组接收数据,在串
2、口初始化时要开启串口的空闲中断和接收中 断。然后在有中断产生时,我们需要在串口中断函数里判断是空闲中断还是正常 接收一个字节数据引起的接收中断,如果是正常接收字节的中断,那么我们需要 把接收到的这个字节数据存放到缓冲数组中,如果是IDLE空闲中断,表示串口 数据已经接收完成了,我们需要在IDEL中断处理函数中设置一个数据接收完成 标志位表示已经完整的接收到一帧数据了,如:RecFlag=1;3、数据粘包解析的实现思路数据粘包是多个数据包发送时由于线路延时,或者发送端发送多个数据包的 时间延时很小,导致几个数据包几乎同时到达接收端(数据包到达接收端的时间 间隔小于一个字节时间),这样单片机接收数
3、据时就会将这几个数据包当做一帧 数据来接收存放。那么我们如何将这几个数据包合成的一帧数据拆解成几个数据 包呢?其实,实现的方法也很简单,这就需要我们在发送端和接收端的数据格式 上做一个统一的约定,约定了统一的数据发送格式在发送数据时就严格按照这个 格式来发送。一般来说约定的格式我们要明确规定数据头和数据长度。然后我们 再根据定义的数据头是什么数据,在这一帧数据中逐个去判断当前数据是不是数 据头,如果是就说明这个是一个小数据包的开始位置,在根据数据长度就可以解 析出一个数据包了。例如,我们约定发送的数据格式为:数据头(2byte)+发送 者 ID(1byte)+ 接收者 ID(1byte)+ 命
4、令码(1byte)+ 数据长度(1byte)+CRC 校验(2byte)。这样我们定义了标准的数据格式就容易拆包了。4、下面我们就根据约定的数据发送格式来定义具体的数据头,例如我们定义一 个数据包命令来查询接收命令的单片机PH值传感器1的数据是多少。数据包定义如下:数据头:0XAA55发送者ID: 0x01接收者ID: 0x02命令码:0x01 查询PH值传感器1命令 随意约定命令代码0x02 /响应PH查询命令0x03 设置传感器PH值上限命令0x10 设置成功数据长度:xxCRC 校验:0xB1B5 / CRC 16 Modbus那么发送端发送的查询数据为:aa 55 01 02 01 0
5、0 b5 b1接收查询命令响应的数据发送格式也要按照约定的数据格式发送出去:响应数据为:aa 55 02 01 02 02 00 07 12 91如此约定了数据格式,如果真的发生粘包的情况,解析数据也很方便了,我 们只需要找到数据头的标志0xAA55,然后读取该数据包代表数据长度的字节存 放的存储位置,就可以得到数据长度,比如数据包:aa 55 02 01 02 02 00 07 12 91 数据长度的位置就在AA这个字节之后的第五个字节,假设此时AA字节在缓冲 数组的位置为RecBufi,那么长度字节存放的位置就是 RecBufi+5,取出 RecBufi+5中的数据为2,说明该字节之后有2
6、个字节的数据,再加上CRC的2 个字节,我们就需要在RecBufi+5之后还要取出4个字节的数据,才能完整的取 出这个小数据包:aa 55 02 0102 02 00 07 12 91需要注意的是我们再拆包的过程中要重复考虑其中存在的问题,比如:数据长度错误时的数量,找不到数据头时循环变量的修正等。5、基于cubemx HAL库的实现方法(1)新建cubemx工程 选择stm32f103ze芯片(2)开启外部高速时钟HSE,配置好系统时钟树Pinout & ConfigurationClock ConfigurationAdditional Softwarev PinoutR.CC Mode
7、anZModeSystem Core vMAGPIQIWDGWICV SYSWWDGHi-gh Speed CIoc:要aFCeamiResLaw Speed Clock (LSE) Disable Master Clock OutputHMbUHH LjIULB. IUUMTo I ADO i1He|* -.(3)配置串口 1T?PLirFC;LH#t generateToolchain Folder LocationCode GeneratorC:UserssentyDesktopkcubemxusartReceiwe variable length dataToolchain l 旧EM
8、in VersionMD-K-ARM1 |V5二-STM32CuDe MCU packages and embedded saftware packsQ Dopy all used libraries into the project fiolderProjectCode Generator Dop/ only the necegsar/ library filesO Add necessary library files as reference in the toolchain project configuration file-Generated filesQ Generate per
9、iphsral initialiization as a. pmi.c/.h ,jles par peripheralI I Backup prei/iously generated files when re-generatingQ Keep User Code when re-generating De ete previ&usly generated files v/hen not re-generated6、我们先看结果首先,我们先测试单个命令发送(没有粘包)命令 1:查询 PH 指令 aa 55 01 02 01 00 b5 bl收到查询指令后,进行解析然后执行查询命令,向主机返回P
10、H数据【返回数据】:aa 55 02 010202 00 07 12 91 /返回PH值等于7lit:, SSCQM V5.13.1串口/网锁据调试器,作者:大虾T丁日S805BOq,一通映口串口设宣显示游寥字符串小王具蒂瓦联茎作者 PCB打样降至每款5元顺丰包邮可选杂色! t嘉立倒官网】【数据】: aa E5 U1 02 Ul 00 LE bl【折包其成 】日 矗02 -.一叮 F 5 1 土口 5 1- 1- nl.wiEra .a警机回CRT到柬912端口号 |CDMU USE-SEEIAL CH340 二蝶 关讶串口 |巧更妾串口设置I匚HE!显示 保存数据|厂搂收数据到文件|7 HE
11、1发送 r加时间概和分包显示,做 ms第宝节筐r RTS r DTR 波特:|1152OO Jg 55 01 02 01 00 b5 bl为了更好地发展昵匚伽软件止mi 请您注册嘉立削?结尾客户k一巫.里r升级到SSCDM5.13.1 *FCB打样降至每兼日兀,免颜色最,顺丰包邮!提供SMT贴片服务。的-丁也www.da3cia.co-m :3R:22&|COW 11 BJJJT IISOOLpa.l.None,Mone青豚窗口I打开文件II发谖文件停止I青发送E命令2:设置PH值上限指令aa 55 01 02 03 02 00 0b 57 5b 设置PH上限为11【返回数据】:aa 55 0
12、2 011000 49 a5 /返回设置成功指令0x10惬SSCOM V5.13.1串口,网骚据调试器.作者;大虾T丁花190狷街,“- 通g 口串口设置显示发送矜字符串小工且拜助睬紊作者 PC日打样降至每款5元顺丰包邮可选杂色!嘉立创盲网】醪朝5.S&头正确】【数据】:徂 55 01 02 03 02 00 Ob 57 51)邙C校验正确. . .】盾感器1 FH上限命令据】:aa 55 0Z 011000 43aS有除窗口 打开文件岌谖文件但止青发送E端口号三更多串口设置|詹关闭串口 &r RTS r DTR波特本:11边。皿显示 保存数据I厂搔欧教据到文件I区四)( 加时间戳和分包显示-
13、超时时间:叵aa 55 01 02 03 02 00 Ob 57 Shms为了更好地发展3SCCW件 请您注册嘉立创F站尾客户t升级到SSC0H5. 13. 1】丈匚上打样降至每款玩,免颜色噩,顺丰包揶!提供E贴片服务。*RT-Thiwuvw.daxia.GomS;10R;249COIM11 既开 nSOObpsAl.None.None接下来,我们测试一下数据粘包的情况我们把之前的2个命令合在一起发送出去,红色数据用来模拟有干扰的情况下,数据出错了。a2 55 aa 55 01 02 01 00 b5 bl 32 15 8e 20 aa 55 01 02 03 02 00 0b 57 5b 6
14、8 21结果如下:在串口收到这一帧数据后,调用拆包函数进行数据解析,按照数据头逐个进行比较只要 找到正确的数据头,就按照约定的数据长度去取数据,取到一个小包数据后进行CRC校验, 校验正确后才执行命令。第一个小包执行完成后接着去取下一个包,然后执行,直到把接收 到的数据解析并执行完成。临 SSCO M V5.13.1 $ n网茫数据涸才地作考:大SFT丁, 261S058qq.cam. QQ: 5 5 02445皱成,- 匚 通fl潴口串口设萱鄢示发送参字苻M小工耳笔助庶票作霍 PCB打样降至鱼教5顽主垃邮可为杂色!奇立创宣网】|t戮据】 95 0103 02 Ou DL_57 5Lllml脸
15、止魂感器1 H二眼命令.1 : g EE 02 01 10QU 49青睁诡口r度底划牛I信止|清发孟区|厂最前厂Eng保存端二号 | :OW11 TEI-MRIAL CKE4Dr】E:晅示俱符牧据厂 副理据刘丈件p g发送 宝讨虚这:1碰 z炊r此关诃串口仓史多吊口 1兰置加时函和分包显示.超拒间加曲剥1 m斗至1天尾垣顼竖hg三厂nrc r dti丘特全1 IF III _TK /3 为 口 K 口1 页 K 11| 嚣 1C 口 * G 口1 ZC K M tD甘四 21.* 了知子地&辰睥.叫 尚蹈:训阵匡客方其诺1r脚到迎皿.13门 雄签打样降至每赢无,免颔邑墨,II断包邮!提供皿贴田
16、萌m濂自中国的开源免墨商用物用vvw.daKia.ccmS:26R587COM 11 巳打开 115 200bps.3 J, None. IN on e中断接收方式:采用中断方式,只需要在宏定义#define UsartDMA 0/1配置成0就可以了,数据处 理结果跟用DMA方式一样,这里不再贴图。7、代码实现(1)编写myusart.h文件在myusart.h文件中我们主要定义串口数据接收的结构体类型#ifndef _MYUSART_H_#define _MYUSART_H_ #include main.h#include usart.h#include string.h#include s
17、tdio.h#define UsartBufSize 512#define UsartDMA 1 /是否启用串口 DMA 1启用0停止typedef structuint8_t *ReadPtr;uint8_t RecFlag;uint8_t ProFinsh;uint8_t RecBufUsartBufSize;uint16_t InAllLen;uint16_t CFraLen;uint16_t ReadNBytes;UART_HandleTypeDef *huart; NetDat_TypeDef;读书节指针接收标志数据处理完成标志/数据缓冲区缓冲区存放数据长度当前帧长度最近接受的帧长度
18、需要读取的字节数串口号void NetDateRec(NetDat_TypeDef *NetDat);void My_Usart_Init(UART_HandleTypeDef *huart,NetDat_TypeDef *NetDat);#endif(2)编写myusart.c文件#include myusart.h#include netdatpro.h uint16_t temp,lastTemp=0;extern UART_HandleTypeDef huart1;extern DMA_HandleTypeDef hdma_usart1_rx;extern DMA_HandleType
19、Def hdma_usart1_tx;NetDat_TypeDef Usart1_NetDate;/重定向c库函数printf到USARTxstruct _FILE 标准库需要的支持函数int handle;int fputc(int ch, FILE *f)while(huart1.Instance-SR&0X40)=0);/彳循环发送,直到发送完毕 huart1.Instance-DR = (uint8_t)ch ;return (ch);/网络数据接收函数void NetDateRec(NetDat_TypeDef *NetDat)#if UsartDMA = Enable/ stati
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- stm32 HAL库 串口DMA接收不定长度数据及粘包处理 HAL 串口 DMA 接收 不定 长度 数据 处理

链接地址:https://www.31ppt.com/p-4925130.html