序列程式設計/典型RS232硬體配置
序列程式設計: 介紹和OSI網路模型 -- RS-232佈線和連線 -- 典型RS232硬體配置 -- 8250 UART -- DOS -- MAX232驅動器/接收器系列 -- Windows中的TAPI通訊 -- Linux和Unix -- Java -- Hayes相容調變解調器和AT命令 -- 通用序列匯流排(USB) -- 形成資料包 -- 糾錯方法 -- 雙向通訊 -- 資料包恢復方法 -- 序列資料網路 -- 實際應用開發 -- 序列連線上的IP
此頁面概述了典型的序列RS232硬體配置,這種配置可以在各種計算機和裝置中找到。它應該作為對某些序列硬體的直接程式設計的指南和介紹。
所提供的資訊本質上是通用的,因為某些裝置或計算機中可以找到的實際序列硬體確實有所不同。如今,硬體通常整合在一個單一的晶片中,甚至包含許多其他功能,例如並行埠,這些功能與序列通訊無關。然而,本模組提供了關於哪些邏輯或物理元件執行什麼以及序列硬體的實際程式設計發生在哪裡的良好概述。
下圖概述了相關元件以及它們如何原則上連線
RS232 +-----------+ +-----------+ +-----------+ +-----------+
Interface | Line | | | | Interface | | |
-----------+ Driver / +---+ UART +---+ Logic +---+ CPU |
| Receiver | | | | | | |
+-----------+ +-----+-----+ +-----+-----+ +-----------+
| |
| |
+-----+-----+ |
| Baud Rate | |
| Generator +---------+
| |
+-----------+
我們將依次討論這些元件及其用途。
RS-232通訊使用高達±15V的電壓(一些早期規格甚至使用±25V)。它使用反向邏輯(高/真/1 是負電壓,低/假/0 是正電壓)。這些電壓對於現代(甚至更舊的)計算機邏輯來說太高了。因此,RS-232介面通常包含特殊的硬體,即所謂的線路驅動器和線路接收器。
線路驅動器負責將典型的計算機電壓邏輯轉換為 RS-232 線路上使用的較高電壓,並反轉邏輯。當計算機硬體傳輸序列資料時,這將被使用。電壓輸出通常是連續的短路安全的,因為 RS-232 標準要求這樣做。
線路接收器負責線路驅動器的反向操作。它將傳入的 RS-232 訊號轉換為適合計算機邏輯的電壓,並且它當然也反轉邏輯。
實際上,通常使用多個線路驅動器和接收器,因為 RS-232 電纜中的每個傳入 RS-232 訊號都需要自己的接收器,每個傳出的 RS-232 訊號都需要自己的驅動器。但是,多個驅動器/接收器通常組合在一個晶片中。該晶片本身也保護計算機邏輯免受可能發生在序列線上的尖峰。一些線路驅動器/接收器晶片甚至在晶片上生成所需的 RS-232 電壓,而另一些則需要外部電源來提供這些電壓。
線路驅動器/接收器通常不可程式設計。它們被硬連線到邏輯中,因此對於程式設計師來說並不重要。
另請參閱
- 模組 MAX232 驅動器/接收器系列,它提供了一個流行的驅動器/接收器的示例,該示例在業餘電子產品中使用。
- 模組 RS-232 佈線和連線
UART(通用非同步接收器/傳送器)是序列硬體的核心。它是一個晶片或晶片的一部分,其目的是在並行資料和序列資料之間轉換。RS-232 UART 通常還會在傳輸時新增必要的開始/停止位和奇偶校驗位,並在接收時解碼這些資訊。
UART 通常完全在計算機邏輯電壓下工作。其序列資料輸入/輸出電壓是計算機邏輯電壓,而不是序列線路電壓。它們將實際線路介面留給特定的線路驅動器/接收器。該線路驅動器/接收器不一定需要是 RS-232 線路驅動器/接收器,但可以是例如 RS-422 差分驅動器/接收器。這,以及波特率、奇偶校驗、停止位數量、資料位數量可程式設計的事實是 UART 被稱為“通用”的原因。當 UART 和線路驅動器/接收器都放置在同一晶片中時,它們之間的區別就會變得模糊。此類晶片通常也以“UART”的標籤出售。
UART 被稱為“非同步”,因為它們不使用特殊的時鐘訊號來與遠端端同步。相反,它們使用開始/停止位來識別序列流中的資料位。
由於 UART 的存在,其餘硬體以及軟體應用程式可以處理正常的位元組來儲存通訊資料。UART 的工作是在傳送時將位元組分成一系列序列位,並在接收時將一系列位組裝成位元組。UART 通常包含 8 位寬的接收器和傳送器緩衝器。如果使用 7 位傳輸等,則可能不會使用所有位。接收到的序列資料以並行方式提供給接收器緩衝器,要傳送的資料以並行方式寫入傳送器緩衝器。根據 UART 的不同,緩衝器可能只有一個位元組的深度,也可能只有幾個位元組的深度(在 15 或 16 位元組範圍內)。緩衝器越淺,CPU 與之的通訊就需要越精確。例如,如果接收器緩衝器只有一個位元組的深度,並且資料沒有被足夠快地獲取,那麼下一個接收到的資料可能會覆蓋接收器緩衝器中之前接收到的資料,並且之前接收到的資料將丟失。
由於序列介面上的時序非常重要,因此 UART 通常連線到波特率發生器,該發生器可以是 UART 晶片中的內部發生器,也可以是外部發生器。
USART(通用同步/非同步接收器/傳送器)是 UART 的一個版本,它也可以同步通訊。許多現代 IC 都具有此功能。但是,由於 RS232 是非同步工作的,因此 USART 的同步功能不用於序列通訊。根據 USART 的特定型別,同步功能要麼在啟動時關閉,要麼需要關閉。一旦關閉,USART 對於 RS232 通訊來說就是一個 UART。
波特率發生器是一個振盪器。它提供一個頻率訊號,用於控制序列介面的時序。由於不同的線路速度需要不同的時序,因此波特率發生器需要具有靈活性。
實現靈活波特率發生器有兩種一般方法。波特率發生器本身是可程式設計的,可以產生必要的不同頻率,或者 UART 有一個可程式設計的除法器或乘法器,它將來自波特率發生器的頻率轉換為所需的頻率。觀察者可能已經注意到,典型的波特率(300bps、600bps、1200bps、2400bps、9600bps(4 x 2400bps)等)之間存在固定的關係。這簡化了使用頻率除法器或乘法器來生成所需時序的過程。
根據實際的 UART,波特率發生器需要是某些外部元件,或者直接整合到 UART 晶片中。從外部來看,對波特率發生器的程式性更改是控制序列連線速度的手段。通常在對波特率進行程式設計時,不會以“明文”的形式提供所需的波特率,而是需要提供一些除法器或係數。要提供正確的除法器或係數,需要了解所用波特率發生器的基本頻率。
RS-232 通訊是非同步的。因此,沒有明確的方式,沒有共享時鐘訊號,發射器和接收器如何同步。相反,它們在起始位上同步,並進一步假定一定的位長。位長是波特率的直接函式。例如,RS-232 上的 9600 波特意味著每秒傳輸 9600 位。因此,每個位長為 1/9600 秒。為了確保發射器和接收器假定相同的位長,它們需要使用相同的波特率。並且通訊雙方的波特率需要精確到一定程度。否則,資料傳輸將失敗。當兩側的波特率沒有很好地對齊時,常見的錯誤是幀錯誤、錯誤接收或丟失的位。
波特率發生器,因為它生成傳送和接收資料的時鐘頻率,負責提供所需的波特率精度。經驗法則是,波特率的總差異在最壞情況下不應超過 +/- 4%。如果將這個“誤差預算”平均分配到雙方,這意味著每邊的波特率需要保持在標稱值的 +/- 2% 以內。實際上,應該避免最壞的情況,並將波特率至少保持在每邊的 +/- 1% 以內。
通常使用石英晶體振盪器來構建波特率發生器,其初始精度、溫度漂移和長期漂移適用於 RS-232。也就是說,波特率發生器基於振盪器,而振盪器又使用石英晶體作為參考。更簡單的振盪器,如 RC 振盪器,通常不夠好。
通常,所有晶體振盪器電子裝置都內建在波特率發生器 IC 中。如果使用具有整合波特率發生器的 UART,該 UART 通常包含電子裝置。通常只需要新增石英晶體。
為了實現常見的波特率,石英晶體的頻率值需要具有某些“神奇”值。這些值乍一看似乎相當奇怪。但是,它們通常是 300(通常支援的最低波特率)或 25(對於 25、50、75、150 的極低波特率)的倍數,以及二的冪。使用二的冪是因為將頻率除以二的冪很容易,從而使可配置或可程式設計波特率發生器成為可能。
例如,將相當奇怪的晶體頻率 4.915200 MHz 除以 256(二的冪),得到 19200 Hz 的良好值。頻率為 4.915200 MHz 的晶體被稱為波特率晶體或神奇晶體。下表列出了常見的波特率晶體頻率。
- 1.8432 MHz、3.6864 MHz、4.9152 MHz、5.5296 MHz、6.1440 MHz、7.3728 MHz、9.8304 MHz
- 11.0592 MHz、12.2880 MHz、12.9024 MHz、14.7456 MHz、16.5888 MHz、18.4320 MHz、19.6608 MHz
- 20.2752 MHz、22.1184 MHz、23.9616 MHz、25.8048 MHz、27.6480 MHz、29.4912 MHz
- 31.3344 MHz、33.1776 MHz、35.0208 MHz、36.8640 MHz
使用哪個晶體頻率取決於所使用的波特率發生器/UART。應查閱波特率發生器/UART 的資料表以獲取詳細資訊。
UART 和波特率發生器只是晶片,或者可以是更大晶片的元件。為了簡化討論,我們假設它們是一個晶片。該晶片通常有一堆引腳,這些引腳需要以某種方式由 CPU 寫入或讀取。因此,CPU 需要有一種方法來定址晶片以與之通訊。晶片還需要一種方法在某些情況下讓自身被聽到。
介面邏輯的職責是提供這種連線。邏輯在不同的系統架構之間差異很大。一種常用的技術是將 UART 的傳送和接收緩衝區對映到 CPU 的記憶體地址空間。這樣,它們在 CPU 看來就像普通的記憶體。另一種方法是將這些緩衝區連線到某些 CPU 特定的 I/O 埠。除了傳送和接收緩衝區外,CPU 還必須能夠訪問 UART 的控制線、波特率、奇偶校驗和字元大小程式設計介面。
由於 UART 無法緩衝無限量的傳入資料(有些只能在接收緩衝區中緩衝一個位元組),因此 CPU(或某些其他硬體)需要“足夠快”地從 UART 讀取資料。CPU 可以連續輪詢 UART 以檢查是否有新資料可用,或者 UART 可以通知何時有新資料準備就緒。這種通知通常透過 CPU 中斷完成。介面邏輯的職責是代表 UART 觸發這種中斷。兩種機制(輪詢或中斷驅動)都有優點和缺點。
在另一個方向上,在傳送資料時,存在類似的問題。CPU 需要“足夠快”地將資料傳遞給 UART,以防止緩衝區下溢。這並不致命,但會降低序列通訊的效能和效率。CPU 也可以“太快”地將資料傳遞給 UART,導致 UART 中的發射器緩衝區溢位。這可以透過輪詢(CPU 檢查 UART 是否準備好傳送)或透過中斷(UART 告訴 CPU 它需要更多資料)來控制。同樣,介面邏輯必須提供完成這兩種操作模式的方法。
介面邏輯決定了程式設計師如何以及在何處找到他們想要程式設計的 UART,以及他們可以使用哪些操作模式(輪詢、中斷驅動)來傳輸和接收資料。例如,在現代 PC 中,介面邏輯在一定程度上是可程式設計的。但是,這通常由 BIOS 完成(設定 I/O 地址和中斷號)。在較舊的 PC 和許多其他計算機中,介面邏輯不可程式設計。從應用程式程式設計師的角度來看,很少需要程式設計介面邏輯。通常將其視為硬連線邏輯。
為了程式設計特定的硬體,需要了解
- 如何訪問 UART 和波特率發生器(介面邏輯如何工作)。這通常需要了解一些 I/O 或記憶體地址。
- UART 和波特率發生器的通訊方式(介面邏輯是否提供輪詢或中斷,或者兩者都提供?)。
- 如何程式設計 UART。為此,擁有 UART 的資料表非常有用。
- 如何程式設計波特率發生器,它可能只是 UART 晶片的一部分。
或者,使用作業系統的序列程式設計 API,該 API 應該瞭解所有這些內容,並“做正確的事”。
- 頁面 程式設計 8250 UART 提供了在特定硬體組合中程式設計特定 UART 的詳細資訊。
序列程式設計: 介紹和OSI網路模型 -- RS-232佈線和連線 -- 典型RS232硬體配置 -- 8250 UART -- DOS -- MAX232驅動器/接收器系列 -- Windows中的TAPI通訊 -- Linux和Unix -- Java -- Hayes相容調變解調器和AT命令 -- 通用序列匯流排(USB) -- 形成資料包 -- 糾錯方法 -- 雙向通訊 -- 資料包恢復方法 -- 序列資料網路 -- 實際應用開發 -- 序列連線上的IP