什么是串口通信?
串口,一般指異步串行接口(Serial port),主要用于串行式逐位數據傳輸。串口對于處于嵌入式行業的我們來說,是必不可缺的一部分,在剛開始學習單片機時,我們最先學習的通信接口就是USART(Universal Synchronous/Asynchronous Receiver/Transmitter)——通用同/異步串行接收/發送器。其中最常見的串口通信的時序如下圖:

于是在串口通信就有了起始位、數據位、校驗位、停止位、波特率這幾個參數。
另外,串口通信主要分為RS232、RS422、RS485三種通信方式,之前有系統地講解過,小編這里就不再進行詳細地介紹了。
二、串口通信常見問題及解決
如上所述,串口作為我們日常開發時的非常重要的一個角色,我們也時常會碰到很多問題,深受各種折磨,接下來我們就來說說平時串口通信中常見的問題以及解決方法。

通常我們調試串口通信碰到問題時,需要用到一個USB轉TTL、杜邦線(導線)等工具,首先我們應當保證自己的工具是正常的,可以通過以下方法自測:
1、將USB轉TTL中的TX、RX使用杜邦線或是跳線帽短接,打開串口調試工具,例如XCOM、SSCOM等,將波特率、停止位、校驗位等參數調至即將需要通信的模塊的參數,再去隨意發送一些數據,通常筆者是更傾向于使用16進制發送和接收,以此來保證數據中間或者結尾出現一些不可使用ASCII值直觀看到的數據,例如數據的結尾多了0x00,0x0a等。若確保自己的工具以及導線沒有問題后,即可繼續排查通信問題
2、發現使用USB轉TTL與模塊之間明明已經反接了TX、RX,發指令給模塊之后卻沒有任何反應。
解決方法:當碰到如上問題時,應當首先自檢工具,再檢查是否雙方共地,GND提供了一個基準0電平,如果沒有共地的話,那極有可能會出問題,其次是檢查雙方的串口參數是否一致,串口通信是一個易于開發并且速度可調的一個的通信協議,其中我們大部分都會使用UART——通用異步傳輸接收/發送器,串口異步通信也可稱為起止式異步通信,是直接以字符為單位進行傳輸的,字符之間沒有固定的時間要求,每個字符中的每一位以固定的時間傳送。這就意味著,如果你使用一個較為高的波特率的速度去與一個較為低的波特率的速度去通信的話,那極大可能會導致低波特率設備無法讀取到通信時的空閑信號的跳變信息。在這里我用一個比較極端例子進行說明:
當雙方串口的參數的數據位都為8bit,停止位為1bit,校驗位為0bit時,但是A設備的波特率為9600,B設備為921600,就會出現以下情況:
當B設備向A設備發送一個字節的數據時,B設備從發送到結束所需用的時間為1/921600*(8+1+1)=10.8us,而相同的A設備發送/接收一個字節的時間為(8+1+1)/9600=1.04ms,試問,像這種相差數倍的時間,當高波特率發送給低波特率設備時,很有可能低波特率設備壓根就不會認為發送過來的數據流是一串數據,因為壓根沒法解析到。
因此串口通信一定要保證雙方波特率、停止位等參數一致。反之,低波率向高波特率發送數據就會被認為是錯誤的數據,也就是所謂的亂碼。
3、發現雙方已經使用了相同的參數進行通信,但是依舊通信有問題,例如收到亂碼等。
解決方法:首先應該降低波特率先確保模塊與USB轉TLL均無問題,也要確保模塊沒有處于透傳等特殊情況下,也可以使用邏輯分析儀等工具進行排查,現在的很多邏輯分析儀是自帶數據分析的,可以由此來確保模塊正常。其實大部分碰到這種問題的時候,更建議優先查看USB轉TLL是否支持當前的工作模式。
4、串口通信的弱點?
1)信號干擾的問題建議使用帶屏蔽線,接線要嚴格,比如要接地。有些485通信上,還考慮接上終端電阻來匹配。如果是232,盡量不要讓線太長。通信協議上盡量避免長報文的數據通信。
2)波特率匹配的問題因為有些設備的計算的波特率是存在誤差的,特別是一些控制器,由于使用的晶振不一樣。因此在一些波特率比如9600波特率就存在誤差。存在誤差帶來的影響是什么呢。因為接收方是通過時間來計算一個位的。那么如果一個報文過長,就會存在誤差積累的問題,算著算著就偏了。所以,這也是串口通信不穩定的一些地方,在使用上應注意避免發送太長數據的包。
3)在一些可能會存在干擾的情況,可以考慮使用奇校驗或者偶校驗因為雖說出現錯誤的可能性不大,但既然存在干擾,如果加了校驗,至少可以把錯誤的報文過濾掉。總好比沒有校驗然后通信數據錯了不知道。或者盡量使用一些帶校驗的協議,防止數據出錯。
4)串口通信本來就比較慢,請降低對數據響應的要求因為串口通信本身就比以太網慢。而且,串口通信并不是能像CPU那樣多線程處理。因為就一個口一個線數據出去,即便你應用到程序再怎么用多線程處理數據,但是最底下也只有一個口出去,一次也只能傳一個位,一個字節過去。因為有客戶在使用9600的波特率通信,但是又希望多少的數據可以在多少毫秒內得到響應。
但是串口通信還是要實事求是,所以正確認識串口通信對應用,對開發,對溝通都有著很大的幫助的。
5、為什么不用同步通信?
剛才提到,同步通信需要依賴于時鐘信號。這就存在一個問題,這個時鐘信號是誰來發起呢。在同步通信中,往往需要一個主設備發起時鐘信號讀從模塊的數據。在實際中,有屏讀PLC,有屏讀屏的數據。而單純地從異步串口通信來說,是沒有主從之說,雙方都是平等的角色,都可以互發信息,互收信息。而同步通信一般是應用于CPU讀一些模塊,由CPU發起時鐘信號,比如讀SD卡模塊,就可以通過SPI方式,還有一些傳感器模塊。