2016年3月22日火曜日

基本: AVRのUARTとC#でシリアル通信

概要

AVRとPC間でシリアル通信する方法を確認しました。AVRでは、UART機能を使用し、C#では.NetFrameworkのSerialPortクラスを使用して実現します。
ここでは、通信の基本であるエコーバックを実装し、通信のやり方を確認します。

準備

ハードウェアの準備

もちろんこれは必須ではなく、AVR168Pもしくはこれと互換性のあるAVRマイコンとFT232RLが実装されており、USBでパソコンと接続できればOKです。

AVRとFT232RLの取り付けの解説は割愛しますが、次のように実装します。
  • AVRのTXDとFT232RLのRXDが接続されている。
  • AVRのRXDとFT232RLのTXDが接続されている。
AVRとFT232RLを使ったUSB-シリアル通信の実験に解説されているとおりです。

ライブラリ

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を用いても等価のことを実行できます。