之前老是有个问题困惑着小编,串口这种一字节一字节的接收和发送的机制,而在实际应用中如果收发双方不制定一个协议,没有帧头,帧尾做一帧数据接收开始和结束的标准。或者收发数据长度不固定,怎么去确定每一帧长度不同的帧呢?

面对这种每次发送长度不固定的情况,我最开始采用的是定时器中断加串口中断的方式。

如现在来了一帧长度为86字节的数据,我在串口接收中断中将这86个字节一一入循环队列,假设循环队列的长度是256个字节,现在86个字节已经接收完毕,那么,我在哪里出队来确保这86个字节能一次性出完呢,很多人可能考虑的是主函数轮询出队,但是你可想过,如果主函数里面处理的任务不多,导致轮询过快,如果此时出队列就会导致86个字节出队时不能出完,从而会被多次拆分形成多帧数据,处理数据无效。

所以可以采用定时器中断,每80ms中断一次,每次中断,数据出队列,80ms已经可以实现一次性接收256个字节都会完整的出队了。而且80ms肉眼基本看不出,只能看到这边发送,那边就已经把完整的数据打印出来了,而且256个字节以内任意发多少,都没有数据被拆分,丢失的问题。这样显然是初步解决了任意长度发送,接收的问题,但是在实际应用使用中,如果要求串口高速度,发不定长的数据,就会出现一系列的问题,如现在客户要求任意长度的一帧数据,我连续发送多帧,而且每帧的时间间隔要小于10ms,并且我们之间收发没有通信协议,我想给你发什么就发什么,你要解析数据。面对这种客户要求这种定时器中断加串口中断肯定是不行了的。那么采用什么会有效解决这个问题呢。

仔细看单片机的数据手册关于串口中断的描述,会发现,其实串口中断中,存在一个空闲中断,这个空闲中断帮了我大忙,空闲中断并不是说串口空闲就触发,这样的话岂不是串口如果没有数据过来,空闲中断一直触发,那么整个程序不就一直处于中断之中嘛。空闲中断是指,当最后一个字节接收完毕后,硬件接收中断接收完数据后使得IDLE寄存器中的标志位置高,于是,我们便可以采用此空闲中断标志置高来提醒主程序可以出队,因为一帧数据已经发送完毕了。

1、下图为初始化时使能串口接收中断和空闲中断,及重写串口中断函数方法:

注意:USART5_IRQHandler函数里面,用关于先读SR,再读DR是为了清除空闲中断标志,以至于下一帧数据还能触发此中断,而下面那个变量置1,提醒主程序一帧数据接收完毕,你该去处理了。

2、下图为在主程序里轮询检测数据结束标志,如果标志被置1则进行相应处理。

注意:uart5_handle函数里面据实际情况而实现,如果你只想单纯的转发数据,那么直接判断队列里数据长度,根据长度出队所有数据,然后进行转发就行,如果需要解析处理数据的话,也可以先出队再解析处理。

以上就是关于单片机接收不定长数据的解决方案的全部处理过程,其中如果收发双方如果制定了协议,则可以根据协议收发不定长数据。如果没有串口通信协议则可以使用,串口接收中断加串口空闲中断的方式处理!!小编也是刚刚入坑不久,欢迎各位大佬对不对的地方评论。谢谢!!

