linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!
嵌入式設備在電路中交換信息的時候必須通過共享一個通用的協議。現在嵌入式系統中已經定義了數百種通信協議來實現數據交換,一般來說可以將其分為兩類:并行或串行。
并行傳輸數據是指同時傳輸多個數據位,它們通常需要數據線和時鐘線配合工作,數據線的條數可能為8、16或更多。
而串行傳輸時一次只能傳輸一位數據,只使用一根導線工作,通常總共不需要超過四根。
可以將這兩種通信方式看作車輛在路上行駛,并行傳輸是一條八車道的豪華高速公路,而串行傳輸更像是兩車道的鄉間小路。并行傳輸可以在同一時刻通過8輛汽車,而串行傳輸只能在同一時刻通過一輛汽車,但兩車道的建設費用可能更低。
并行傳輸的好處是快速、簡單且易于實施。但是它需要更多的輸入/輸出(I/O)口。如果你曾經使用過Arduino編程,那你就知道處理器上的I/O口有多寶貴了。因此我們經常選擇串行通信,以節約端口。
多年來,研究人員設計了數十種串行協議以滿足嵌入式系統的特殊需求,USB和以太網算是其中比較知名的串行協議。其他常見的串行協議包括:IIC、SP等等。
這些串行傳輸協議都可以分為兩類:同步和異步。
同步串行傳輸協議始終將數據線與時鐘信號配對,因此同步串行總線上所有設備都共享一個公共時鐘。這樣可以進行更直接、更快的串行傳輸,但也額外需要一根時鐘線。同步串行傳輸協議的包括SPI和IIC。
異步串口是指在沒有外部時鐘信號的情況下傳輸數據。這種傳輸方法非常適合于I/O口緊張的情況,但這意味著需要付出額外的資源來可靠地傳輸和接收數據。我們將在本文中討論的串行協議是異步傳輸的最常見形式。實際上,大多時候人們說的串口均是指的該類型。
異步串行協議的許多內置規則可以確保可靠且無誤的數據傳輸,分別為:
數據位
同步位
奇偶校驗位
波特率
通過各種這些信令機制,可以保障數據傳輸的完整性,但最最最重要的是在收發雙方一定要配置位相同的規則才能正確的發送和接收。
波特率指定通過串行線發送數據的速度。通常以每秒位數(bps)為單位。如果反轉波特率,則可以計算出傳輸單個比特需要的時長。該值確定發送器將串行線保持為高/低狀態的時間,或接收設備在多長時間內對其進行采樣。
在合理范圍內,波特率幾乎可以是任何值。唯一的要求是兩個設備均以相同的速率運行。對速度要求不高的情況而言,9600 bps是較常見的波特率之一。其他“標準”波特為1200、2400、4800、19200、38400、57600和115200。
波特率越高,發送/接收數據的速度就越快。通常不會有超過115200的波特率-因為這對于大多數單片機而言速度太快,將在接收端看到錯誤,因為時鐘和采樣周期無法跟上發送端。
實際傳輸的每個數據塊(一般為一個字節)都以數據包或幀的形式發送。通過將同步位和奇偶校驗位附加到我們的數據中來創建幀。
9600 8N1(示例)
9600 8N1代表著波特為9600,8個數據位,無奇偶校驗和1個停止位,這一種是較為常用的串行協議配置方法。那么,9600 8N1的數據包是什么樣的呢?舉個例子吧!傳輸ASCII字符"O"和"K"的設備必須創建兩個數據包。O的ASCII值(大寫)為79,則二進制值01001111,而K的二進制值為01001011。剩下的就是追加同步位。假設傳輸數據時首先傳輸最低位:
由于我們以9600 bps的速度進行傳輸,因此將電平保持高位或低位所花費的時間為每位1/(9600 bps)或104 μs。
對于每個傳輸的數據字節,實際上有10個位被發送:一個起始位,8個數據位和一個停止位。因此,在9600 bps時,我們實際上每秒發送9600位或每秒960(9600/10)字節。
接線和硬件
串行總線僅由兩根電線組成-一根用于發送數據,另一根用于接收。因此,串行設備應具有兩個串行引腳:接收器RX和發送器TX。
請注意,RX和TX口是相對于設備本身的。因此,來自一臺設備的RX應該接到另一臺設備的TX,反之亦然。發射機應與接收機通信,而不是與其他發射機通信。
兩個設備都可以發送和接收數據的串行接口是全雙工或半雙工。全雙工意味著兩個設備可以同時發送和接收。半雙工通信意味著串行設備必須輪流發送和接收。
常見問題
任何水平的工程師都容易犯以下錯誤:
1. 接收到發送,接收到發送
這種情況看起來特別簡單,但是非常容易遇到,我已經犯了無數次,請始終確保在串行設備之間交叉RX和TX線。
波特率不匹配
波特率類似于串行通信的語言。如果兩個設備的通話速度不同,則數據可能會被誤解或完全丟失。如果接收設備在其接收線路上看到的都是垃圾,請檢查以確保波特率匹配。
數據以9600 bps傳輸,但以19200 bps接收。波特率不匹配==垃圾。
總線爭用
串行通信旨在僅允許兩個設備通過一條串行總線進行通信。如果有多個設備嘗試在同一串行線上進行傳輸,則可能會發生總線爭用。等等等...
例如,如果您要將GPS模塊連接到Arduino,則可以僅將模塊的TX線連接到Arduino的RX線。但是,該Arduino RX引腳已經連接至USB到串行轉換器的TX引腳,該端口在您對Arduino進行編程或使用Serial Monitor時就可以使用。這設置了GPS模塊和FTDI芯片都試圖同時在同一條線上傳輸的潛在情況。
試圖在同一條線上同時傳輸數據的兩個設備很糟糕!在"最佳"狀態下,兩個設備都無法發送其數據。最壞的情況是,兩個設備的傳輸線都會go聲(盡管這種情況很少見,而且通常會受到保護)。
將多個接收設備連接到單個發送設備可以很安全。并非真正符合規格,并且可能不適合經過嚴格訓練的工程師,但是它會起作用。例如,如果要將串行LCD連接到Arduino,最簡單的方法可能是將LCD模塊的RX線連接到Arduino的TX線。Arduino的TX已經連接到USB編程器的RX線,但是仍然只剩下一個設備來控制傳輸線。
從固件的角度來看,這樣分配TX線仍然很危險,因為您無法選擇哪個設備可以聽到什么傳輸信號。LCD最終會接收到不適合它的數據,這可能會命令LCD進入未知狀態。
一般來說:一條串行總線,兩個串行設備!
本文轉載引用:
https://learn.sparkfun.com/tutorials/serial-communication總結
以上是生活随笔為你收集整理的linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 相邻位数字差值的绝对值不能超过_热点争议
- 下一篇: 处理相对时间(Day.js、Moment