跳轉到內容

應用機器人/微控制器/序列通訊

來自華夏公益教科書

序列通訊基礎

[編輯 | 編輯原始碼]

序列通訊是一種一次傳送一位資料的方式,用於在裝置之間進行資料傳輸。這種方法只需要每個裝置少數幾根線和 I/O 引腳來進行通訊。通常,大多數序列裝置傳送和接收位元組取向的資料(每次傳輸 8 位),並有專門的傳送和接收線路(全雙工)。序列通訊通常由專門的硬體外設處理,稱為 **USART**(**U**niversal **S**ynchronous-**A**synchronous **R**eceiver-**T**ransmitters),這些外設處理低階格式、移位和資料恢復。

大多數 ATmega 系列 AVR 微控制器都有 1-2 個可用的 USART。一些現代微控制器有 5-7 個獨立的 USART。

序列幀結構

[編輯 | 編輯原始碼]

序列傳輸被分成所謂的幀。每個幀都包含要傳送的有效載荷資料位元組以及一些用於“幀”或格式化資料的位。大多數 USART,包括 AVR USART,都相容這樣的幀結構。

一個通用的 UART 序列通訊幀示例。

序列線路在傳輸開始之前保持邏輯高電平。每次傳輸都以一個稱為起始位的單個邏輯低位開始。在起始位之後,有效載荷資料被移出,通常以最低有效位在前。在最後一個數據位移出之後,會發送一個可選的奇偶校驗位。奇偶校驗位的取值為 0 或 1,具體取決於資料中邏輯 1 位的數量,接收方可以使用它來檢測其中一位被翻轉的錯誤傳輸。最後,序列線路在可配置的 1 或 2 個位時間內恢復到邏輯高電平;這些被稱為停止位。AVR USART 能夠傳送具有 5-9 個數據位、偶數、奇數或無奇偶校驗以及 1 或 2 個停止位的幀。在上面的幀中,邏輯高訊號對應於 '0',而邏輯低訊號對應於 '1'。

同步與非同步序列

[編輯 | 編輯原始碼]

使用 USART 的序列通訊可以同步完成(資料帶有專用的時鐘訊號)或非同步完成(資料沒有專用的時鐘訊號)。使用同步序列線路需要為時鐘訊號新增額外的線路,而且在典型的序列資料速率下往往是不必要的。通常,大多數標準序列通訊,特別是 PC 和微控制器之間的通訊,都是非同步完成的。

波特率

[編輯 | 編輯原始碼]

波特率指定了傳送位的頻率。波特率可以透過將 1 除以位時間(以秒為單位)來計算。正確設定非同步序列的波特率非常重要,因為接收方必須根據預定的時鐘頻率從傳入資料中恢復時鐘訊號。PC 上常見的波特率有 1.2k、2.4k、4.8k、9.6k、19.2k、38.4k、57.6k、115.2k、230.4k、460.8k 和 921.6k。

邏輯電平

[編輯 | 編輯原始碼]

有許多不同的標準序列邏輯電平被使用。大多數 PC 介面使用 RS-232 序列,它指定了 -15V 到 -3V 和 +3 到 +15V 之間的邏輯電平,並且空閒時為低電平的線路。AVR USART 使用 0-5V 之間的 CMOS 邏輯電平,並且具有空閒時為高電平的序列線路,通常與標準的 3.3V 或 5V 邏輯輸出相容。裝置之間必須使用適當的序列邏輯電平,為此可能需要特殊的電平轉換器。

德州儀器生產用於 RS-232 的 RS-232 到 CMOS/TTL 電平轉換器。這些器件內建了一個電荷泵,用於提供 RS-232 電平,並且只需要幾個外部元件。這些晶片的一個例子是 MAX232 http://www.ti.com/product/max232

在 ATmega 微控制器上設定 USART

[編輯 | 編輯原始碼]

以下示例展示瞭如何在 ATmega128 上設定序列埠,使用 USART0 作為以 115200 波特率執行的非同步序列裝置。在這個示例中,ATmega128 使用一個 16 MHz 的時鐘。程式應該初始化 USART0,並在其發射器上傳送位元組 0xAA。它將繼續檢查接收器是否有新資料,如果收到 0xAA 位元組,則將 PB0 設定為高電平。這允許進行快速環回測試,並演示了基本的 USART 概念。

/**************************************************
 *
 * AVR Microcontroller USART0 Example 
 * Cody Hyman <hymanc@onid.orst.edu>
 *
 **************************************************/
#include <avr/io.h>