关于单片机串口接收不固定字节长度的解决方案相关推荐

  1. 单片机串口接收的几种常用的数据处理方法

    单片机串口接收的几种常用的数据处理方法 一.为什么串口接收的数据需要处理 我们在做项目的时候经常会用到串口,当我们用串口和别的设备通讯的时候就需要严格遵循通讯协议,然而,仅仅是遵循通讯协议是不够的,因 ...

  2. stc51单片机串口接收多字节数据

    stc51单片机串口接收多字节数据 简介 51单片机有2个定时器,一个做串口波特率,一个做数据截止帧延时检测,硬件平台测试使用的是stc8的单片机,但是可以往51移植 代码 #include &quo ...

  3. 单片机串口接收数据的一些经验与教训

    一些好文章 一种单片机数据解析方法:https://mp.weixin.qq.com/s/GVH8MZrlbVKXanD45wOYOw 单片机串口接收数据需要注意以下几点 1.接收数据要有顺序,接收到 ...

  4. 单片机串口接收发生溢出中断错误

    最近在写国产华大单片机HC32F4A0的串口超时中断加DMA接收数据过程中发现一个问题,在我串口收到数据进入串口超时中断后,正常情况下,如果数据量没超过DMA设定的发送次数最大情况,是能接收数据的,但 ...

  5. 89C52单片机 串口接收发送 数据

    文章目录 1.简介 2. 功能实现 1.简介 通过串口对单片机发送数据,然后 数据 +1 返回串口 2. 功能实现 #include <reg52.h>#define uchar unsi ...

  6. 一个简易的51单片机串口接收和发送程序

    作者:李大闯 /********************* 程序功能:接收上位机发过来的一个字符串,然后把该字符串发送给上位机,字符串必须以!结尾 **********************/ #i ...

  7. STM8单片机串口同时识别自定义协议和Modbus协议

      在单片机开发中,串口是最常用的和外界交换数据的渠道,要使用串口,那必不可少的就是通信协议,通信协议就是单片机和外界通信的语言,要想正常和其他设备正常交流,首先语言必须相通.   在实际开发过程中由 ...

  8. 如何写一个高效的串口接收程序

    导读:学单片机的大概最先.最常写的通信程序应该就是串口程序了,但是如何写出一个健壮且高效的串口接收程序呢?接下来鱼鹰将根据多年的开发经验教你如何编写串口接收程序(可在公众号获取个人编写的串口接收源码) ...

  9. 如何写一个健壮且高效的串口接收程序?

    正文:13923字  阅读时间:35分钟   建议先马后看 导读:学单片机的大概最先.最常写的通信程序应该就是串口程序了,但是如何写出一个健壮且高效的串口接收程序呢?接下来鱼鹰将根据多年的开发经验教你 ...

最新文章

  1. 【Python】掌握Python中的索引和切片
  2. 开发中遇到的Cause: java.sql.SQLException: connection holder is null的异常
  3. JavaScript——原型/原型链中的顶层对象(图解)
  4. 如何用java更改网页图片,java如何修改文档第一页为不同的页面
  5. Spring(一):简介
  6. 【5分钟 Paper】Playing Atari with Deep Reinforcement Learning
  7. 面向对象编程风格 VS 基于对象编程风格
  8. 打印机喷嘴清洗必杀武器
  9. 第十五章 项目收尾与验收
  10. 数字信号第二章freqz函数作业
  11. php 银行卡二三四要素验证接口
  12. BuBu笔记——Mybatis入门(秃头BUBu的超详细备注,一定要看哦)
  13. HTML5视频自动循环播放
  14. 哪款蓝牙耳机适合运动的时候戴?佩戴舒适的蓝牙耳机推荐
  15. java获取东八区时间
  16. 京东云视频云全面支持AVS2标准
  17. 打印机种类与对应的耗材
  18. 2022年广西食品安全管理员模拟试题及答案
  19. 消息中间件 一 之 AMQP译文(下)
  20. BUUCTF basic PikaChu AWD-Test1 Webug 4.0

热门文章

  1. 玩转服务器-博客两件套之绝佳的Markdown写作平台CodiMD
  2. MYSQL常用监控项
  3. 项目二:用C++做一个战舰游戏
  4. python3 爬取乐谱
  5. 工程总承包(EPC)高级项目经理,未来可期!
  6. 台式计算机哪款好,2019台式电脑质量排行_台式电脑哪款好 2019十款热门台式电脑排行榜...
  7. 小米手环4怎么使用_小米手环4怎么使用 小米手环4开机方法
  8. 乐融超级电视与鸿蒙系统,乐视超级电视亲笔信回馈乐迷 感谢一路相伴不离不弃...
  9. 浏览历史记录---网上商城Web
  10. 由 method may be static 引发的 Python PEP8 总结