天天看點

序列槽USART UART 接收結束标志是怎麼回事 這是一種自己定義的協定 沒有通用協定

原文連結:http://www.openedv.com/posts/list/53847.htm

f(USART_RX_STA&0x40)

                {

                    if(Res!=0x0a)

                    {

                        USART_RX_STA=0;//

                    }

                    else 

                    {

                        USART_RX_STA|=0x80;

                    }

                }

=======================================

關于原子曆程裡面的這段函數  如果資料包裡含有0x01 0x02 0x03  0x0d 0x03 0x05 0x0d 0x0a 這種資料是不是就接收不到我想要的資料了啊  有點疑問

最佳答案

毫無疑問是的, 

0D 0A這是自行定義的一種資料幀結束标志,不定義這個不沒法判斷你這一幀資料什麼時候結束了, 

0D 0A是什麼東西咧,它就是我們的Enter鍵的ASCII碼, 0D回車,0A換行 

像在windows超級終端裡一條資料輸入完按回車正好來了個0D 0A,表示資料發完了 

序列槽如何檢測資料接收完畢或序列槽接收逾時,這個問題是個老大難問題,沒有好的協定支援,就要浪費單片機大量的資源去解決這個問題。 

比如浪費一個定時器,每次在中斷裡接到一個位元組就開啟定時器去記時,9600大概1MS一個位元組,定時器到3MS中斷檢查有沒收到資料了就表示資料幀結束了, 

又比如序列槽綁在DMA通道上,通過序列槽的空閑中斷來判斷接收完成 

問題在于現在有大量的工業通訊協定如MODBUS等沒有幀結束标志,實在令人發指

繼續閱讀