串列埠接收處理思路
阿新 • • 發佈:2019-01-22
/*
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;
}