概要
AVRとPC間でシリアル通信する方法を確認しました。AVRでは、UART機能を使用し、C#では.NetFrameworkのSerialPortクラスを使用して実現します。
ここでは、通信の基本であるエコーバックを実装し、通信のやり方を確認します。
準備
ハードウェアの準備
以前組み立てたAVR AtMega168Pマイコンボードを使用します。
もちろんこれは必須ではなく、AVR168Pもしくはこれと互換性のあるAVRマイコンとFT232RLが実装されており、USBでパソコンと接続できればOKです。
AVRとFT232RLの取り付けの解説は割愛しますが、次のように実装します。
- AVRのTXDとFT232RLのRXDが接続されている。
- AVRのRXDとFT232RLのTXDが接続されている。
ライブラリ
UARTを使った処理をかんたんに実装するために、次のコードを実装しました。初期化と読み書き、割り込み処理といった基本的なレジスタ操作をまとめたものです。サンプル
単純なエコーバック
- パソコンから文字をAVRに送信する。
- AVRは受信した文字のアスキコードをエコーバックする。
AVR
これを実現するために、AVRで実装したコードはdev1/usartsample/main.cです。
int main(void) {
    # USARTを初期化します。割り込みなし,ボーレート9600
    USART_init(NOMAL, 51);
    # printfをするときはUSART_sendData関数を利用するように登録します。
    fdevopen(*USART_sendData, NULL);
    # printfしてみます。
    printf("Enter>>\n");
    # 以下、データを受信して、受信したデータを送信するエコーバックを繰り返します。
    while (1) {
        uint8_t val = USART_recieveData();
        printf("%d\n", val);
    }
}
- USART_initの2つ目の引数51はボーレート設定値を示します。
- クロック8MHz動作時で9600のボーレートです。
- データシートに値の設定方法が解説してありますので、参照してください。
- fdevopen()でUSART_sendData関数を登録することでprintfを使えるようにしています。
C#
VisualStudioからC#プロジェクトを作成します。今回はコンソールアプリケーションとします。
|  | 
| コンソールアプリケーションの作成(C#) | 
SerialPortクラスを使用して、Read&Writeを行うプログラムを実装します。( SerialSample/Program.cs )
            if (!serialPort.IsOpen) {
                serialPort.Open();
            }
            while (true) {
                string val = System.Console.ReadLine();               
                serialPort.Write(val.Substring(0, 1));
                var readVal = serialPort.ReadLine();
                System.Console.WriteLine(readVal);
            }
- AVR側は複数バイトの受信に対応していないため、Substringメソッドで先頭文字だけ抽出しています。
- SerialPort.Write()で書き込み、SerialPort.ReadLine()で\nまで読み込みます。
実行結果
次のように、入力した文字に対するアスキーコードを返しています。アスキーコード表で確認すると正しくレスポンスされていることがわかります。
実行結果
補足
今回、C#でシリアル通信の実装を確認するためC#で通信を実装しましたが、TeraTermを用いても等価のことを実行できます。

