关于STM32cubemx 串口如何中断接收发来的不定长数据
我用HAL_UART_Receive_IT(&huart2,RxBuffer,10); 这个函数接收串口发来的数据,然后在void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)中处理数据并开启下一次中断。现在经过实际测试是HAL_UART_Receive_IT()函数中第三个接收数据长度的参数如果设置短的话片子容易死掉。接收长度设置长的话,如果一次过来的数据不够数量串口继续在那等着。这两种情况肯定与实际情况不符。求助一个各位达人,如果做到对方发来多少字节,可以在串口中接收同样的字节数,然后处理。Cube下实现串口+DMA+空闲中断接收不定长数据
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread&tid=602761&fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)
https://www.stmcu.org.cn/module/forum/thread-611705-1-1.html这个帖子很详细 creep 发表于 2017-6-1 17:17
Cube下实现串口+DMA+空闲中断接收不定长数据
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread ...
学到了 creep 发表于 2017-6-1 17:17
Cube下实现串口+DMA+空闲中断接收不定长数据
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread ...
用库函数的时候可以用下面的代码接收数据
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收数据
{
a=USART_ReceiveData(USART2);
USART_ClearITPendingBit(USART2,USART_IT_RXNE);
}
用stm32cubemx 怎么实现同样的功能呢。 张亚飞 发表于 2017-6-1 18:25
用库函数的时候可以用下面的代码接收数据
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接 ...
hal里面直接有中断函数的处理和状态清除。cubemx生成里面应该有中断函数部分吧。 creep 发表于 2017-6-1 20:29
hal里面直接有中断函数的处理和状态清除。cubemx生成里面应该有中断函数部分吧。 ...
cubemx里边的中断接收函数只能定长接收,如果不定长只能用dma加串口中断接收好像还不如用库函数来的方便的。 HAL_UART_Receive_IT(&huart2,RxBuffer,10);
把10改成1,因为你的数据是不定长度的,接收函数写在串口接收的回调函数内,
HAL_UART_Receive_IT(&huart1,&Rx2Buffer,1);
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)
{
if(UartHandle->Instance==USART2) //
{
COM2_ATCMDretREC = Rx2Buffer;
COM2_REC_POINT++;
if(COM2_REC_POINT >= COM2_REC_BYTES_MAX) { COM2_REC_POINT = 0; }
}
}
在主程序内每间隔200mS(这个时间间隔不要太小就行了),比较前后两次的COM2_REC_POINT值,如果值不为0,并且两次值是一样的,就可以基本判断为这次接收的数据结束了,否则再等下一个200MS. zhao.zhao 发表于 2017-6-2 08:58
HAL_UART_Receive_IT(&huart2,RxBuffer,10);
把10改成1,因为你的数据是不定长度的,接收函数写在串口接收 ...
这样做你试过吗? 现在我实验的结果是如果中断接收函数的长度改为1 的话,我发送超过一个字节的数据,片子会死掉。 试过的,数据接收帧长度不同,但是每个数据帧间隔的时间较长,所以这个方法是可行的。
如果发送超过一个字节,片子会死掉,那很可能是设置的问题,HAL库其实已经帮我们考虑了很全面了。
还有提醒一下,如果你的程序有很多警告的话,建议你注意一点,有些警告没关系的,有些警告会有问题的。
我已经养成习惯了,规范语法,基本可以做到一个警告也没有,也可以避免一些陷阱。 程序应该是没有死掉,估计是溢出导致。楼主是否按照楼上所述加如了回调函数。