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