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

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

如现在来了一帧长度为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. 浏览器和迅雷简单拿到动漫妹子图
  2. Kfold交叉验证心得
  3. Flutter开发之Tooltip提示组件-3(42)
  4. Linux系统.xsesion日志文件,linux系统日志
  5. 抽象的(abstract)方法是否可同时是静态的(static), 是否可同时是本地方法 (native),是否可同时被 synchronized
  6. Kratos技术系列|从Kratos设计看Go微服务工程实践
  7. 3-8Tensor的算术运算编程实例
  8. 旋转矩阵与欧拉角的相互转换及代码
  9. 【信息系统项目管理师】第6章-项目进度管理 知识点详细整理
  10. bzoj4869: [Shoi2017]相逢是问候(欧拉函数+线段树)
  11. 怎么写c++ documentation_球鞋鞋标怎么看真假、有几种 耐克鞋标鉴定方法推荐
  12. ISTQB FL初级认证考试资料(中文)
  13. DeepStream初步学习
  14. 计算机应用专业招聘试讲内容,广东文艺职业学院2018年第二批合同制人员招聘专业技能考核和试讲题目...
  15. 把英文句子颠倒过来的C语言代码
  16. 如何理解“修身齐家治国平天下”这句儒家经典
  17. 光盘安装计算机系统安装教程,光盘重装系统|电脑光盘一键重装系统教程
  18. python打印输出数组中的所有元素
  19. 智慧社区可研究性报告
  20. linux分析gre中断问题,linux – 无法删除GRE隧道

热门文章

  1. 酷比魔方iwork8连接电脑调试adb
  2. ERROR: cannot verify nih.at’s certificate, issued by “/C=US/O=Let‘s Encrypt/CN=R3”,wget报错
  3. 浙大计算机学院研究生读书报告,浙大软件学院软件工程硕士研究生读书报告的相关规定...
  4. Windows7桌面路径修改
  5. Electron的使用笔记之应用程序打开控制台
  6. python logistic步骤_Python api.Logit方法代码示例
  7. 基于多元线性回归的股票分析与预测——R语言
  8. 碳化硅MOSFET、硅MOSFET及IGBT的优缺对比
  9. 使用AJAX做一个页面导航模糊匹配下拉框
  10. 先进制造业的中国之路