关于单片机串口接收不固定字节长度的解决方案
之前老是有个问题困惑着小编,串口这种一字节一字节的接收和发送的机制,而在实际应用中如果收发双方不制定一个协议,没有帧头,帧尾做一帧数据接收开始和结束的标准。或者收发数据长度不固定,怎么去确定每一帧长度不同的帧呢?
面对这种每次发送长度不固定的情况,我最开始采用的是定时器中断加串口中断的方式。
如现在来了一帧长度为86字节的数据,我在串口接收中断中将这86个字节一一入循环队列,假设循环队列的长度是256个字节,现在86个字节已经接收完毕,那么,我在哪里出队来确保这86个字节能一次性出完呢,很多人可能考虑的是主函数轮询出队,但是你可想过,如果主函数里面处理的任务不多,导致轮询过快,如果此时出队列就会导致86个字节出队时不能出完,从而会被多次拆分形成多帧数据,处理数据无效。
所以可以采用定时器中断,每80ms中断一次,每次中断,数据出队列,80ms已经可以实现一次性接收256个字节都会完整的出队了。而且80ms肉眼基本看不出,只能看到这边发送,那边就已经把完整的数据打印出来了,而且256个字节以内任意发多少,都没有数据被拆分,丢失的问题。这样显然是初步解决了任意长度发送,接收的问题,但是在实际应用使用中,如果要求串口高速度,发不定长的数据,就会出现一系列的问题,如现在客户要求任意长度的一帧数据,我连续发送多帧,而且每帧的时间间隔要小于10ms,并且我们之间收发没有通信协议,我想给你发什么就发什么,你要解析数据。面对这种客户要求这种定时器中断加串口中断肯定是不行了的。那么采用什么会有效解决这个问题呢。
仔细看单片机的数据手册关于串口中断的描述,会发现,其实串口中断中,存在一个空闲中断,这个空闲中断帮了我大忙,空闲中断并不是说串口空闲就触发,这样的话岂不是串口如果没有数据过来,空闲中断一直触发,那么整个程序不就一直处于中断之中嘛。空闲中断是指,当最后一个字节接收完毕后,硬件接收中断接收完数据后使得IDLE寄存器中的标志位置高,于是,我们便可以采用此空闲中断标志置高来提醒主程序可以出队,因为一帧数据已经发送完毕了。
1、下图为初始化时使能串口接收中断和空闲中断,及重写串口中断函数方法:
注意:USART5_IRQHandler函数里面,用关于先读SR,再读DR是为了清除空闲中断标志,以至于下一帧数据还能触发此中断,而下面那个变量置1,提醒主程序一帧数据接收完毕,你该去处理了。
2、下图为在主程序里轮询检测数据结束标志,如果标志被置1则进行相应处理。
注意:uart5_handle函数里面据实际情况而实现,如果你只想单纯的转发数据,那么直接判断队列里数据长度,根据长度出队所有数据,然后进行转发就行,如果需要解析处理数据的话,也可以先出队再解析处理。
以上就是关于单片机接收不定长数据的解决方案的全部处理过程,其中如果收发双方如果制定了协议,则可以根据协议收发不定长数据。如果没有串口通信协议则可以使用,串口接收中断加串口空闲中断的方式处理!!小编也是刚刚入坑不久,欢迎各位大佬对不对的地方评论。谢谢!!
关于单片机串口接收不固定字节长度的解决方案相关推荐
- 单片机串口接收的几种常用的数据处理方法
单片机串口接收的几种常用的数据处理方法 一.为什么串口接收的数据需要处理 我们在做项目的时候经常会用到串口,当我们用串口和别的设备通讯的时候就需要严格遵循通讯协议,然而,仅仅是遵循通讯协议是不够的,因 ...
- stc51单片机串口接收多字节数据
stc51单片机串口接收多字节数据 简介 51单片机有2个定时器,一个做串口波特率,一个做数据截止帧延时检测,硬件平台测试使用的是stc8的单片机,但是可以往51移植 代码 #include &quo ...
- 单片机串口接收数据的一些经验与教训
一些好文章 一种单片机数据解析方法:https://mp.weixin.qq.com/s/GVH8MZrlbVKXanD45wOYOw 单片机串口接收数据需要注意以下几点 1.接收数据要有顺序,接收到 ...
- 单片机串口接收发生溢出中断错误
最近在写国产华大单片机HC32F4A0的串口超时中断加DMA接收数据过程中发现一个问题,在我串口收到数据进入串口超时中断后,正常情况下,如果数据量没超过DMA设定的发送次数最大情况,是能接收数据的,但 ...
- 89C52单片机 串口接收发送 数据
文章目录 1.简介 2. 功能实现 1.简介 通过串口对单片机发送数据,然后 数据 +1 返回串口 2. 功能实现 #include <reg52.h>#define uchar unsi ...
- 一个简易的51单片机串口接收和发送程序
作者:李大闯 /********************* 程序功能:接收上位机发过来的一个字符串,然后把该字符串发送给上位机,字符串必须以!结尾 **********************/ #i ...
- STM8单片机串口同时识别自定义协议和Modbus协议
在单片机开发中,串口是最常用的和外界交换数据的渠道,要使用串口,那必不可少的就是通信协议,通信协议就是单片机和外界通信的语言,要想正常和其他设备正常交流,首先语言必须相通. 在实际开发过程中由 ...
- 如何写一个高效的串口接收程序
导读:学单片机的大概最先.最常写的通信程序应该就是串口程序了,但是如何写出一个健壮且高效的串口接收程序呢?接下来鱼鹰将根据多年的开发经验教你如何编写串口接收程序(可在公众号获取个人编写的串口接收源码) ...
- 如何写一个健壮且高效的串口接收程序?
正文:13923字 阅读时间:35分钟 建议先马后看 导读:学单片机的大概最先.最常写的通信程序应该就是串口程序了,但是如何写出一个健壮且高效的串口接收程序呢?接下来鱼鹰将根据多年的开发经验教你 ...
最新文章
- 【Python】掌握Python中的索引和切片
- 开发中遇到的Cause: java.sql.SQLException: connection holder is null的异常
- JavaScript——原型/原型链中的顶层对象(图解)
- 如何用java更改网页图片,java如何修改文档第一页为不同的页面
- Spring(一):简介
- 【5分钟 Paper】Playing Atari with Deep Reinforcement Learning
- 面向对象编程风格 VS 基于对象编程风格
- 打印机喷嘴清洗必杀武器
- 第十五章 项目收尾与验收
- 数字信号第二章freqz函数作业
- php 银行卡二三四要素验证接口
- BuBu笔记——Mybatis入门(秃头BUBu的超详细备注,一定要看哦)
- HTML5视频自动循环播放
- 哪款蓝牙耳机适合运动的时候戴?佩戴舒适的蓝牙耳机推荐
- java获取东八区时间
- 京东云视频云全面支持AVS2标准
- 打印机种类与对应的耗材
- 2022年广西食品安全管理员模拟试题及答案
- 消息中间件 一 之 AMQP译文(下)
- BUUCTF basic PikaChu AWD-Test1 Webug 4.0
热门文章
- 玩转服务器-博客两件套之绝佳的Markdown写作平台CodiMD
- MYSQL常用监控项
- 项目二:用C++做一个战舰游戏
- python3 爬取乐谱
- 工程总承包(EPC)高级项目经理,未来可期!
- 台式计算机哪款好,2019台式电脑质量排行_台式电脑哪款好 2019十款热门台式电脑排行榜...
- 小米手环4怎么使用_小米手环4怎么使用 小米手环4开机方法
- 乐融超级电视与鸿蒙系统,乐视超级电视亲笔信回馈乐迷 感谢一路相伴不离不弃...
- 浏览历史记录---网上商城Web
- 由 method may be static 引发的 Python PEP8 总结