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

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

[复制链接]
kate2005_chen 提问时间:2020-8-27 13:38 /
使用芯片STM32F101 ,usart3  RS485半双工,同样的硬件板子,串口会收到发送出的数据帧,即数据为 发送帧+对方回复帧,有时又收到正确数据,即对方回复帧。一直想不通,请论坛里的大佬们解答。
以下为一、初始化代码:Uart_Initial(USART3,4800,0);
  1. void Uart_Initial(USART_TypeDef* USARTx,u32 BRate,u16 WorkMode)
  2. {               
  3.         u16 WordLength;
  4.         u16 StopBits;
  5.   u16 Parity;
  6.   u16 FlowControl;

  7.         GPIO_InitTypeDef GPIO_InitStructure;
  8.         USART_InitTypeDef USART_InitStructure;
  9.   USART_ClockInitTypeDef USART_ClockInitStructure;        
  10.         
  11.         if(USARTx==USART3)
  12.         {
  13.                 /* Configure USART3 Tx (PB.10) as alternate function push-pull */
  14.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  15.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  16.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  17.                 GPIO_Init(GPIOB, &GPIO_InitStructure);
  18.                
  19.                 /* Configure USART3 Rx (PB.11) as input floating */
  20.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  21.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  22.                 GPIO_Init(GPIOB, &GPIO_InitStructure);
  23.         }        
  24. //0x1010
  25.   WordLength = WorkMode & 0xf000;        
  26.         StopBits = WorkMode & 0x0f00;
  27.         StopBits <<= 4;
  28.         Parity = WorkMode & 0x00f0;
  29.         Parity <<= 4;
  30.         FlowControl = WorkMode & 0x000f;
  31.         FlowControl <<= 8;

  32.         USART_InitStructure.USART_BaudRate = BRate;
  33.         USART_InitStructure.USART_WordLength = WordLength;
  34.         USART_InitStructure.USART_StopBits = StopBits;
  35.         if(Parity==0)
  36.         {                USART_InitStructure.USART_Parity = USART_Parity_No;
  37.         }
  38.         else
  39.         {
  40.          USART_InitStructure.USART_Parity = USART_Parity_Even;//Parity;
  41.         }
  42.         USART_InitStructure.USART_HardwareFlowControl = FlowControl;
  43.         USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  44.         USART_ClockInitStructure.USART_Clock = USART_Clock_Disable;
  45.         USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;
  46.         USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;
  47.         USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;
  48.         /* Configure the USARTx */
  49.         USART_Init(USARTx, &USART_InitStructure);
  50.         USART_ClockInit(USARTx, &USART_ClockInitStructure);

  51.         /* Enable USARTx RX INT*/
  52.         USART_ITConfig(USARTx,USART_IT_RXNE,ENABLE);
  53.         //USART_ITConfig(USARTx,USART_IT_TXE,ENABLE);
  54.         FeedDog();
  55.         /* Enable USARTx */
  56.         USART_Cmd(USARTx, ENABLE);        
  57. }
复制代码

二、中断优先级设置
  1. void NVIC_Configuration(void)
  2. {
  3.     NVIC_InitTypeDef NVIC_InitStructure;

  4.   /* Configure the NVIC Preemption Priority Bits */  
  5.    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  6.   
  7.    /* Enable the USART1 Interrupt */
  8.    NVIC_InitStructure.NVIC_IRQChannel =USART1_IRQn;
  9.          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  10.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  11.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  12.    NVIC_Init(&NVIC_InitStructure);
  13.    /* Configure the NVIC Preemption Priority Bits */  
  14.    //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

  15.    /* Enable the USART2 Interrupt */
  16.    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
  17.          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  18.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  19.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  20.    NVIC_Init(&NVIC_InitStructure);

  21.    /* Enable the USART3 Interrupt */
  22.    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
  23.          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
  24.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  25.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  26.    NVIC_Init(&NVIC_InitStructure);

  27.       /* Enable the USART3 Interrupt */
  28.    NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn;
  29.          NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  30.    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  31.    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  32.    NVIC_Init(&NVIC_InitStructure);

  33.             /* Enable the TIM2 Interrupt */
  34.            NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  35.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  36.            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  37.            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  38.            NVIC_Init(&NVIC_InitStructure);
  39.                
  40.           /* Enable the TIM3 Interrupt */
  41.           NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  42.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  43.            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  44.            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  45.            NVIC_Init(&NVIC_InitStructure);

  46.     /* Enable the TIM4 Interrupt */
  47.            NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;
  48.           NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//1
  49.            NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  50.            NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  51.            NVIC_Init(&NVIC_InitStructure);        
  52. }
复制代码

三、中断处理
  1. void USART3_IRQHandler(void)
  2. {  
  3.   static u8 TxCounter3;
  4.         u8 TempChar;
  5.         uint32_t tempint;

  6.         static u8 aaai;
  7.         //RUN_LED_1
  8.      if (USART_GetFlagStatus(USART3, USART_FLAG_PE) != RESET)
  9.     {
  10.         USART_ReceiveData(USART3);
  11.       USART_ClearFlag(USART3, USART_FLAG_PE);
  12.     }
  13.       
  14.     if (USART_GetFlagStatus(USART3, USART_FLAG_ORE) != RESET)
  15.     {
  16.         USART_ReceiveData(USART3);
  17.       USART_ClearFlag(USART3, USART_FLAG_ORE);
  18.     }
  19.      
  20.      if (USART_GetFlagStatus(USART3, USART_FLAG_FE) != RESET)
  21.     {
  22.         USART_ReceiveData(USART3);
  23.        USART_ClearFlag(USART3, USART_FLAG_FE);
  24.     }
  25.           if (USART_GetFlagStatus(USART3, USART_FLAG_LBD) != RESET)
  26.     {
  27.        USART_ClearFlag(USART3, USART_FLAG_LBD);
  28.     }
  29.         if(USART_GetFlagStatus(USART3,USART_IT_RXNE)==SET)
  30.         {  
  31.                   USART_ClearFlag(USART3, USART_FLAG_RXNE);//USART3->SR &= ~USART_FLAG_RXNE;
  32.       USART_ClearITPendingBit(USART3, USART_IT_RXNE);               
  33.                         tempint = USART_ReceiveData(USART3);
  34.                    TempChar = (u8)(tempint&0x00ff);        
  35.                    *usart_user_3.p_buff = TempChar;

  36.                   usart_user_3.p_buff++;
  37.                    usart_user_3.rcv_num++;        
  38.                
  39.                    if(usart_user_3.rcv_num >= (BUF_SPACE-1))
  40.                    {
  41.                            usart_user_3.p_buff = usart_user_3.buff;
  42.                           usart_user_3.rcv_num = 0;
  43.                    }            
  44.                    usart_user_3.rcv_overtime_add = 0;
  45.         }

  46.         
  47.         if(USART_GetITStatus(USART3, USART_IT_TXE) != RESET)
  48.                 {   
  49.                         /* Write one byte to the transmit data register */
  50.                         USART_SendData(USART3, usart_user_3.send_buff[TxCounter3++]);

  51.                         if(TxCounter3 == usart_user_3.send_num )
  52.                         {                                USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
  53.                                 TxCounter3 = 0;
  54.                         }
  55.                 }
  56. }
复制代码

四、数据处理
中断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置位的原因。

收藏 评论4 发布时间:2020-8-27 13:38

举报

4个回答
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除了发送数据之外,一直是使能的

所属标签

相似问题

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