1. はじめに
シリアル通信を行うクラスです。対象のマイコンはAtmega88シリーズですが、「Class_Serial.cpp」の中身を少し変えるだけで、他のマイコンにも使えます。
2. 使う準備
3. プログラミングについて
「Class_Serial.hpp」をインクルードしてください。シリアル通信を始める前にser0.begin()を呼び出します。引数はUBRRnレジスタに設定する値です。データシートで確認してください。serial0.println()で引数の文字列を改行文字をつけて送信します。
次のプログラムは1秒に1回「test」という文字列を改行付きで送信するプログラムです。
#include <avr/io.h>
#include <util/delay.h>
// インクルードするのはヘッダーファイルのみです。
// これで、Serial通信に関するメソッドを使うことが出来ます。
#include "Class_Serial.hpp"
// 実行するためにインスタンスを生成します。
Class_Serial serial0(&UCSR0A, &UCSR0B, &UCSR0C, &UBRR0, &UDR0);
// 受信割り込みを設定する。
ISR(USART_RX_vect){
serial0.receive_enqueue(UDR0);
}
int main(void){
// シリアル通信を開始する前に呼び出してください。
// 引数はUBRRレジスタに設定する値を渡します。
// 例)クロックが1MHzで9600bpsで通信:引数=12
serial0.begin(12);
while(1){
// testという文字列を送信
serial0.send_println("test");
_delay_ms(1000);
}
}
続いてはシリアル通信の受信処理です。このクラスは内部にバッファーを持っていて、受信した文字はそのバッファーに蓄積されます。バッファーに溜まっているデータの数はserial0.available()で得られます。この受信処理には割り込みを使用しています。そこで、割り込みを有効にするためのメソッドとしてaccept_intterupt()が用意されています。受信処理を行う場合はこのメソッドを呼び出す必要があります。次の例は4文字受信するたびに、受信した文字を送り返すプログラムです。
#include <avr/io.h>
#include <util/delay.h>
// インクルードするのはヘッダーファイルのみです。
// これで、Serial通信に関するメソッドを使うことが出来ます。
#include "Class_Serial.hpp"
// 実行するためにインスタンスを生成します。
Class_Serial serial0(&UCSR0A, &UCSR0B, &UCSR0C, &UBRR0, &UDR0);
// 受信割り込みを設定する。
ISR(USART_RX_vect){
ser0.receive_enqueue();
}
int main(void){
// シリアル通信を開始する前に呼び出してください。
// 引数はUBRRレジスタに設定する値を渡します。
// 例)クロックが1MHzで9600bpsで通信:引数=12
serial0.begin(12);
serial0.accept_intterupt();
while(1){
if(serial0.available() >= 4){ // 受信している文字数が4以上であるかを確認
for(int i = 0; i < 4; i++){
// メソッドread_dequeue()はバッファーからデータを取得して、
// そのデータをバッファーから削除する。
// 返されるデータは一番古いもの。いわゆるキュー構造になっている。
char data = serial0.read_dequeue();
// 受信した4つのデータをそのまま送信している。
serial0.send_char(data);
}
}
}
}
最後に、変数に格納されているデータの送信方法です。文字列ではなく、整数型の変数で保存されている値を送信するためには、ser0.send_num()を使います。引数として、送信したい変数を指定してください。この時、送信する変数の型はsignedである必要があります。以下に例を示します。
#include <avr/io.h>
#include <util/delay.h>
// インクルードするのはヘッダーファイルのみです。
// これで、Serial通信に関するメソッドを使うことが出来ます。
#include "Class_Serial.hpp"
// 実行するためにインスタンスを生成します。
Class_Serial serial0(&UCSR0A, &UCSR0B, &UCSR0C, &UBRR0, &UDR0);
// 受信割り込みを設定する。
ISR(USART_RX_vect){
ser0.receive_enqueue();
}
int main(void){
// シリアル通信を開始する前に呼び出してください。
// 引数はUBRRレジスタに設定する値を渡します。
// 例)クロックが1MHzで9600bpsで通信:引数=12
ser0.begin(12);
// 送信する変数
int16_t num = 0;
while(1){
ser0.send_num(num);
num++;
_delay_ms(100);
}
}
最終更新:2017年09月01日 00:40