1. 程式人生 > >串列埠接收處理思路

串列埠接收處理思路


/*
From: http://blog.csdn.net/super_demo/article/details/45866675
 資料採用資料包的形式接收,接收後存放於快取區,通過判斷資料頭和資料尾(可變)來判斷資料的“包”及有效性,中斷函式用於接收資料和判斷頭尾以及資料包長度,另一函式在main函式裡執行,負責傳送該段資料。
優點:適合打包傳輸,穩定性和可靠性很有保證,可隨意傳送,自動挑選有效資料。
缺點:快取區資料長度要根據“包裹”長度設定, 要是多次接收後無頭無尾,到有頭有尾的那一段資料恰好跨越快取區最前和最後位置時,可能導致本次資料丟失,不過這種情況幾乎沒有可能。  
 */
void USART2_IRQHandler() {
    if
(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //中斷產生 { USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清除中斷標誌 Uart2_Buffer[Uart2_Rx] = USART_ReceiveData(USART2); Uart2_Rx++; Uart2_Rx &= 0xFF; } if (Uart2_Buffer[Uart2_Rx - 1] == 0x5A) //頭 Uart2_Tx = Uart2_Rx - 1
; if ((Uart2_Buffer[Uart2_Tx] == 0x5A) && (Uart2_Buffer[Uart2_Rx - 1] == 0xA5)) //檢測到頭的情況下檢測到尾 { Uart2_Len = Uart2_Rx - 1 - Uart2_Tx; //長度 Uart2_Sta = 1; //標誌位 } if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) == SET) //溢位 { USART_ClearFlag(USART2, USART_FLAG_ORE); //讀SR
USART_ReceiveData(USART2); //讀DR } } int timer_100ms(void) { if (Uart2_Sta) { for (tx2 = 0; tx2 <= Uart2_Len; tx2++, Uart2_Tx++) USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //傳送資料 Uart2_Rx = 0; //初始化 Uart2_Tx = 0; Uart2_Sta = 0; } return 0; }