/* Initialize USART0 */
void init_usart()
{
    UBRR0H = 0; // Initialize the baud rate registers for 115.2kbps
    UBRR0L = 8; 
    UCSR0C = (1<<UCSZ00)|(1<<UCSZ01);// Set the USART data size to 8b
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);  // Enable the receiver and transmitter
    DDRE |= (1<<1);                  // Set the Tx line (PE0) to be an output.
}
/* Blocking single byte transmit on USART0 */
void transmit_usart0(uint8_t byte)
{
    // Check for previous transmission to complete and 
    while(!(UCSR0A & (1<<TXC0))); // Wait until last transmit is complete
    UDR0 = byte;                  // Start next transmission by writing to UDR0
}
/* Checks the USART0 Rx complete status flag */
uint8_t usart_has_rx_data(void)
{
    return (UCSR0A & (1<<RXC0)) != 0; // Return the RX complete status flag
}
/* Reads data from the USART receive buffer */
uint8_t receive_usart0(void)
{
    uint8_t ret_val = UDR0; // Read data register
    return ret_val;   // Return read value
}
int main(void)
{
    init_usart();              // Run USART initialization routine
    DDRB |= (1<<0);            // Initialize ATmega128 board LED 0
    uint8_t received_data = 0; // Receive data buffer
    transmit_usart0(0xAA);     // Transmit 0xAA
    while(1)    // Main loop
    {    
        if(usart_has_rx_data())               // Check for received data
        {
            received_data = receive_usart0(); // If yes, get the data
            if(received_data = 0xAA)          // Check the data
                PORTB |= (1<<0);              // If it matches, turn on LED
            else
                PORTB &= ~(1<<0);             // Else turn off LED
        }
    }
    return 0;
}

USB - 序列橋

[編輯 | 編輯原始碼]

通常,大多數現代 PC 都沒有可用的專用 RS-232 序列埠,因此必須使用另一種方法。許多供應商以低廉的價格銷售 RS-232 和 TTL 或 LVTTL 電平介面卡。這些器件通常需要驅動程式,因此請遵循所有制造商的安裝說明。

可插拔 USB 到 RS-232 介面卡

FTDI UMFT230XB USB 到 3.3V 序列介面卡

FTDI TTL-232R-5V-PCB USB 到 5V(或 3.3V)序列介面卡

在 Windows 機器上

[編輯 | 編輯原始碼]

序列介面卡通常列舉為 COMx 埠。檢查裝置管理器以確定 COM 埠號。

在 Linux 機器上

[編輯 | 編輯原始碼]

序列介面卡通常列舉為 ttyUSBx 裝置。檢查你的 /dev/ 目錄以確定 tty 裝置號。

RS-232 引腳定義

[編輯 | 編輯原始碼]

以下引腳分配圖通常用於標準 RS-232 DE-9 聯結器。DTE 公頭引腳分配對應於 PC 或序列介面卡側的引腳。DCE 母頭引腳分配對應於終端裝置,例如帶有 RS-232 埠的微控制器板。RS-232 還指定了一些其他流控制線,這些線路在舊序列調變解調器中經常使用,但對於大多數情況來說,只需要 TxD/RxD 和地線。 RS-232 DE-9 Connector Pinouts

常見錯誤

[edit | edit source]

常見錯誤包括 DCE 側聯結器 Tx/Rx 引腳接線錯誤,或意外使用 RS-232 交叉線而不是直通線。強烈建議在 RS-232 通訊無法正常工作時檢查這些因素。

序列終端軟體

[edit | edit source]

存在多種序列終端程式,允許快速傳送和接收序列資料。這些程式對於除錯和測試序列裝置很有用。

Windows 序列程式

[edit | edit source]

Realterm - 一個功能強大的基於 GUI 的序列終端。 - http://realterm.sourceforge.net/ Linux 序列程式:Minicom: 一個非常流行的基於終端的序列介面程式 - Debian 包名稱 "minicom" Cutecom: 一個基於 GUI 的序列終端程式 - Debian 包名稱 "cutecom"

Python 序列模組 (PySerial)

[edit | edit source]

PySerial 是一個易於跨平臺使用的庫,用於 PC 序列通訊。建議使用 Python 2.7 而不是 Python 3.x。Pyserial 允許輕鬆管理序列埠,並在 Windows 或 Linux 上分別管理透過 COM 或 tty 埠傳送和接收資料。可以在以下網站找到 Pyserial 和相關文件 - http://pyserial.sourceforge.net/

華夏公益教科書