標籤:

我所了解的一些通信上的知識

首先還是提醒,這是不完全嚴謹的介紹性文章。

載入超時,點擊重試

讓我們先從最常見的USB通信開始。如上圖,我們從USB介面上來看,它是擁有一對差分傳輸線,供電電壓為5V的四線模型。上面這張圖是各種不同的USB介面,它的實際協議是相同的,USB3.0和2.0是有區別的,它能夠實現全雙工傳輸。

USB設備可以分為HID,CDC等類型,設備的類型根據ID來區分。舉個例子如下:

  • HID: Keyboard, Mouse, Custom…
  • CDC: Serial Emulator, …
  • Mass Storage: SD Card Reader…

噢噢,忘了,先提醒一下,如果需要實際進行USB協議的修改或者更為複雜的開發,需要到USB.org - Welcome去下載協議的詳細資料,不過99.999%的人一輩子是不用接觸的。

參考下面這張圖,這是每個USB設備都會有的結構,網上都有,暫找不到原圖作者,侵刪。USB協議中比較重要的概念是設備描述符,它是圖中這樣的結構。每個設備包含配置,介面和端點3層。

其中,配置是用來告訴主機這個設備具體有多少種可能的功能組合。介面是用來描述這個設備中一種功能的類型。端點是介面中具體用來傳輸數據的虛擬出口,每個端點擁有固定的傳輸方向。

較少有設備有多個配置,舉個例子,安卓手機一般會有這樣的功能,比如「管理照片」和「管理文件」一般屬於不同的配置,甚至有些還可以充當網卡。

端點又可以分為4類,分別是

控制端點,用來配置設備以及讀取設備狀態;

中斷端點,用來定時傳輸小批量的數據,比如滑鼠;

批傳輸端點,用來在不保證時限的情況下傳輸大量的數據,比如印表機;

同步端點,用來在保證帶寬的情況下傳輸大量的數據,比如USB音響之類的。

USB協議通常有這些特性是需要用戶和開發者注意的,如下:

不同版本的USB協議最重要的區別就是速度上的區別,而這裡的速度指的是整個主機,而不是單個從機設備;

通過不同的設備描述符,主機才能區分不同設備所實現的功能;

通常USB的傳輸距離是比較短的,2.0是5米,3.0是3米;

對於一個主機來說,能夠連接的設備最多是127個,這127個設備包括主機的根集線器以及級聯的集線器,級聯深度最大為7層;

每個設備能夠在一定限度內決定自己從主機中獲取的電流,USB2.0可以達到500mA,3.0有900mA。

通常要進行USB通信的開發,需要考慮自己是從什麼層級進行開發,如果沒有特殊需求,通常可以按照以下幾點:

  • 如果有現成的使用USB通信的設備。商用的設備通常會提供Driver以及SDK進行開發,可以參考其Programming Manual
  • 如果需要使用USB通信進行設備研發。通常在晶元級採用現成的自帶USB物理層的通信晶元,我所接觸的有CY68013A,這是世界上使用人數最多的;CP2103,USB模擬串口,使用簡單;PIC18F4550,實際上是單片機自帶USB通信引擎。
  • 如果需要修改USB通信協議。那請考慮FPGA自行設計或者自研ASIC,好吧,看這篇文章的人不會需要這些方案的。FPGA應該有提供USB相關的IP核,這我不了解。

還是舉個例子,如果使用PIC18F4550進行數據通信,Microchip公司已經事先提供多種類型設備的工程項目,很多情況下直接使用即可,比如你需要製作一個「黑」鍵盤來實現一插入就能自動敲鍵來獲取管理許可權。但是該晶元由於各種限制,不適用於高速應用中。

軟體上如果需要和USB設備進行通信,需要考慮幾點:

1、Linux系統,請直接使用libusb庫,有些設備擁有驅動,可以更方便的收發數據。

2、Windows系統,考慮class類型。

  1. HID設備,使用Windows Driver Kit。
  2. CDC設備中的串口模擬器,按照普通的串口通信來控制就行了。
  3. Mass Storage設備,各種語言中都有文件讀寫函數吧?
  4. 其他,商用設備還是參考其SDK,自行開發的設備請使用WDK。

3、Mac系統,別跟我提Mac了,它就是一改版Linux,都是淚。

此外還需要注意的是,VISA類設備即使使用USB通信,也不能按照以上說的那些通信方法了,請使用VISA庫。(比如NI、Keysight等類型的設備)

對於Python語言實現的通信,可以使用的庫請參考下圖

另外,對於串口通信來說,即使軟體上控制是相同的,還是有必要講講其中的一些區別。

串口通信和串列通信不一樣,請不要混淆。

串口通信和UART通信方法「類似」,本質上都是雙線的數據傳輸,不過按照我的理解,UART主要是針對硬體吧。

我們先從RS232來講,它大概是下面這兩張圖定義的。

通常PC的主板會提供一個RS232的介面,你會在設備管理器中看到COM1。用上面圖的線連上即可。當然需要注意,這種RS232的線很坑爹有四種(公轉公直連線、公轉母直連線、公轉公交叉線、公轉母交叉線)。直連線是2對2,3對3的線(參考上圖),交叉線是2對3,3對2的線。

使用前請注意,不然調一天不能通信怎麼辦。。。

如果主板上的RS232介面不夠,又還有需要通信的設備怎麼辦?通常有兩種辦法,一種是PCI轉RS232的轉接板,另一種就是USB轉RS232的轉接器。參考下圖,PCI的我就不給了。

USB轉RS232在PC端它就是一個USB串口模擬器。與直接設備上USB模擬串口是相同的。

串口通信可不止RS232,還有RS485,這是為了提供更遠的數據傳輸的。而且RS232還有25PIN的介面,長得和上面的9PIN介面也不一樣。。。

部分教程中會把UART、USART、SPI、IIC等通信協議也當做串口通信,這裡要注意的是,這些通信協議主要是指晶元間的通信,通常不指PC端與其他設備的通信。

推薦閱讀:

TAG:通信 | 電子學 |