kate2005_chen 发表于 2020-8-27 13:38:57

RS485串口为什么接收到发送的数据?

使用芯片STM32F101 ,usart3RS485半双工,同样的硬件板子,串口会收到发送出的数据帧,即数据为 发送帧+对方回复帧,有时又收到正确数据,即对方回复帧。一直想不通,请论坛里的大佬们解答。
以下为一、初始化代码:Uart_Initial(USART3,4800,0);
void Uart_Initial(USART_TypeDef* USARTx,u32 BRate,u16 WorkMode)
{               
      u16 WordLength;
      u16 StopBits;
u16 Parity;
u16 FlowControl;

      GPIO_InitTypeDef GPIO_InitStructure;
      USART_InitTypeDef USART_InitStructure;
USART_ClockInitTypeDef USART_ClockInitStructure;      
      
      if(USARTx==USART3)
      {
                /* Configure USART3 Tx (PB.10) as alternate function push-pull */
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(GPIOB, &GPIO_InitStructure);
               
                /* Configure USART3 Rx (PB.11) as input floating */
                GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                GPIO_Init(GPIOB, &GPIO_InitStructure);
      }      
//0x1010
WordLength = WorkMode & 0xf000;      
      StopBits = WorkMode & 0x0f00;
      StopBits <<= 4;
      Parity = WorkMode & 0x00f0;
      Parity <<= 4;
      FlowControl = WorkMode & 0x000f;
      FlowControl <<= 8;

      USART_InitStructure.USART_BaudRate = BRate;
      USART_InitStructure.USART_WordLength = WordLength;
      USART_InitStructure.USART_StopBits = StopBits;
      if(Parity==0)
      {                USART_InitStructure.USART_Parity = USART_Parity_No;
      }
      else
      {
         USART_InitStructure.USART_Parity = USART_Parity_Even;//Parity;
      }
      USART_InitStructure.USART_HardwareFlowControl = FlowControl;
      USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
      USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
      USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
      USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
      USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
      /* Configure the USARTx */
      USART_Init(USARTx, &USART_InitStructure);
      USART_ClockInit(USARTx, &USART_ClockInitStructure);

      /* Enable USARTx RX INT*/
      USART_ITConfig(USARTx,USART_IT_RXNE,ENABLE);
      //USART_ITConfig(USARTx,USART_IT_TXE,ENABLE);
      FeedDog();
      /* Enable USARTx */
      USART_Cmd(USARTx, ENABLE);      
}
二、中断优先级设置
void NVIC_Configuration(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;

/* Configure the NVIC Preemption Priority Bits */
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

   /* Enable the USART1 Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
   /* Configure the NVIC Preemption Priority Bits */
   //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

   /* Enable the USART2 Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

   /* Enable the USART3 Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

      /* Enable the USART3 Interrupt */
   NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

            /* Enable the TIM2 Interrupt */
         NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
         NVIC_Init(&NVIC_InitStructure);
               
          /* Enable the TIM3 Interrupt */
          NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
         NVIC_Init(&NVIC_InitStructure);

    /* Enable the TIM4 Interrupt */
         NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//1
         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
         NVIC_Init(&NVIC_InitStructure);      
}
三、中断处理
void USART3_IRQHandler(void)
{
static u8 TxCounter3;
      u8 TempChar;
      uint32_t tempint;

      static u8 aaai;
      //RUN_LED_1
   if (USART_GetFlagStatus(USART3, USART_FLAG_PE) != RESET)
    {
      USART_ReceiveData(USART3);
      USART_ClearFlag(USART3, USART_FLAG_PE);
    }
      
    if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
    {
      USART_ReceiveData(USART3);
      USART_ClearFlag(USART3, USART_FLAG_ORE);
    }
   
   if (USART_GetFlagStatus(USART3, USART_FLAG_FE) != RESET)
    {
      USART_ReceiveData(USART3);
       USART_ClearFlag(USART3, USART_FLAG_FE);
    }
          if (USART_GetFlagStatus(USART3, USART_FLAG_LBD) != RESET)
    {
       USART_ClearFlag(USART3, USART_FLAG_LBD);
    }
      if(USART_GetFlagStatus(USART3,USART_IT_RXNE)==SET)
      {
                  USART_ClearFlag(USART3, USART_FLAG_RXNE);//USART3->SR &= ~USART_FLAG_RXNE;
      USART_ClearITPendingBit(USART3, USART_IT_RXNE);               
                        tempint = USART_ReceiveData(USART3);
                   TempChar = (u8)(tempint&0x00ff);      
                   *usart_user_3.p_buff = TempChar;

                  usart_user_3.p_buff++;
                   usart_user_3.rcv_num++;      
               
                   if(usart_user_3.rcv_num >= (BUF_SPACE-1))
                   {
                           usart_user_3.p_buff = usart_user_3.buff;
                        usart_user_3.rcv_num = 0;
                   }            
                   usart_user_3.rcv_overtime_add = 0;
      }

      
      if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
                {   
                        /* Write one byte to the transmit data register */
                        USART_SendData(USART3, usart_user_3.send_buff);

                        if(TxCounter3 == usart_user_3.send_num )
                        {                              USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
                              TxCounter3 = 0;
                        }
                }
}
四、数据处理
中断10ms定时器程序中,定时到80ms,延迟接收结束,处理数据。处理数据不做展开。

问题1.我仿真时就看80ms后的收数据buffer现在200字节,足够大,但是会看到数据前部分就是我发送的数据后面就是接收到的数据。程序得到数据:
发:C2 03 08 33 00 0E 27 52
收:C2 03 08 33 00 0E 27 52 C2 03 1C 00 0C 00 00 00 20 00 00 00 5A 00 8F 00 E8 00 01 00 00 01 61 00 00 00 65 00 52 00 7E 1A A2
正确帧数据应该是
发:C2 03 08 33 00 0E 27 52
收:C2 03 1C 00 0C 00 00 00 20 00 00 00 5A 00 8F 00 E8 00 01 00 00 01 61 00 00 00 65 00 52 00 7E 1A A2
曾以为是硬件问题,但用串口工具收数据,就是看到正确帧数据。说明硬件链路上数据确实正确。
2.是另外一个问题,串口没有开通LIN功能,但是USART_FLAG_ORE会置位,不明白。。。我只能通过清除位来使得串口正常工作,想知道USART_FLAG_ORE置位的原因。

soh4th 发表于 2020-8-27 14:13:42

应该是你的 RS485-RE 一直 Enable, 才会收到你的发数据.

kate2005_chen 发表于 2020-8-27 14:01:58

我设备上串口数据跑了20多个小时 是正常的(即没有接收到发送数据),后来突然报接收数据错误,我仿真看到 收到数据前面加了发送数据帧。无法确定是硬件原因还是软件原因?如果是由RS485线路上阻抗匹配问题引起(数据线只有几米)不知道怎么确定这个原因?

kate2005_chen 发表于 2020-8-27 14:36:13

soh4th 发表于 2020-8-27 14:13
应该是你的 RS485-RE 一直 Enable, 才会收到你的发数据.

RE是在除了发送之外一直是Enable的。

kate2005_chen 发表于 2020-8-27 14:49:28

是的,re除了发送数据之外,一直是使能的
页: [1]
查看完整版本: RS485串口为什么接收到发送的数据?