你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

关于STM32cubemx 串口如何中断接收发来的不定长数据

[复制链接]
张亚飞 提问时间:2017-6-1 16:39 /
我用HAL_UART_Receive_IT(&huart2,RxBuffer,10); 这个函数接收串口发来的数据,然后在void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)  中处理数据并开启下一次中断。  现在经过实际测试是HAL_UART_Receive_IT()函数中第三个接收数据长度的参数如果设置短的话片子容易死掉。接收长度设置长的话,如果一次过来的数据不够数量串口继续在那等着。这两种情况肯定与实际情况不符。  求助一个各位达人,如果做到对方发来多少字节,可以在串口中接收同样的字节数,然后处理。
收藏 评论47 发布时间:2017-6-1 16:39

举报

47个回答
creep 回答时间:2017-6-1 17:17:48
Cube下实现串口+DMA+空闲中断接收不定长数据
https://www.stmcu.org.cn/module/ ... &fromuid=394920
(出处: 意法半导体STM32/STM8技术社区)
andrewsss 回答时间:2018-11-13 15:35:37
/*这是开启串口中断后,串口1和串口3之间互相通信的程序,在main里写的回调函数,里面的变量都是全局变量,注意注释里说的串口发送完数据就中断,立马存到缓冲区,中断比存储要快,所以能存完串口的所有数据,在进行中断接收时,必须先开启中断接收*/

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
        //UNUSED(huart);
       
        if(huart->Instance == USART1)
        {               
                        //串口发送完数据就中断,立马存到缓冲区,中断比存储要快,所以能存完串口的所有数据
                        //然后发送完后,继续开启中断接收函数
                        RxBuffer1[RxCounter1++]=RxTemp1;   
                        RxBuffer1[RxCounter1++]=0;
                        RxCounter1=0;
                        HAL_UART_Transmit(&huart3,RxBuffer1,strlen(RxBuffer1),100);
                  HAL_UART_Receive_IT(&huart1,&RxTemp1,1);
               
        }
        if(huart->Instance == USART3)
        {
               

                        RxBuffer3[RxCounter3++]=RxTemp3;
                        RxBuffer3[RxCounter3++]=0;
                        RxCounter3=0;
                        HAL_UART_Transmit(&huart1,RxBuffer3,strlen(RxBuffer3),100);
                        HAL_UART_Receive_IT(&huart3,&RxTemp3,1);
                               
        }
}
张亚飞 回答时间:2017-6-1 17:28:18
creep 发表于 2017-6-1 17:17
Cube下实现串口+DMA+空闲中断接收不定长数据
https://www.stmcu.org.cn/module/forum/forum.php?mod=viewthread ...

学到了
张亚飞 回答时间:2017-6-1 18:25:48
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 怎么实现同样的功能呢。
creep 回答时间:2017-6-1 20:29:46
张亚飞 发表于 2017-6-1 18:25
用库函数的时候可以用下面的代码接收数据
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接 ...

hal里面直接有中断函数的处理和状态清除。cubemx生成里面应该有中断函数部分吧。
张亚飞 回答时间:2017-6-2 08:33:09
creep 发表于 2017-6-1 20:29
hal里面直接有中断函数的处理和状态清除。cubemx生成里面应该有中断函数部分吧。 ...

cubemx里边的中断接收函数只能定长接收,如果不定长只能用dma加串口中断接收好像还不如用库函数来的方便的。
zhao.zhao 回答时间:2017-6-2 08:58:40
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.
张亚飞 回答时间:2017-6-2 09:49:45
zhao.zhao 发表于 2017-6-2 08:58
HAL_UART_Receive_IT(&huart2,RxBuffer,10);
把10改成1,因为你的数据是不定长度的,接收函数写在串口接收 ...

这样做你试过吗? 现在我实验的结果是如果中断接收函数的长度改为1 的话,我发送超过一个字节的数据,片子会死掉。
zhao.zhao 回答时间:2017-6-2 10:10:02
试过的,数据接收帧长度不同,但是每个数据帧间隔的时间较长,所以这个方法是可行的。
如果发送超过一个字节,片子会死掉,那很可能是设置的问题,HAL库其实已经帮我们考虑了很全面了。
还有提醒一下,如果你的程序有很多警告的话,建议你注意一点,有些警告没关系的,有些警告会有问题的。
我已经养成习惯了,规范语法,基本可以做到一个警告也没有,也可以避免一些陷阱。
废鱼 回答时间:2017-6-2 10:22:20
程序应该是没有死掉,估计是溢出导致。楼主是否按照楼上所述加如了回调函数。
张亚飞 回答时间:2017-6-2 10:55:06
zhao.zhao 发表于 2017-6-2 10:10
试过的,数据接收帧长度不同,但是每个数据帧间隔的时间较长,所以这个方法是可行的。
如果发送超过一个字 ...

一语惊醒我了,我按照教程在发送函数后边判断if(HAL_UART_Transmit_IT(&huart2,(uint8_t*) Uart2Data,1) !=halok) 执行了Error_Handler() 函数,并且出现的这个警告没有处理。导致出现上边的问题。感谢提醒!
张亚飞 回答时间:2017-6-2 11:16:58
zhao.zhao 发表于 2017-6-2 10:10
试过的,数据接收帧长度不同,但是每个数据帧间隔的时间较长,所以这个方法是可行的。
如果发送超过一个字 ...

现在问题是HAL_UART_Receive_IT(&huart1,&Rx2Buffer,1); 这个函数当我发送三个字节的时候,这个函数只接受第一个字节,后两个字节丢了。
张亚飞 回答时间:2017-6-2 11:18:15
安 发表于 2017-6-2 10:22
程序应该是没有死掉,估计是溢出导致。楼主是否按照楼上所述加如了回调函数。 ...

回调函数肯定加了。问题是定长接收一个字节, 我发送三个字节,那后两个字节就丢了。
zhao.zhao 回答时间:2017-6-2 11:21:25
你进串口中断后,马上要把 Rx2Buffer 这个数据保存在数组中的,数组最好开大一些,要不数据放不下。
张亚飞 回答时间:2017-6-2 14:08:42
zhao.zhao 发表于 2017-6-2 11:21
你进串口中断后,马上要把 Rx2Buffer 这个数据保存在数组中的,数组最好开大一些,要不数据放不下。 ...

理解不了你的做法。进串口中断后把Rx2Buffer这个数据保存到数组没有问题。 问题是我发送了三个字节,接收函数只接受一个字节。我把这一个字节保存到数组中了,丢了另外两个。 没有意义啊。
1234下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版