日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!

發(fā)布時間:2024/7/5 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux can总线接收数据串口打包上传_关于串口,你需要知道这些!! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

嵌入式設備在電路中交換信息的時候必須通過共享一個通用的協(xié)議。現(xiàn)在嵌入式系統(tǒng)中已經(jīng)定義了數(shù)百種通信協(xié)議來實現(xiàn)數(shù)據(jù)交換,一般來說可以將其分為兩類:并行或串行。

并行傳輸數(shù)據(jù)是指同時傳輸多個數(shù)據(jù)位,它們通常需要數(shù)據(jù)線和時鐘線配合工作,數(shù)據(jù)線的條數(shù)可能為8、16或更多。

而串行傳輸時一次只能傳輸一位數(shù)據(jù),只使用一根導線工作,通常總共不需要超過四根。

可以將這兩種通信方式看作車輛在路上行駛,并行傳輸是一條八車道的豪華高速公路,而串行傳輸更像是兩車道的鄉(xiāng)間小路。并行傳輸可以在同一時刻通過8輛汽車,而串行傳輸只能在同一時刻通過一輛汽車,但兩車道的建設費用可能更低。

并行傳輸?shù)暮锰幨强焖佟⒑唵吻乙子趯嵤5撬枰嗟妮斎?輸出(I/O)口。如果你曾經(jīng)使用過Arduino編程,那你就知道處理器上的I/O口有多寶貴了。因此我們經(jīng)常選擇串行通信,以節(jié)約端口。

多年來,研究人員設計了數(shù)十種串行協(xié)議以滿足嵌入式系統(tǒng)的特殊需求,USB和以太網(wǎng)算是其中比較知名的串行協(xié)議。其他常見的串行協(xié)議包括:IIC、SP等等。

這些串行傳輸協(xié)議都可以分為兩類:同步和異步。

同步串行傳輸協(xié)議始終將數(shù)據(jù)線與時鐘信號配對,因此同步串行總線上所有設備都共享一個公共時鐘。這樣可以進行更直接、更快的串行傳輸,但也額外需要一根時鐘線。同步串行傳輸協(xié)議的包括SPI和IIC。

異步串口是指在沒有外部時鐘信號的情況下傳輸數(shù)據(jù)。這種傳輸方法非常適合于I/O口緊張的情況,但這意味著需要付出額外的資源來可靠地傳輸和接收數(shù)據(jù)。我們將在本文中討論的串行協(xié)議是異步傳輸?shù)淖畛R娦问健嶋H上,大多時候人們說的串口均是指的該類型。

異步串行協(xié)議的許多內置規(guī)則可以確保可靠且無誤的數(shù)據(jù)傳輸,分別為:

  • 數(shù)據(jù)位

  • 同步位

  • 奇偶校驗位

  • 波特率

通過各種這些信令機制,可以保障數(shù)據(jù)傳輸?shù)耐暾?#xff0c;但最最最重要的是在收發(fā)雙方一定要配置位相同的規(guī)則才能正確的發(fā)送和接收。

波特率指定通過串行線發(fā)送數(shù)據(jù)的速度。通常以每秒位數(shù)(bps)為單位。如果反轉波特率,則可以計算出傳輸單個比特需要的時長。該值確定發(fā)送器將串行線保持為高/低狀態(tài)的時間,或接收設備在多長時間內對其進行采樣。

在合理范圍內,波特率幾乎可以是任何值。唯一的要求是兩個設備均以相同的速率運行。對速度要求不高的情況而言,9600 bps是較常見的波特率之一。其他“標準”波特為1200、2400、4800、19200、38400、57600和115200。

波特率越高,發(fā)送/接收數(shù)據(jù)的速度就越快。通常不會有超過115200的波特率-因為這對于大多數(shù)單片機而言速度太快,將在接收端看到錯誤,因為時鐘和采樣周期無法跟上發(fā)送端。

實際傳輸?shù)拿總€數(shù)據(jù)塊(一般為一個字節(jié))都以數(shù)據(jù)包或幀的形式發(fā)送。通過將同步位和奇偶校驗位附加到我們的數(shù)據(jù)中來創(chuàng)建幀。

9600 8N1(示例)

