嵌入式里面說的串口,一般是指UART口, 但是我們經常搞不清楚它和COM口的區別, 以及RS232, TTL等關系, 實際上UART,COM指的物理接口形式(硬件), 而TTL、RS-232是指的電平標準(電信號)
UART的特征
一般uart控制器在嵌入式系統里面都做在cpu一起,像飛思卡爾的IMX6芯片就是這樣,有多個uart控制器。
引腳介紹(COM口比較多pin,但是常用的也是這幾個):
VCC:供電pin,一般是3.3v,在我們的板子上沒有過電保護,這個pin一般不接更安全
GND:接地pin,有的時候rx接受數據有問題,就要接上這個pin,一般也可不接
RX:接收數據pin
TX:發送數據pin,我之前碰到串口只能收數據,不能發數據問題,經baidu,原來是設置了流控制,取消就可以了,適用于putty,SecureCRT
在調試的時候, 多數情況下我們只引出rx,tx即可。 比如調試gps模塊, IC數據直接通過uart上報,我就直接用了兩個線連出了rx,tx,連上串口轉USB小板, 電腦從串口直接獲取數據,這樣跳過了開發板,測試了gps的數據有沒有問題。
示波器調試UARE
一、串行數據的格式
異步串行數據的一般格式是:起始位+數據位+停止位,其中起始位1位,數據位可以是5、6、7、8位,停止位可以是1、1.5、2位。
起始位是一個值為0的位,所以對于正邏輯的TTL電平,起始位是一位時間的低電平;停止位是值為1的位,所以對于正邏輯的TTL電平,停止位是高電平。對于負邏輯(如RS-232電平)則相反。
例如,對于16進制數據55aaH,當采用8位數據位、1位停止位傳輸時。
二、根據波形圖計算波特率
在示波器中的顯示示意,其中灰色線是示波器的時間分度線,此時假設是200ms/格。
可以看了,第一個字節的10位(1位起始位,8位數據位和1位停止位)共占約1.05ms,這樣可計算出其波特率約為:10bit / 1.05ms X 1000 ≈ 9600 bit/s
如果時間軸是100ms/格,同樣可以計算出波特率應是19200bit/s。
當通訊不正常,又能觀察到波形時,就可根據上述方法,從波形圖計算一下波特率是否正確。
三、根據波形圖判斷RS-485收發數據的正確與否
RS-485是一種半雙工的串行通訊方式,485電平芯片所以要正確接收和發送數據,必需保證控制信號和數據的同步,否則要么發送數據丟失,要么接收數據可能丟失。
發送控制信號的寬度基本與數據信號的寬度一致,所以能保證發送數據的正確和發送后及時轉為接收。
由于控制信號關閉過早,則第二個字節的后兩位將發送錯誤;在圖6中,由于控制信號關閉過遲,使485芯片在發送數據后,不能及時轉到接收狀態,此時總線若有數據過來,則本單元將不能正確接收。
示波器分析UART串口數據
這個是示波器一段的圖 上面的數據(原文件)就是這段的
Y的坐標單位是 電壓值 V
X的單位是 時間 S 都是幾十uS的 從這個可以分析出來 是多大波特率的
UART的格式 可以通過程序設置 有些會在停止位之前有一個奇偶校驗之類的 停止位也不一定只是一個單位大小 可以設置為1、1.5、2等
中間的數據位長度也可以設置位 6 7 8 位等
還有數據的傳輸順序 我這個是LSB先出的 所以可以看出
第一個數據 01010101 反過來就是10101010 =0xAA
第二個10101010 反過來01010101 0x55
第三個11001011 反過來 11010011 0xD3
第三個 11010000 反過來 00001011 0x0B
對著示波器 分析一遍之后 沒錯就是這樣的 就是傳的這些 也就是 數據和實際傳輸的信號 很好的對應上了
這個信號 是TXD 與 GND 之間的電壓信號 此時 RXD與GND之間 一直為高電平電壓值
這就是 UART : Universal Asynchronous Receiver/Transmitter,通用異步接收/發送 異步 沒有時鐘 接受端得有相應的采樣時鐘 否則會亂的
對于波特率的問題 這份數據有記錄時間(具體精確的時間要看數據表) 好像記得在通信里面有碼元這個概念 這里就是1bit 波特率=1/(1bit的時長) 這份數據1bit的時長≈8.6*10^(-6)s 也就是8.6us 1/8.6us =116279.06976744Hz 也就是115200的波特率了 因為那個8.6us的時間是估計的 而常用的波特率有這么些:看圖片吧
也就是1200 1800 2400 4800 7200 9600 14400 19200 38400 57600 115200 128000 還有一些
115200 原來以為速度還挺快的 用示波器看了之后 我再運行了一段代碼 輸出兩個引腳信號 來看時間 發現當運行一段不短的代碼之后串口才發完3、4個碼元(不是byte哦) 天哪 算一算 如果發16byte的數據 總共16*10(1bit起始位+8bit數據位+1bit的結束位)=160個碼元的時間 160*1/115200=0.0013888888888889 也就是1.38ms 有時候中斷都不知道發生多少次了 肯定 這也是相對的
UART里面還有一個經常提到的 RS232 這是一種標準(協議 ) 就像說市電一樣的 就知道是220V RS-232 就是把TTL(0~5V) 轉換到10+V的電壓 提要電壓 可以增強抗干擾的能力 增加傳輸距離
一般用芯片來實現 MAX232 很典型 工作電壓5V 輸出有12V左右 和輸出的負載有關吧 例如TTL的邏輯1 232對應的就是 負10幾V 0對應的就是10+V 就是一個變換 變換后一般用9針的接口線 工程應用上就是這樣的 用到3根線 2、3、5 收發地
評論