错误分析
用的HAL库有丢包问题,
定义void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(huart == &huart1)
{
log_u("********************* huart1 err ********************************* \r\n");
switch(huart->ErrorCode)
{
case HAL_UART_ERROR_NONE:
log_u("HAL_UART_ERROR_NONE\r\n");
break;
case HAL_UART_ERROR_PE:
log_u("HAL_UART_ERROR_PE\r\n");
break;
case HAL_UART_ERROR_NE:
log_u("HAL_UART_ERROR_NE\r\n");
break;
case HAL_UART_ERROR_FE:
log_u("HAL_UART_ERROR_FE\r\n");
break;
case HAL_UART_ERROR_ORE:
log_u("HAL_UART_ERROR_ORE\r\n");
break;
case HAL_UART_ERROR_DMA:
log_u("HAL_UART_ERROR_DMA\r\n");
break;
default:
log_u("other\r\n");
break;
}
huart->RxState = HAL_UART_STATE_READY;
HAL_UART_Receive_IT( &huart1 , RxdBuff1, MAX_BUFFER);
for(i=0; i<MAX_BUFFER; i++)
{
RxdBuff1[i] = 0;
}
}
}
错误日志为
[14:15:04]********************* huart1 err *********************************
[14:15:04]HAL_UART_ERROR_NE
[14:15:04]********************* huart1 err *********************************
[14:15:04]other
[14:15:04]********************* huart1 err *********************************
[14:15:04]HAL_UART_ERROR_ORE
[14:15:04]********************* huart1 err *********************************
[14:15:04]HAL_UART_ERROR_ORE
报HAL_UART_ERROR_NE错误
查看stm32数据手册
位 2 NF:检测到噪声标志 (Noise detected flag)
当在接收的帧上检测到噪声时,该位由硬件置 1。该位由软件序列清零(读入 USART_SR 寄
存器,然后读入 USART_DR 寄存器)。
0:未检测到噪声
1:检测到噪声
注意: 如果 EIE 位置 1,则在进行多缓冲区通信时,该位不会生成中断,因为该位出现的时间与
本身生成中断的 RXNE 位因 NF 标志而生成的时间相同。
注意: 当线路无噪声时,可以通过将 ONEBIT 位编程为 1 提高 USART 对偏差的容差来禁止
NF 标志(请参见第 695 页的第 26.3.5 节: USART 接收器对时钟偏差的容差)。
将ONEBIT设置为1之后,错误率减少但是仍然存在。