历史上的今天
今天是:2024年08月30日(星期五)
2019年08月30日 | STM32F4串口接收(HAL库)使用笔记
2019-08-30 来源:eefocus
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size);
这个是一个类似于串口接收中断使能作用的函数,注释是Receives an amount of data in non blocking mode以非阻塞方式接收大量数据。想要使用此函数接收却不确定能接收到多少数据,则将uint16_t Size写作1,例如:
HAL_UART_Receive_IT(&UartHandle1, (uint8_t *)Rx1Buffer, 1);//通过串口1接收,数据保存到Rx1Buffer,每次接收1个字符。
HAL_UART_RxCpltCallback这个函数看资料是说在接收完成后调用的,所以说每接收一个字符都会调用这个函数,这个函数这么写:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //
{
switch ((uint32_t)(huart->Instance))
{
case (uint32_t)USART1:
{
if(Rx1count==0)
{
Rx1Buffer[0]=Rx1Buffer[lastnum];
lastnum= 0;
}
Rx1count++;
HAL_UART_Receive_IT(huart, (uint8_t *)(Rx1Buffer + Rx1count), 1); //重新使能中断
__HAL_TIM_SET_COUNTER(&Tim5Handle,0); // 清零定时器计数
__HAL_TIM_CLEAR_FLAG(&Tim5Handle, TIM_FLAG_UPDATE|TIM_FLAG_CC2);//清除中断标志
HAL_TIM_Base_Start_IT(&Tim5Handle);
break;
}
其余case略 。
定时器5根据串口波特率来延时一段时间,若延时期间又接收到一个字符,将会再次进入HAL_UART_RxCpltCallback,所以大概估计一下一次可能接收到的数据长度,结合波特率计算一下这个时间即可。
延时完之后:
HAL_UART_Receive_IT(&UartHandle1, (uint8_t *)Rx1Buffer, 1); //使能接收中断
Rx1revflag = 1;
HAL_TIM_Base_Stop_IT(htim);
串口线程:
if(Rx1revflag)
{
Rx1revflag = 0;
Trans_dispose((char*)Rx1Buffer,Rx1count);
lastnum = Rx1count;
memset(Rx1Buffer, 0, Rx1count);
Rx1count = 0;
}
以下是傻瓜式解读:
故而假如第一次收了一段数据为“12345”,收完时Rx1count=5,重新使能中断HAL_UART_Receive_IT(huart, (uint8_t *)(Rx1Buffer + Rx1count), 1); 则下一次接收的字符将存入Rx1Buffer[5],经过串口线程处理之后lastnum = Rx1count=5,清空Rx1Buffer前5个字符,又再次进入HAL_UART_RxCpltCallback这个函数,由于Rx1count=0,则将Rx1Buffer[lastnum]赋值给Rx1Buffer[0],开始下一轮接收。
下一篇:STM32开发 -- 串口详解
史海拾趣
|
一、TPMS技术及其轮胎定位原理 TPMS原理及功能简介:TPMS是汽车轮胎压力检测系统,即“Tire Pressure Monitoring System”的英文缩写。主要用于在汽车行驶时,适时地对轮胎气压进行自动监测,对轮胎漏气造成低胎压和高温高胎压防爆胎进行预 ...… 查看全部问答> |
|
国外的有几个公司但好像没有见到国内的,不知什么原因是技术瓶颈还是国内不屑微小的市场份额????asn.1 到JAVA或者到c 语言的商用编译器哪个好?一般什么价位?望大虾指教,感激不尽… 查看全部问答> |
|
最近在做一个双电源的51系统,是用来控制一个机器人的,电机比较多. 第一次做板,而且制板费昂贵,还是处于学生阶段的小弟希望以小心为上.. 我用的软件是Altium Designer 6.9 1.滴泪是为了防止在转孔时导线和焊接盘断裂,那么是否一定要加滴泪呢? 2. ...… 查看全部问答> |
|
大家好! WinCE 中 OCX的调用问题? Primary dispatch interface 的接口的GUID是不是需要DllRegisterServer的注册,如果需要,怎么注册,不需要的话,外部网页怎 ...… 查看全部问答> |
|
SD卡问题:同样的卡在经过多次Suspend/Resume后存储管理部分读到不同的ID值 如题,在使用同样一张卡,并且在操作过程中卡始终是在设备中的。 在多次Suspend/Resume之后发现会出现通过IOCTL_DISK_GET_STORAGEID读到的ID和之前的不同。 那位曾经遇到过这类问题。… 查看全部问答> |
|
用Visual Studio2008 新建了一个智能设备中的MFC智能设备应用程序。跟EVC建立的MFC应用程序比较了一下,发现vs2008的代码模板好麻烦啊,而且好像不是消息处理机制了,那么在EVC上使用的代码能在VS2008运行吗?现在的教材都是在EVC上开发的,一用vs2 ...… 查看全部问答> |
|
我用CF作为启动盘,通过网络启动VxWorks,我已经用MkBoot将CF做成启动盘了,请问CF中是否已经包含了文件系统?还是需要另外再安装相应的文件系统呢?我想在CF卡中创建一个文本文件,肯定需要文件系统的吧!请大侠们指点小弟,不胜感激!… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:40 编辑 刚才得知自己被选到学校的全国电设大赛校队了,今年暑假集训,由于大二只有自己一个,呵呵,想请教一哈参加过的前辈们该学点什么,已掌握multisim,protel,proteus,擅长汇编,(但据说c语言更好) ...… 查看全部问答> |




