概要

UART (Universal Asynchronous Receiver / Transmitter) (汎用非同期送受信機) は、シリアル通信の一種であり、データを1ビットずつ送受信する。

  • 非同期通信
    送信側と受信側が別々のクロックを使用して、あらかじめ設定されたボーレート (通信速度) に基づいてデータを送受信する。

  • データフォーマット
    スタートビット、データビット (通常8ビット)、パリティビット (オプション)、ストップビットで構成される。

  • ボーレート
    通信速度のことであり、ビット/秒 (bps) で表現される。
    送信側と受信側で同じ設定が必要となる。

  • フロー制御
    データの送受信を制御するために、ハードウェアまたはソフトウェアの手法を使用する。

  • 送受信バッファ
    送信するデータと受信したデータを一時的に保持するバッファである。


UARTは、マイコンとPC間、マイコン同士、または他の周辺機器との通信に広く利用されている。
UARTを使用する場合は、ボーレート、データフォーマット、フロー制御等の設定を適切に行う必要がある。


UART

非同期通信

UARTは非同期通信方式を採用している。
送信側と受信側が別々のクロックを使用して、データの送受信タイミングを同期させる必要がない。

送信側と受信側は、あらかじめ設定されたボーレート (通信速度) に基づいてデータを送受信する。

シリアル通信

UARTは、データを1ビットずつ順番に送信するシリアル通信方式である。
送信側は、データを1ビットずつ送信線 (TX) に送出して、受信側は、受信線 (RX) から1ビットずつデータを受信する。

データフォーマット

UARTでは、一般的に以下のようなデータフォーマットが使用されている。

  • スタートビット
    データの開始を示すビット (通常は0)
  • データビット
    実際のデータを表すビット (通常は8ビット)
  • パリティビット
    エラー検出用のビット (偶数パリティまたは奇数パリティ)
  • ストップビット
    データの終了を示すビット (通常は1または2ビット)


ボーレート

ボーレートは、UARTの通信速度を表す。
単位は、ビット/秒 (bps) である。

一般的なボーレートには、9600[bps]、19200[bps]、38400[bps]、115200[bps]等がある。
送信側と受信側は、同じボーレートに設定する必要がある。

フロー制御

UARTでは、データの送受信を制御するためにフロー制御が使用される場合がある。

  • ハードウェアフロー制御
    RTS (Request to Send) 信号とCTS (Clear to Send) 信号を使用して、データの送受信を制御する。
  • ソフトウェアフロー制御
    XON / XOFF制御文字を使用して、データの送受信を制御する。


送受信バッファ

UARTには、送信バッファと受信バッファが用意されている。

送信バッファは送信するデータを一時的に保持して、受信バッファは受信したデータを一時的に保持する。
バッファを使用することにより、データの送受信を効率的に行うことができる。


耐ノイズ性

UARTは、他の通信方式と比較して、ノイズの影響を比較的受けやすい通信方式である。 以下に示す理由から、UARTはノイズに弱いといえる。

  • 単線通信
    UARTは、送信線 (TX) と受信線 (RX) の2本の信号線を使用して通信を行う。
    ノイズの影響を受けると、データの誤りが発生しやすくなる。

  • 非同期通信
    UARTは非同期通信方式を採用しているため、送信側と受信側のクロックが完全に同期していない。
    ノイズの影響でデータのタイミングがずれると、通信エラーが発生する可能性がある。

  • 信号レベル
    UARTは、一般的にTTLレベル (0[V]~5[V]) やCMOSレベル (0[V]~3.3[V]) の信号レベルを使用する。
    これらの信号レベルは、ノイズの影響を受けやすく、信号の品質が低下する可能性がある。


ただし、UARTのノイズ耐性を向上させるためのいくつかの手法がある。

  • シールドケーブルの使用
    通信線をシールドケーブルで保護することにより、外部ノイズの影響を軽減することができる。

  • 適切な信号レベルの選択
    通信距離や環境に応じて、適切な信号レベル (RS-232、RS-422、RS-485等) を選択することにより、ノイズの影響を軽減できる。

  • パリティビットの使用
    パリティビットを使用することにより、通信エラーを検出して、データの整合性を確認できる。

  • フィルタの使用
    ハードウェアまたはソフトウェアのフィルタを使用して、高周波ノイズを除去することができる。


これらの手法を適切に組み合わせることにより、UARTのノイズ耐性を向上させることができる。
ただし、極端に高いノイズ環境下では、より高いノイズ耐性を持つ通信方式 (I2C、SPI、CAN等) の使用を検討する必要がある。


UARTの設定

