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置位的原因。
应该是你的 RS485-RE 一直 Enable, 才会收到你的发数据. 我设备上串口数据跑了20多个小时 是正常的(即没有接收到发送数据),后来突然报接收数据错误,我仿真看到 收到数据前面加了发送数据帧。无法确定是硬件原因还是软件原因?如果是由RS485线路上阻抗匹配问题引起(数据线只有几米)不知道怎么确定这个原因? soh4th 发表于 2020-8-27 14:13
应该是你的 RS485-RE 一直 Enable, 才会收到你的发数据.
RE是在除了发送之外一直是Enable的。 是的,re除了发送数据之外,一直是使能的
页:
[1]