收到的数据头尾是对的,就是数据错位,有时还少收。
这种原因,首先头0xFA 数据正常,表示波特率是正常的,其原因是程序执行的时候有事件打断接收函数
处理方法一,把串口的中断优先级调到最高 0
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; // 设置中断来源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 7; // 设置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 设置子优先级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
处理方法二,用DMA接收串口数据
void usart2_receive(void)
{
uint16_t buff_length;
buff_length=DMA_GetCurrDataCounter(DMA1_Channel6);/* 获取接收到的数据长度 单位为字节*/
DMA_Cmd(DMA1_Channel6, DISABLE); /* 暂时关闭dma,数据尚未处理 */
USART2_data.USART_LEN = USART2_TEMP_LEN -(u16)buff_length; /* 获取数据长度 */
DMA_ClearFlag(DMA1_FLAG_TC6); /* 清DMA标志位 */
DMA_SetCurrDataCounter(DMA1_Channel6,USART2_TEMP_LEN);/* 重新赋值计数值,必须大于等于最大可能接收到的数据帧数目 */
// usart2_RX_data[RX2]=USART2_data;
USART2_task(&USART2_data);
DMA_Cmd(DMA1_Channel6, ENABLE); /*打开DMA*/
}
HK的串口空闲中断启动有点问题,需要先用读取中断,再转换成空闲中断
if(USART_GetITStatus(USART2,USART_IT_IDLE)!=RESET) //空闲中断触发
{
//接收数据
usart2_receive(); //取出接收数据包并处理函数
USART_ReceiveData(USART2); //清除空闲中断标志位(接收函数有清标志位的作用)
USART_ITConfig(USART2, USART_IT_IDLE, DISABLE); //关闭空闲中断
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); //开启读取中断
}
else if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET) //空闲中断触发
{
usart2_receive();
USART_ReceiveData(USART2); //清空标志
}else
{
USART_ReceiveData(USART2); //清除空闲中断标志位(接收函数有清标志位的作用)
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); //开启空闲中断
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE);
}