很多时候,我们使用串口或USB接收数据时,往往不知道PC端会发多长的数据下来,

为了解决这个不定数据接收问题,在此各提供一个解决思路。

串口数据不定接收:

  由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,

由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的ARM单片机。

IDLE就是串口收到一帧数据后,发生的中断。什么是一帧数据呢?比如说给单片机一

次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以

叫做一包数据。

还有一个RXNE中断,当接收到1个字节,就会产生RXNE中断,当接收到一帧数据,就

会产生IDLE中断。比如给单片机一次性发送8个字节,就会产生8次RXNE中断,1次IDLE中断。

这里只写RXNE中断例子,IDLE中断的类似,只是寄存器地址不同,各位可以查手册编写。

eg:

  在中断服务函数里添加一下代码,函数外部定义 buff[ ] 和 i=0 ; 我这里使用的是串口1:

  if(UASART_GetITStatus(UASART1, UASART_IT_RXNE != RESET)) //接收一个字节判断

  {

    buff [i++] = UASART1->DR;       //把接收到的字节保存到数组后,数组下标自加1

  }

  就这么几句代码就可以实现了,buff[ ],就是接收到的数据,i-1 就是数据长度了

=======================================================================

USB不定数据接收:

usb不定数据接收,利用了定时器作为校验来接收,这个方法通用性强,适用于uasart

也适用于usb,还使用于hal库。不过这个方法有一个局限性,就是PC端发送数据过来的时间

间隔不可以太短,否则会出现误判情况。

定时器方法的原理是:先定时一个时间间隔合适的时间,一般几毫秒就可以了,然后在

接收服务函数里把接收到的数据存到buff[ ],i++,接着定时器计数值清0,打开定时器,如果

数据没接受完,每次接收都清空了定时器计数器,使得定时器无法进入定时器中断。如果数据

接收完成了,则过不会清空定时器计数器,进入定时器中断,此时则判断数据已经接收完成,

可以在定时器中断中取出数据和数据长度。

       eg:

这里我是用HAL库作为例子,在usbd_cdc_if.c文件中找到USB接收中断服务函数,在里面

修改代码即可。

  

  

  

  

因为usb发送,每发送最大包是64个字节,而且usb接收可以自己算出接收长度,不过超

过64字节就会出错,所以我这里进行了一个最大包处理。

SM32 USART与USB接收不定数据方法,标准库、HAL库都适用的更多相关文章

  1. STM32 ~ USART接收不定长数据

    IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断.什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据. ...

  2. STM32 HAL库利用DMA实现串口不定长度接收方法

    参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...

  3. STM32之串口DMA接收不定长数据

    STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...

  4. STM32串口接收不定长数据原理与源程序(转)

    今天说一下STM32单片机的接收不定长度字节数据的方法.由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的A ...

  5. STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷

    STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...

  6. STM32 HAL库使用中断实现串口接收不定长数据

    以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:AT\r\nOK\r\n,就只能接收到AT ...

  7. Stm32使用串口空闲中断,基于队列来接收不定长、不定时数据

    串口持续地接收不定长.不定时的数据,把每一帧数据缓存下来且灵活地利用内存空间,下面提供一种方式供参考.原理是利用串口空闲中断和DMA,每当对方发来一帧完整的数据后,串口接收开始空闲,触发中断,在中断处 ...

  8. stm32 usb数据接收与数据发送程序流程分析

    http://blog.csdn.net/u011318735/article/details/17424349 既然学习了USB,那就必须的搞懂USB设备与USB主机数据是怎么通讯的.这里主要讲设备 ...

  9. ThinkPHP中使用ajax接收json数据的方法

    本文实例讲述了ThinkPHP中使用ajax接收json数据的方法.分享给大家供大家参考.具体分析如下: 这里通过ThinkPHP+jquery实现ajax,扩展了下,写了个查询,前台代码如下: 首先 ...

随机推荐

  1. 参数化取值策略Unique

    Unique:主要是强调取值的唯一性,如果到最后没有该值了,LR提供了其他解决方案,如图所示: 此处的下拉列表中提供了三种方式,具体如下: About Vuser,当取值次数超过参数的行数时,忽略脚本 ...

  2. 你必须搞清楚的String,StringBuilder,StringBuffer

    String,StringBuilder 以及 StringBuffer 这三个类的关系与区别一直是 Java 的经典问题,这次就来讲一下关于这三个类的一些知识 一. 简单对比 String : 字符 ...

  3. CF55C. Pie or die

    /* CF55C. Pie or die http://codeforces.com/problemset/problem/55/C 博弈论 乱搞 获胜条件是存在一个棋子到边界的值小于5 */ #in ...

  4. Google Spanner (中文版)

    温馨提示:本论文由厦门大学计算机系林子雨翻译自英文论文,转载请注明出处,仅用于学习交流,请勿用于商业用途. [本文翻译的原始出处:厦门大学计算机系数据库实验室网站林子雨老师的云数据库技术资料专区htt ...

  5. ibatis的批处理

    (1)spring模式:尽管spring已经配置了事务,但以下代码中还是要设置事务,不然batch不会起作用;另外这里虽然设了一下事务处理,但对全局事务并不会造成影响;注:不启用事务将建立多次连接,这 ...

  6. CAD教程----圆的优化命令viewres

    CAD软件为了节省内存加快打开图纸的速度,会在显示圆形的时候,用很粗燥的直线表示园,这时我们可以不节省内存,使用viewres将圆形完整的显示出来. 这个值设置的越大,圆越圆(好绕口!)

  7. linux下添加自定义脚本到开机自启动的方法

    原文链接:http://www.jb51.net/LINUXjishu/183462.html 我的机器有个coreseek服务,但是没加到开启启动中去,导致机房一旦重启了机器,我的服务便不能使用了. ...

  8. Java Pattern Matcher 正则表达式需要转义的字符

    见:http://blog.csdn.net/bbirdsky/article/details/45368709 /** * 转义正则特殊字符 ($()*+.[]?\^{},|) * * @param ...

  9. 51nod 1413:权势二进制

    1413 权势二进制 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 一个十进制整数被叫做权势二进制,当他的十进制 ...

  10. 【零基础入门学习Python笔记013】元祖:戴上了枷锁的列表

    元组:戴上了枷锁的列表 因为和列表是近亲关系.所以元祖和列表在实际使用上是很相似的. 本节主要通过讨论元素和列表究竟有什么不同学习元祖. 元组是不可改变元素的.插入.删除或者排序都不能够.列表能够随意 ...