SM32 USART与USB接收不定数据方法,标准库、HAL库都适用
很多时候,我们使用串口或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库都适用的更多相关文章
- STM32 ~ USART接收不定长数据
IDLE中断什么时候发生? IDLE就是串口收到一帧数据后,发生的中断.什么是一帧数据呢?比如说给单片机一次发来1个字节,或者一次发来8个字节,这些一次发来的数据,就称为一帧数据,也可以叫做一包数据. ...
- STM32 HAL库利用DMA实现串口不定长度接收方法
参考:https://blog.csdn.net/u014470361/article/details/79206352 我这里使用的芯片是 F1 系列的,主要是利用 DMA 数据传输方式实现的,在配 ...
- STM32之串口DMA接收不定长数据
STM32之串口DMA接收不定长数据 引言 在使用stm32或者其他单片机的时候,会经常使用到串口通讯,那么如何有效地接收数据呢?假如这段数据是不定长的有如何高效接收呢? 同学A:数据来了就会进入串口 ...
- STM32串口接收不定长数据原理与源程序(转)
今天说一下STM32单片机的接收不定长度字节数据的方法.由于STM32单片机带IDLE中断,所以利用这个中断,可以接收不定长字节的数据,由于STM32属于ARM单片机,所以这篇文章的方法也适合其他的A ...
- STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷
STM32使用串口1配合DMA接收不定长数据,减轻CPU载荷 http://www.openedv.com/thread-63849-1-1.html 实现思路:采 用STM32F103的串口1,并配 ...
- STM32 HAL库使用中断实现串口接收不定长数据
以前用DMA实现接收不定长数据,DMA的方法接收串口助手的数据,全部没问题,不过如果接收模块返回的数据,而这些数据如果包含回车换行的话就会停止接收,例如接收:AT\r\nOK\r\n,就只能接收到AT ...
- Stm32使用串口空闲中断,基于队列来接收不定长、不定时数据
串口持续地接收不定长.不定时的数据,把每一帧数据缓存下来且灵活地利用内存空间,下面提供一种方式供参考.原理是利用串口空闲中断和DMA,每当对方发来一帧完整的数据后,串口接收开始空闲,触发中断,在中断处 ...
- stm32 usb数据接收与数据发送程序流程分析
http://blog.csdn.net/u011318735/article/details/17424349 既然学习了USB,那就必须的搞懂USB设备与USB主机数据是怎么通讯的.这里主要讲设备 ...
- ThinkPHP中使用ajax接收json数据的方法
本文实例讲述了ThinkPHP中使用ajax接收json数据的方法.分享给大家供大家参考.具体分析如下: 这里通过ThinkPHP+jquery实现ajax,扩展了下,写了个查询,前台代码如下: 首先 ...
随机推荐
- 2019年北航OO第四单元(UML任务)及学期总结
第四单元两次作业总结 第十三次作业 需求分析 本次作业需要完成一个UML类图解析器,所需要解析的只有符合UML标准和能够在Java 8中复现的UML类图.查询指令存在两种:仅与所查对象有关的指令,以及 ...
- (5)全局异常捕捉【从零开始学Spring Boot】
在一个项目中的异常我们我们都会统一进行处理的,那么如何进行统一进行处理呢? 新建一个类GlobalDefaultExceptionHandler, 在class注解上@ControllerAdvice ...
- BA--空调系统一次泵和二次泵区别
通常来说,空调系统是按照满负荷设计的,但实际运行中,满负荷运行的 时间不足 3% ,空调设备绝大部分时间内在远低于额定负荷的情况下运转.在 部分负荷下,虽然冷水机组可以根据实际负荷调节相应的冷量输出, ...
- 今天我也用上了阿里云的Centos
Redis官方不支持Windows,第三方实现的64位服务端不稳定,因此在我的忽悠之下,公司出钱买了个阿里云的Centos7,4G内存,30G硬盘.现在我也可以真真正正的玩Centos了,python ...
- java书籍推荐:《Java SE 6 技術手册》
Java SE 6 技術手册 或 Java SE 6 技術手册 Java SE 6 技術手册 為什麼選擇用 Markdown?仅仅是單純把文件又一次排版太無聊了,不如趁這個機會學些新東西.所以我就藉 ...
- oracle实现查询每个部门的员工工资排在前三的员工的基本信息具体举例
--先删除原先存在的表: drop table emp; --创建表emp create table emp ( deptno number, ename varchar2(20), sal numb ...
- [Android中级]使用Commons-net-ftp来实现FTP上传、下载的功能
本文属于学习分享,如有雷同纯属巧合 利用业余时间.学习一些实用的东西,假设手又有点贱的话.最好还是自己也跟着敲起来. 在android上能够通过自带的ftp组件来完毕各种功能.这次是由于项目中看到用了 ...
- 英语发音规则---H字母
英语发音规则---H字母 一.总结 一句话总结: 1.H发[h]音? hot [hɒt] adj. 热的 house [haʊs] n. 住宅 head [hed] n. 头:头痛 hat [hæt] ...
- linux HBA 卡驱动安装
系统环境操作系统 : RHEL5.0设备 DL580G5 HBA 卡:Qlogic 2343连接存储: EVA8100---------------------------------------- ...
- windows命令行方式下打印和设置PATH变量
点击开始菜单,运行=>cmd打印当前变量:echo %PATH%结果:C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;d:\PRO ...