概要
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通信を行う場合は、以下の手順に従う。
- シリアルポートの接続
- マイコンのUART送信ピン (TX) をPCのシリアル受信ピン (RX) に接続する。
- マイコンのUART受信ピン (RX) をPCのシリアル送信ピン (TX) に接続する。
- マイコンとPCのグラウンド (GND) を接続する。
- シリアルポートの設定
- ターミナルを開いて、シリアルポートを設定する。
stty -F <デバイスファイルのパス> <ボーレート> <データ長> <ストップビット長> <パリティビットの有無>
- 例:
stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb
- /dev/ttyUSB0は、使用するシリアルポートのデバイスファイル名を入力する。 (環境に応じて適切なデバイスファイル名に変更すること)
- 9600は、ボーレートを表します。 (マイコン側の設定と一致させる)
- cs8は、データ長を8ビットに設定する。
- -cstopbは、ストップビットを1ビットに設定する。
- -parenbは、パリティビットを無効にする。
- ターミナルを開いて、シリアルポートを設定する。
- 通信の確立
cat
コマンドを使用して、シリアルポートを読み書きする。- シリアルポートからの入力を受信して、ターミナルに表示する。
cat <デバイスファイルのパス>
- 例:
cat /dev/ttyUSB0
- 別のターミナルを開いて、
echo
コマンドおよびcat
を使用して、シリアルポートに書き込む。 - これにより、シリアルポートにテキストが送信される。
echo "Hello, MSP430!" > <デバイスファイルのパス>
- 通信の確認
- マイコン側で受信処理が正しく実装されている場合、送信したテキストがマイコンで受信される。
- マイコン側で送信処理が正しく実装されている場合、マイコンから送信されたデータがターミナルに表示される。
※注意
シリアルポートのデバイスファイル名 (/dev/ttyUSB0等) は、環境によって異なる場合がある。
ls /dev/tty*
コマンドを実行して、利用可能なシリアルポートを確認すること。
ボーレートやデータフォーマット等の設定は、マイコン側の設定と一致している必要がある。
一部のLinuxディストリビューションでは、シリアルポートへのアクセス権限が必要な場合があるため、適切な権限を設定すること。