|
超時接收完成。在一些沒有結束位和不固定長度的情況下可以使用。可移植各平臺單片機。- =。~~
- #define MaxLen 255 //最大長度
- u16 RecTimNum=0; //接收計時
- FunctionalState RecStart=DISABLE; //接收啟動標志位
- FunctionalState RecFinish=DISABLE; //接收完成標志位
- u8 ReceiveBuf[MaxLen]={0}; //接收緩沖區
- u8 BufLen=0; //接收長度
- /* 超時接收完成函數 定時器中斷1ms進入一次 */
- void Rec_TimOut(void)
- {
- if(RecStart==ENABLE)
- {
- if(++RecTimNum==5) //5ms沒有接收到數據默認接收完成
- {
- RecTimNum=0; //計時清零
- RecStart=DISABLE;
- RecFinish=ENABLE; //接收完成標志位置位
- //接收完成處理函數
- Uart_Send(ReceiveBuf,BufLen); //本段為將接收到的數據重新發送回串口。回環測試
- BufLen=0; //長度清零
- RecFinish=DISABLE; //接受完成
- }
- }
- }
- /* UART接收函數 放在串口接收中斷*/
- void Uart_Receive()
- {
- u8 temp;
- if(RecStart==DISABLE) //第一次進入串口中斷
- {
- RecStart=ENABLE; //接收啟動標志
- }
- RecTimNum=0; //每次重新進入串口接收中斷時,清零計數,表示還未接收完成
- temp = UART_ReceiveData8(); //從緩沖區取出數據
- ReceiveBuf[BufLen++]=temp; //接收緩沖區
- }
復制代碼
測試結果如下:

|
|