[Arduino] 解決RS-232轉TTL的邏輯反向問題 (亂碼問題)

獻慶最近正在使用Arduino執行一個專案中,需要讀取外部機器的RS-232訊號。由於Arduino並不支援RS-232,為解決此問題,將用到RS-232轉TTL的模組來把訊號傳入Arduino中。

於是就去找了個RS-232轉TTL模組來,想說問題馬上就可以解決,結果...

結果就踢鐵板了!

RS232轉TTL模組。

使用晶片為MAX3232 ESE+DN19。

讀取的訊號,看起來就是亂碼,無法判讀。

訊號看起來像亂碼,無法判讀。

發現問題(猜問題)

儘管這個訊號看起來像亂碼,但好像有點規則。

因此獻慶寫了一個測試程序,對那個RS-232轉TTL的通道,每秒輸出一個字串 "0123456789abcdefgh" ,來看看轉換後的效果。

字串"0123456789abcdefgh"經過RS-232轉TTL後,雖然看起來還是一堆問號,但似乎有種規則。

字串"0123456789abcdefgh"經過RS232轉TTL後,變成問號一堆的文字。

接下來再寫一個程式,這次不傳字串,改傳Hex代碼
傳一組{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A}的Hex碼
出現有規則的Hex碼{0xFD,0xFB,0xF9,0xF7,0xF5,0xF3,0xF1,0xEF,0xED,0xEB,0x00}


再用這組有規則的碼{0xFD,0xFB,0xF9,0xF7,0xF5,0xF3,0xF1,0xEF,0xED,0xEB,0x00}傳一次。
結果,看起來有接近我們原始要傳的Hex碼,但順序有些對調。


由這些測試,合理推斷RS-232轉TTL的模組並未完全轉換訊號,應該是只轉換了工作電壓但卻沒有將邏輯電壓轉換好,簡單說就是做半套。

有了一些猜測,接下來還是要做一些功課。

RS232 vs TTL

既然要做轉換,當然要對這兩種訊號有一些基本了解,還是得做點功課。

主要來說有兩個差異性。

第一個差異是訊號的電壓,一般而言TTL會用0V跟5V為訊號電壓,而RS-232會用13V跟-13V為訊號電壓。(RS-232的規範電壓其實是一個範圍,這裡用一個定值,方便參考)

第二個差異是電壓邏輯,也就是哪個電壓要代表0,哪個要代表1。一般而言TTL會用0V代表0,用5V代表1。而RS-232會用13V代表0,用-13V代表1。

因此,RS232與TTL間,不管是訊號電壓或是電壓邏輯都是不同的。

RS232與TTL訊號對比。


想看示波器上面顯示的實際波形,可參考這篇
【實作實驗室】最原始的通訊介面 — RS232與UART的差別


解決方案(猜答案)

使用software serial並開啟反向邏輯設定

這個方式經過獻慶寫程序測試後,確實可解決邏輯反向問題。

透過SoftwareSerial語法中的inverse_logic來更改邏輯方向。
SoftwareSerial(rxPin, txPin, inverse_logic)
inverse_logic: 預設是0,或者就不要寫這個選項。設為1時,就會反向,也就是可以處理邏輯反向的訊號。


但要注意
  1. Software serial的傳輸速度上限會比原生的hardware serial傳輸速度上限慢上許多。
  2. 並不是每片板子的每個pin都支援software serial功能,使用前要先看板子的說明文件,或者就一個pin一個pin慢慢去測試。
  3. Arduino官網上說的可支援software serial的pin腳,是針對官方版Arduino板。若使用的是非官方版的Arduino板,請一個pin一個pin慢慢去測試。有可能官方文件說某個pin支援,但非官方版的Arduino板卻不支援,那就得看人品了。(看來官方版Arduino板還是有它的品質在)


PS:
但為何一開始有學software serial的人,卻不知道有開啟反向邏輯設定?

因為Arduino官網給software serial的語法範例介紹是長這樣
SoftwareSerial(rxPin, txPin)
所以很多人不知道後面還有開啟反向邏輯設定

要另外去完整的語法介紹頁面,才會看到
SoftwareSerial(rxPin, txPin, inverse_logic)


參考資料:

檢討與感想

1.
其實這種邏輯反向的問題,對電子背景科班出身的人而言,太輕鬆了。老經驗的看到亂碼就猜到答案了,嚴謹一點的,用示波器就可以看到訊號反向,在了解問題方面,幾乎不浪費時間。解決手段也會相當豐富,且有效率。

對獻慶而言,這就充滿了挑戰、當然也伴隨著學習的成就感!

這些失敗都是美妙的經驗,成就我們走到終點時的那一丁點回憶!

2.
原本以為對於Arduino這種open source的東西買官方版的產品是一種不良投資(價格通常是非官方版的2~5倍不等),但事實上獲得的好處卻更多。

官方版Arduino品質穩定,也有官方文件的支持,加速開發節奏,同時也保障學習跟開發品質。

非官方版Arduino的品質不穩定,不一定可依據官方版文件來進行開發,也難以保障學習跟開發品質。例如: 本次開發中發現,非官方版Arduino的各個pin對software serial的支援度不穩定,沒辦法根據官方文件去使用,要一個pin一個pin去試。

所以,使用官方版Arduino有其價值!

PS: 想欣賞官方版Arduino的朋友,可參考下方相關Po文的內容。


相關Po文








留言

張貼留言

這個網誌中的熱門文章

什麼是電池的CCA(Cold Cranking Amperes)? 如何量測CCA?

感恩接力棒 活動

[數據處理] Excel 日期時間 換算成 秒