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

串口接收中断,出现接收包头的第一个字节重复接收的问题

[复制链接]
watercici 提问时间:2018-8-8 19:59 /
本帖最后由 watercici 于 2018-8-8 20:46 编辑

我用串口中断接收下位机的传来的回复包的时候,出现第一个字节重复接收2到3次,不知道这是怎么回事,但是直接将下位机回复的数据传到电脑串口助手的时候确实正常的,所以我不知道自己的代码里面出了什么问题,现在猜估计是溢出中断导致的,还没有验证?所以我想问一下,接收一个字节,读一个字节也会发生溢出中断吗?为什么?

复制代码


收藏 评论9 发布时间:2018-8-8 19:59

举报

9个回答
watercici 回答时间:2018-8-9 10:10:29
本帖最后由 watercici 于 2018-8-17 16:21 编辑
huangyanga 发表于 2018-8-9 10:04
你贴的代码我看不到,不好分析
  1. void UART5_IRQHandler(void)
  2. {   

  3. if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
  4.   {
  5.     USART_ReceiveData(UART5);
  6.     USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
  7.   }

  8.   if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)
  9. {
  10.       
  11.         uart5_index = uart5_index >= SIZE_REPLY_MAX ? 0 : uart5_index;
  12.         uart5_buffer_data[uart5_index] = USART_ReceiveData(UART5);
  13.               USART_ClearITPendingBit(UART5, USART_IT_RXNE);               
  14.         }
  15. }
复制代码
watercici 回答时间:2018-8-9 08:57:30
不是溢出的问题,有大神知道是怎么回事吗?在线等,谢谢!
watercici 回答时间:2018-8-9 09:59:26
比如我的下位机回复的是02 57 44 4E 0D,用串口助手接收是正确的,可是用STM32接收回来的数据总是02 02 57 44 4E 0D,有时候也会接收成02 02 02 57 44 4E 0D?我实在是不知道什么问题导致的,求指导。查了不是溢出错误,也不是RXNE中断未清除的错误,不知道是什么原因导致的!!!
huangyanga 回答时间:2018-8-9 10:04:12
你贴的代码我看不到,不好分析
watercici 回答时间:2018-8-9 10:10:47
huangyanga 发表于 2018-8-9 10:04
你贴的代码我看不到,不好分析
  1. void UART5_IRQHandler(void)
  2. {   

  3. if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
  4.   {
  5.     USART_ReceiveData(UART5);
  6.     USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
  7.   }

  8.   if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)
  9. {
  10.       
  11.         uart5_index = uart5_index >= SIZE_XRAY_REPLY_MAX ? 0 : uart5_index;
  12.         uart5_buffer_data[uart5_index] = USART_ReceiveData(UART5);
  13.               USART_ClearITPendingBit(UART5, USART_IT_RXNE);                 
  14.   
  15.                 if(uart5_index>=1 && uart5_buffer_data[0]==0x02 && uart5_buffer_data[uart5_index]==0x0D)
  16.                 {
  17.         
  18.                     uart5_index += 1;
  19.                     memcpy(p_xray_reply_data, uart5_buffer_data, uart5_index);
  20.                     usart4_tx_nbytes(uart5_buffer_data, uart5_index);
  21.                     
  22.                     xray1_reply_status = 1;
  23.                     uart5_index = 0;
  24.                   
  25.                 }
  26.                 else if(uart5_index > 21)
  27.                 {
  28.                     memset(uart5_buffer_data, 0, SIZE_XRAY_REPLY_MAX);
  29.                     uart5_index = 0;
  30.                 }
  31.                 else
  32.                 {
  33.                     uart5_index++;
  34.                 }
  35.       
  36.         }
  37. }
复制代码
watercici 回答时间:2018-8-9 10:11:41

这是接收中断的代码,数据是从接收开始出错的
废鱼 回答时间:2018-8-9 11:29:30
串口5接的设备,发送数据的频率是多高?可以考虑降低一些。
usart4_tx_nbytes(uart5_buffer_data, uart5_index);这个是中断发送,还是查询发送。如果是查询,这里可能会导致串口接收数据丢失。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

jyl_518 回答时间:2018-8-9 12:41:09
本帖最后由 jyl518-283289 于 2018-8-9 12:43 编辑
给你个参考,下面接收绝对OK的。
void USART1_IRQHandler(void)    //USART1发送、接收中断函数
{
    uint8 temp;
    IWDG_Feed();

    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    {
        //ch = USART1->DR;
        temp = USART_ReceiveData(USART1);

        if((temp == 0x02) && (usart1.rx_start == 0))                //判断包头
        {
            usart1.rx_start = 1;
            usart1.rx_cnt = 0;
            usart1.rx_buf[usart1.rx_cnt] = temp ;
        }
        else if(usart1.rx_start == 1)                //开始接收数据
        {
            usart1.rx_cnt ++;
            usart1.rx_buf[usart1.rx_cnt] = temp ;
        }
    }
}

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

watercici 回答时间:2018-8-17 16:30:19
结贴:应该是溢出的问题,后来莫名其妙的就好了。

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版