UART通信の設定を行う場合、UCA0CTL0レジスタを適切に設定する必要がある。
ただし、通信相手のデバイスも同じデータフォーマットを使用するように設定する必要があることに注意する。

  • データ長 8ビット, パリティなし, 1ストップビット (8N1)
 UCA0CTL0 &= ~UCPEN;  // パリティなし
 UCA0CTL0 &= ~UC7BIT; // 8ビットデータ
 UCA0CTL0 &= ~UCSPB;  // 1ストップビット


  • データ長 8ビット, パリティなし, 2ストップビット (8N2)
 UCA0CTL0 &= ~UCPEN;  // パリティなし
 UCA0CTL0 &= ~UC7BIT; // 8ビットデータ
 UCA0CTL0 |= UCSPB;   // 2ストップビット


  • データ長 7ビット, パリティ付き, 1ストップビット (7E1)
 UCA0CTL0 |= UCPEN;   // パリティ付き
 UCA0CTL0 |= UC7BIT;  // 7ビットデータ
 UCA0CTL0 &= ~UCSPB;  // 1ストップビット
 UCA0CTL0 |= UCPAR;   // 偶数パリティ



サンプルコード

MSP430G2553マイコンを使用して、UART通信を行うための手順を、以下に示す。
ターミナルソフト (PuTTY等) を使用して、設定したボーレート (以下の例では、9600[bps]) でシリアル通信を行う。

  • ハードウェアの接続:
    MSP430G2553のP1.1 (UCA0RXD) を受信端子に接続する。
    MSP430G2553のP1.2 (UCA0TXD) を送信端子に接続する。


 #include <msp430.h>
 
 void main(void)
 {
    WDTCTL = WDTPW | WDTHOLD;   // ウォッチドッグタイマを停止
 
    // クロック設定 (例: 1[MHz])
    DCOCTL = 0;
    BCSCTL1 = CALBC1_1MHZ;
    DCOCTL  = CALDCO_1MHZ;
 
    // UART設定
    P1SEL = BIT1 + BIT2;        // P1.1とP1.2をUART用に設定
    P1SEL2 = BIT1 + BIT2;       // P1.1とP1.2をUART用に設定
    UCA0CTL1 |= UCSSEL_2;       // SMCLK (サブメインクロック) を使用
    UCA0BR0 = 104;              // 9600bps (1[MHz]時)
    UCA0BR1 = 0;                // 9600bps (1[MHz]時)
    UCA0MCTL = UCBRS0;          // モジュレーションステージ
    UCA0CTL1 &= ~UCSWRST;       // UARTをソフトウェアリセットから解除
 
    // 送信例
    while (!(UCA0IFG & UCTXIFG));  // 送信バッファが空になるまで待機
    UCA0TXBUF = 'H';               // 文字 'H' を送信
 
    // 受信例
    while (!(UCA0IFG & UCRXIFG));  // 受信バッファにデータが入るまで待機
    char receivedChar = UCA0RXBUF; // 受信データを読み込み
 
    // メインループ
    while(1) {
        // ...略
    }
 }



PCとのUART通信

LinuxでマイコンとUART通信を行う場合は、以下の手順に従う。

  1. シリアルポートの接続
    マイコンのUART送信ピン (TX) をPCのシリアル受信ピン (RX) に接続する。
    マイコンのUART受信ピン (RX) をPCのシリアル送信ピン (TX) に接続する。
    マイコンとPCのグラウンド (GND) を接続する。

  2. シリアルポートの設定
    ターミナルを開いて、シリアルポートを設定する。
    stty -F <デバイスファイルのパス> <ボーレート> <データ長> <ストップビット長> <パリティビットの有無>

    例: stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb

    /dev/ttyUSB0は、使用するシリアルポートのデバイスファイル名を入力する。 (環境に応じて適切なデバイスファイル名に変更すること)
    9600は、ボーレートを表します。 (マイコン側の設定と一致させる)
    cs8は、データ長を8ビットに設定する。
    -cstopbは、ストップビットを1ビットに設定する。
    -parenbは、パリティビットを無効にする。

  3. 通信の確立
    catコマンドを使用して、シリアルポートを読み書きする。
    シリアルポートからの入力を受信して、ターミナルに表示する。
    cat <デバイスファイルのパス>
    例: cat /dev/ttyUSB0

    別のターミナルを開いて、echoコマンドおよびcatを使用して、シリアルポートに書き込む。
    これにより、シリアルポートにテキストが送信される。
    echo "Hello, MSP430!" > <デバイスファイルのパス>

  4. 通信の確認
    マイコン側で受信処理が正しく実装されている場合、送信したテキストがマイコンで受信される。
    マイコン側で送信処理が正しく実装されている場合、マイコンから送信されたデータがターミナルに表示される。


※注意
シリアルポートのデバイスファイル名 (/dev/ttyUSB0等) は、環境によって異なる場合がある。
ls /dev/tty*コマンドを実行して、利用可能なシリアルポートを確認すること。
ボーレートやデータフォーマット等の設定は、マイコン側の設定と一致している必要がある。

一部のLinuxディストリビューションでは、シリアルポートへのアクセス権限が必要な場合があるため、適切な権限を設定すること。