串口接收中断,出现接收包头的第一个字节重复接收的问题
本帖最后由 watercici 于 2018-8-8 20:46 编辑我用串口中断接收下位机的传来的回复包的时候,出现第一个字节重复接收2到3次,不知道这是怎么回事,但是直接将下位机回复的数据传到电脑串口助手的时候确实正常的,所以我不知道自己的代码里面出了什么问题,现在猜估计是溢出中断导致的,还没有验证?所以我想问一下,接收一个字节,读一个字节也会发生溢出中断吗?为什么?
本帖最后由 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);
}
} 不是溢出的问题,有大神知道是怎么回事吗?在线等,谢谢! 比如我的下位机回复的是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
你贴的代码我看不到,不好分析
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:10
这是接收中断的代码,数据是从接收开始出错的 串口5接的设备,发送数据的频率是多高?可以考虑降低一些。
usart4_tx_nbytes(uart5_buffer_data, uart5_index);这个是中断发送,还是查询发送。如果是查询,这里可能会导致串口接收数据丢失。 本帖最后由 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 ;
}
}
} 结贴:应该是溢出的问题,后来莫名其妙的就好了。
页:
[1]