watercici 发表于 2018-8-8 19:59:15

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

本帖最后由 watercici 于 2018-8-8 20:46 编辑

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


watercici 发表于 2018-8-9 10:10:29

本帖最后由 watercici 于 2018-8-17 16:21 编辑

huangyanga 发表于 2018-8-9 10:04
你贴的代码我看不到,不好分析
void UART5_IRQHandler(void)
{   

if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
    USART_ReceiveData(UART5);
    USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
}

if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)
{
      
      uart5_index = uart5_index >= SIZE_REPLY_MAX ? 0 : uart5_index;
      uart5_buffer_data = USART_ReceiveData(UART5);
            USART_ClearITPendingBit(UART5, USART_IT_RXNE);               
      }
}

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
你贴的代码我看不到,不好分析

void UART5_IRQHandler(void)
{   

if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
    USART_ReceiveData(UART5);
    USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
}

if(USART_GetITStatus(UART5, USART_IT_RXNE) != RESET)
{
      
      uart5_index = uart5_index >= SIZE_XRAY_REPLY_MAX ? 0 : uart5_index;
      uart5_buffer_data = USART_ReceiveData(UART5);
              USART_ClearITPendingBit(UART5, USART_IT_RXNE);               

                if(uart5_index>=1 && uart5_buffer_data==0x02 && uart5_buffer_data==0x0D)
                {
      
                  uart5_index += 1;
                  memcpy(p_xray_reply_data, uart5_buffer_data, uart5_index);
                  usart4_tx_nbytes(uart5_buffer_data, uart5_index);
                  
                  xray1_reply_status = 1;
                  uart5_index = 0;
                  
                }
                else if(uart5_index > 21)
                {
                  memset(uart5_buffer_data, 0, SIZE_XRAY_REPLY_MAX);
                  uart5_index = 0;
                }
                else
                {
                  uart5_index++;
                }
      
        }
}

watercici 发表于 2018-8-9 10:11:41

watercici 发表于 2018-8-9 10:10


这是接收中断的代码,数据是从接收开始出错的

发表于 2018-8-9 11:29:30

串口5接的设备,发送数据的频率是多高?可以考虑降低一些。
usart4_tx_nbytes(uart5_buffer_data, uart5_index);这个是中断发送,还是查询发送。如果是查询,这里可能会导致串口接收数据丢失。

jyl518-283289 发表于 2018-8-9 12:41:09

本帖最后由 jyl518-283289 于 2018-8-9 12:43 编辑

watercici 发表于 2018-8-9 10:10
给你个参考,下面接收绝对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 = temp ;
      }
      else if(usart1.rx_start == 1)                //开始接收数据
      {
            usart1.rx_cnt ++;
            usart1.rx_buf = temp ;
      }
    }
}

watercici 发表于 2018-8-17 16:30:19

结贴:应该是溢出的问题,后来莫名其妙的就好了。
页: [1]
查看完整版本: 串口接收中断,出现接收包头的第一个字节重复接收的问题