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

关于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管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版