我用的是str710的片子,用的是串口2,现在有个问题,就是在接收数据时假如一次接收25个字节的一帧数据,有时会出现前面几个字节丢失了,这种现像时有时无,出现概率大约为10%,我的串品设置如下: USART_Init(UART2,9600, UART_NO_PARITY,UART_1_StopBits,UARTM_8D);
void USART_Init(UART_TypeDef *UARTx, u32 BaudRate, UARTParity_TypeDef Parity, UARTStopBits_TypeDef StopBits, UARTMode_TypeDef Mode) { UART_Init(UARTx); UART_FifoConfig(UARTx, ENABLE); // Enable FIFOs UART_FifoReset(UARTx, UART_RxFIFO); // Reset the UART_RxFIFO UART_FifoReset(UARTx, UART_TxFIFO); // Reset the UART_TxFIFO UART_LoopBackConfig(UARTx, DISABLE); // Disable Loop Back UART_Config(UARTx, BaudRate, Parity,StopBits,Mode); UART_ItConfig(UARTx,UART_RxHalfFull,ENABLE); //接受半满中断 UART_RxConfig(UARTx, ENABLE); // Enable Rx UART_OnOffConfig(UARTx, ENABLE);
}
void UART2_IRQHandler(void) //UART2口接收到MC55应答后产生中断,发送信号量SEM_Read告诉UartTask任务收到MC55的应答 { u16 stat; u8 Timeout; stat=UART_FlagStatus(UART2); if(stat&0x00C0) Timeout=0; else Timeout=100; while(stat&1) { stat=UART_ByteReceive(UART2,&command.Ptr[command.Top],255); command.Top++; command.Top%=UART0_MODE_R; } //将接收到的数据放入command.Ptr中,即放入接收缓冲RX2_buff中 Fin_Rev(Timeout,SEM_Read,UART2);//发送信号量SEM_Read告诉UartTask任务收到应答数据 }
void Fin_Rev(u8 Timeout,OS_EVENT *p,UART_TypeDef *UARTx) { if(!Timeout) { UART_ItConfig(UARTx,UART_TimeOutNotEmpty,DISABLE); UART_ItConfig(UARTx,UART_TimeOutIdle,DISABLE); UART_FifoReset(UARTx, UART_RxFIFO); OSSemPost(p);//如果空超时表示接收完成 } else { UART_ItConfig(UARTx,UART_TimeOutNotEmpty,ENABLE); UART_ItConfig(UARTx,UART_TimeOutIdle,ENABLE); } } |