第6回

「第6回」の編集履歴(バックアップ)一覧に戻る

第6回 - (2015/08/10 (月) 17:22:33) のソース

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

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


***1.CRSのgoogleドライブから「Serail.h」をダウンロード
ダウンロードしたファイルをAtmelStudioのプロジェクトフォルダーの中にコピーしてください。


***2.シリアルモジュールとマイコンを接続します。
下の図を参考にしてください。
#ref(接続図.png,,height=200,)

それでは、以下のプログラムを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.");
 				}
 			}
 		}
 	}
 }