第6回

シリアル通信とは?

マイコンには様々な通信方法が有りますが、ここではシリアル通信というものを扱います。
通信には次の大きく分けて2種類有ります。
シリアル通信
1つの線で通信
パラレル通信
複数の線で通信

更にシリアル通信のなかでもUART(Universal Asynchronous Receiver Transmitter)というものです。
詳しくは第11回にやりますが、ここでは一つの通信線で一方向に一文字ずつ通信ができるということを理解してください。


1.CRSのgoogleドライブから「Serail.h」をダウンロード

ダウンロードしたファイルをAtmelStudioのプロジェクトフォルダーの中にコピーしてください。


2.シリアルモジュールとマイコンを接続します。

下の図を参考にしてください。

それでは、以下のプログラムをAVRに書き込んでみてください。
#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include "Serial.h"

//ポート設定の初期化
int main(void){
	serial.begin(12);  //UARTの初期化
	DDRD  = 0b11111111;//PDをすべて出力設定
	PORTD = 0b00000000;//PDをすべてLに

	while(1){
		serial.send_char('H');
		serial.send_char('e');
		serial.send_char('l');
		serial.send_char('l');
		serial.send_char('o');
		serial.send_char(' ');
		serial.send_char('W');
		serial.send_char('o');
		serial.send_char('r');
		serial.send_char('l');
		serial.send_char('d');
		serial.send_br();

		PORTD = ~PORTD;//PDをすべて反転

		_delay_ms(1000);
	}
}

それでは、TeraTermを起動してください。「シリアル」を選択して「ポート」を選択して「OK」をクリックします。
画面に「Hello World」と表示されれば成功です。

いろいろと新しい関数が出てきました。send_char関数はシリアル通信で一文字送信する関数です。
C言語では一文字をASCIIコードで表すのに「'(シングルコート)」を使います。
何言ってんだって感じですね。ちゃんと説明します。

コンピュータ(マイコンを含む)は文字をそのまま保存することが出来ません。
なので、文字を数字に置き換えて、数字の羅列として文字を保存しています。
つまり、文字列は数字の羅列として保存されているわけです。
その文字と数字の変換を決めた決まりがASCIIコードというわけです。
どの数字がその文字に対応しているかは、googleとかで「ASCIIコード表」とググれば出てくるので調べてください。
さて、シリアル通信に話を戻します。UARTで通信を行うときも数字に変換してから数字として文字を送っています。
なので、一文字を数字に変換してくれる書き方である、「'」を使って書く必要があります。

もう一つ関数がありますよね。send_br関数です。これは、改行を行うための関数です。
PCでプログラミングをしている時とは改行の手順が異なるため専用の関数があります。


他の例もあげておきます。C言語の復習に使ってください。
#include <avr/io.h>
#define F_CPU 1000000
#include <util/delay.h>
#include "Serial.h"

ISR(USART_RX_vect){
	serial.receive_enqueue(UDR0);
}

//ポート設定の初期化
int main(void){
	int16_t var = 0;
	uint8_t character = 0;
	serial.begin(12);  //UARTの初期化
	DDRD = 0b11111111;//PDをすべて出力設定
	PORTD = 0b00000000;//PDをすべてLに

	while(1){
		serial.send_println("a : toggle LED"); // 改行付きで文字列を送信する関数
		serial.send_println("b : plus one");
		serial.send_println("s : show variable");

		serial.send_br(); // 改行する関数

		// available関数は現在受信した文字数を返す。
		// whileの特別な構文。受信文字数が1より小さい時に繰り返す。
		while(serial.available() < 1);

		// 受信した文字を変数に保存
		character = serial.read_dequeue();

		// 条件分岐
		if(character == 'a'){
			PORTD = ~PORTD;//PDをすべて反転
		}else{
			if(character == 'b'){
				var++;
			}else{
				if(character == 's'){
					// send_num関数は変数の値を送信する関数。
					//int16_t型とint32_t型なら使える。
					serial.send_print("var = "); // 改行なしで文字列を送信する関数
					serial.send_num(var);
					serial.send_br();
				}else{
					serial.send_println("there is not such a command.");
				}
			}
		}
	}
}

添付ファイル