STM32串列埠中斷接收方式詳細比較
阿新 • • 發佈:2019-01-10
本例程通過PC機的串列埠除錯助手將資料傳送至STM32,STM32通過SP3232晶片採用中斷接收方式完成,然後接收資料後將所接收的資料又傳送至PC機。
缺點:無快取區,並且對資料的正確性沒有判斷,資料量稍大可能導致資料丟失 。
例項二:
這是加了資料頭和資料尾的接收方式,資料頭和尾的個數可增加,此處只用於除錯之用。中斷函式用於接收資料以及判斷資料的頭尾,第二個函式在main函式裡按照查詢方式執行。
優點:較簡單,採用快取區接收,對提高資料的正確行有一定的改善 。
缺點:要是第一次資料接收錯誤,回不到初始化狀態,必須復位操作 。
採用FIFO方式接收資料,由0x3F可知此處最大接收量為64個,可變,中斷函式只負責收,另一函式在main函式裡執行,FIFO方式傳送。
優點:傳送和接收都很自由,中斷佔用時間少,有利於MCU處理其它。
缺點:對資料的正確性沒有判斷,一概全部接收。
例項四:
優點:適合打包傳輸,穩定性和可靠性很有保證,可隨意傳送,自動挑選有效資料。
缺點:快取區資料長度要根據“包裹”長度設定, 要是多次接收後無頭無尾,到有頭有尾的那一段資料恰好跨越快取區最前和最後位置時,可能導致本次資料丟失,不過這種情況幾乎沒有可能。
例項一:
void USART1_IRQHandler(u8 GetData) { u8 BackData; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中斷產生 { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中斷標誌. GetData = UART1_GetByte(BackData); //也行GetData=USART1->DR; USART1_SendByte(GetData); //傳送資料 GPIO_SetBits(GPIOE, GPIO_Pin_8 ); //LED閃爍,接收成功傳送完成 delay(1000); GPIO_ResetBits(GPIOE, GPIO_Pin_8 ); } }
這是最基本的,將資料接收完成後又傳送出去,接收和傳送在中斷函式裡執行,main函式裡無其他要處理的。
優點:簡單,適合很少量資料傳輸。缺點:無快取區,並且對資料的正確性沒有判斷,資料量稍大可能導致資料丟失 。
例項二:
void USART2_IRQHandler() { if(USART_GetITStatus(USART2,USART_IT_RXNE) != RESET) //中斷產生 { USART_ClearITPendingBit(USART2,USART_IT_RXNE); //清除中斷標誌 Uart2_Buffer[Uart2_Rx_Num] = USART_ReceiveData(USART2); Uart2_Rx_Num++; } if((Uart2_Buffer[0] == 0x5A)&&(Uart2_Buffer[Uart2_Rx_Num-1] == 0xA5)) //判斷最後接收的資料是否為設定值,確定資料正確性 Uart2_Sta=1; if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢位 { USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR USART_ReceiveData(USART2); //讀DR } } if( Uart2_Sta ) { for(Uart2_Tx_Num=0;Uart2_Tx_Num < Uart2_Rx_Num;Uart2_Tx_Num++) USART2_SendByte(Uart2_Buffer[Uart2_Tx_Num]); //傳送資料 Uart2_Rx_Num = 0; //初始化 Uart2_Tx_Num = 0; Uart2_Sta = 0; }
優點:較簡單,採用快取區接收,對提高資料的正確行有一定的改善 。
缺點:要是第一次資料接收錯誤,回不到初始化狀態,必須復位操作 。
例項三:
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 &= 0x3F; //判斷是否計數到最大 } if(USART_GetFlagStatus(USART2,USART_FLAG_ORE) == SET) //溢位 { USART_ClearFlag(USART2,USART_FLAG_ORE); //讀SR USART_ReceiveData(USART2); //讀DR } } if( Uart2_Tx != Uart2_Rx ) { USART2_SendByte(Uart2_Buffer[Uart2_Tx]); //傳送資料 Uart2_Tx++; Uart2_Tx &= 0x3F; //判斷是否計數到最大 }
優點:傳送和接收都很自由,中斷佔用時間少,有利於MCU處理其它。
缺點:對資料的正確性沒有判斷,一概全部接收。
例項四:
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 } } 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; }資料採用資料包的形式接收,接收後存放於快取區,通過判斷資料頭和資料尾(可變)來判斷資料的“包”及有效性,中斷函式用於接收資料和判斷頭尾以及資料包長度,另一函式在main函式裡執行,負責傳送該段資料。
優點:適合打包傳輸,穩定性和可靠性很有保證,可隨意傳送,自動挑選有效資料。
缺點:快取區資料長度要根據“包裹”長度設定, 要是多次接收後無頭無尾,到有頭有尾的那一段資料恰好跨越快取區最前和最後位置時,可能導致本次資料丟失,不過這種情況幾乎沒有可能。