9600 8N1代表著波特為9600,8個數(shù)據(jù)位,無奇偶校驗和1個停止位,這一種是較為常用的串行協(xié)議配置方法。那么,9600 8N1的數(shù)據(jù)包是什么樣的呢?舉個例子吧!傳輸ASCII字符"O"和"K"的設備必須創(chuàng)建兩個數(shù)據(jù)包。O的ASCII值(大寫)為79,則二進制值01001111,而K的二進制值為01001011。剩下的就是追加同步位。假設傳輸數(shù)據(jù)時首先傳輸最低位:

由于我們以9600 bps的速度進行傳輸,因此將電平保持高位或低位所花費的時間為每位1/(9600 bps)或104 μs。

對于每個傳輸?shù)臄?shù)據(jù)字節(jié),實際上有10個位被發(fā)送:一個起始位,8個數(shù)據(jù)位和一個停止位。因此,在9600 bps時,我們實際上每秒發(fā)送9600位或每秒960(9600/10)字節(jié)。

接線和硬件

串行總線僅由兩根電線組成-一根用于發(fā)送數(shù)據(jù),另一根用于接收。因此,串行設備應具有兩個串行引腳:接收器RX和發(fā)送器TX。

請注意,RX和TX口是相對于設備本身的。因此,來自一臺設備的RX應該接到另一臺設備的TX,反之亦然。發(fā)射機應與接收機通信,而不是與其他發(fā)射機通信。

兩個設備都可以發(fā)送和接收數(shù)據(jù)的串行接口是全雙工或半雙工。全雙工意味著兩個設備可以同時發(fā)送和接收。半雙工通信意味著串行設備必須輪流發(fā)送和接收。

常見問題

任何水平的工程師都容易犯以下錯誤:

1. 接收到發(fā)送,接收到發(fā)送

這種情況看起來特別簡單,但是非常容易遇到,我已經(jīng)犯了無數(shù)次,請始終確保在串行設備之間交叉RX和TX線。

波特率不匹配

波特率類似于串行通信的語言。如果兩個設備的通話速度不同,則數(shù)據(jù)可能會被誤解或完全丟失。如果接收設備在其接收線路上看到的都是垃圾,請檢查以確保波特率匹配。

數(shù)據(jù)以9600 bps傳輸,但以19200 bps接收。波特率不匹配==垃圾。

總線爭用

串行通信旨在僅允許兩個設備通過一條串行總線進行通信。如果有多個設備嘗試在同一串行線上進行傳輸,則可能會發(fā)生總線爭用。等等等...

例如,如果您要將GPS模塊連接到Arduino,則可以僅將模塊的TX線連接到Arduino的RX線。但是,該Arduino RX引腳已經(jīng)連接至USB到串行轉換器的TX引腳,該端口在您對Arduino進行編程或使用Serial Monitor時就可以使用。這設置了GPS模塊和FTDI芯片都試圖同時在同一條線上傳輸?shù)臐撛谇闆r。

試圖在同一條線上同時傳輸數(shù)據(jù)的兩個設備很糟糕!在"最佳"狀態(tài)下,兩個設備都無法發(fā)送其數(shù)據(jù)。最壞的情況是,兩個設備的傳輸線都會go聲(盡管這種情況很少見,而且通常會受到保護)。

將多個接收設備連接到單個發(fā)送設備可以很安全。并非真正符合規(guī)格,并且可能不適合經(jīng)過嚴格訓練的工程師,但是它會起作用。例如,如果要將串行LCD連接到Arduino,最簡單的方法可能是將LCD模塊的RX線連接到Arduino的TX線。Arduino的TX已經(jīng)連接到USB編程器的RX線,但是仍然只剩下一個設備來控制傳輸線。

從固件的角度來看,這樣分配TX線仍然很危險,因為您無法選擇哪個設備可以聽到什么傳輸信號。LCD最終會接收到不適合它的數(shù)據(jù),這可能會命令LCD進入未知狀態(tài)。

一般來說:一條串行總線,兩個串行設備!

本文轉載引用:

https://learn.sparkfun.com/tutorials/serial-communication

總結

以上是生活随笔為你收集整理的linux can总线接收数据串口打包上传_关于串口,你需要知道这些!!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。