请问STM32cubemx串口怎么中断接收发来的不定长数据?

2019-07-18 17:20发布

我用HAL_UART_Receive_IT(&huart2,RxBuffer,10); 这个函数接收串口发来的数据,然后在void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)  中处理数据并开启下一次中断。  现在经过实际测试是HAL_UART_Receive_IT()函数中第三个接收数据长度的参数如果设置短的话片子容易死掉。接收长度设置长的话,如果一次过来的数据不够数量串口继续在那等着。这两种情况肯定与实际情况不符。  求助一个各位达人,如果做到对方发来多少字节,可以在串口中接收同样的字节数,然后处理。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
亲爱的娜娜
1楼-- · 2019-07-18 20:38
Cube下实现串口+DMA+空闲中断接收不定长数据
http://www.stmcu.org/module/foru ... &fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)
huaxu2222
2楼-- · 2019-07-19 01:39
亲爱的娜娜 发表于 2019-6-18 12:59
Cube下实现串口+DMA+空闲中断接收不定长数据
http://www.stmcu.org/module/foru ... &fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)

学到了
huaxu2222
3楼-- · 2019-07-19 05:46
 精彩回答 2  元偷偷看……
亲爱的娜娜
4楼-- · 2019-07-19 09:10
hal里面直接有中断函数的处理和状态清除。cubemx生成里面应该有中断函数部分吧。
huaxu2222
5楼-- · 2019-07-19 11:28
亲爱的娜娜 发表于 2019-6-18 13:39
hal里面直接有中断函数的处理和状态清除。cubemx生成里面应该有中断函数部分吧。

cubemx里边的中断接收函数只能定长接收,如果不定长只能用dma加串口中断接收好像还不如用库函数来的方便的。
苏州名之卓
6楼-- · 2019-07-19 11:31
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[COM2_REC_POINT] = Rx2Buffer;
        COM2_REC_POINT++;
        if(COM2_REC_POINT >= COM2_REC_BYTES_MAX) { COM2_REC_POINT = 0; }
    }
}

在主程序内每间隔200mS(这个时间间隔不要太小就行了),比较前后两次的COM2_REC_POINT值,如果值不为0,并且两次值是一样的,就可以基本判断为这次接收的数据结束了,否则再等下一个200MS.

一周热门 更多>