通知文
表示用端末からマイコンからに送る送信を通知と呼びます。通知は必要に応じて送られます。
主な通知は表示用端末の準備完了通知または端末画面でのタッチ通知です。
準備完了通知
表示用端末の準備が完了して、マイコンよりの描画命令を受けることができるようになったことを通知します。
また端末で今まで送られた描画情報を喪失した場合や、任意のときに「準備完了通知」を送ります。
書式
$RDY
準備完了通知を受け取ったらマイコン側は速やかに現在の画面を描画するのに必要な全情報をを最初から送り直す必要があります。
その場合に最初に送り直す命令は「Init」命令です。
タッチ通知
表示用端末の描画項目をタッチ開始した場合またはタッチ終了した場合に、タッチ通知が送られます。
タッチ通知を受けるには描画項目に描画IDとイベント種別を設定する必要があります。
描画IDまたはイベント種別が設定されていない描画項目をタッチしても何も送られません。
書式
タッチ開始時 $+id
タッチ終了時 $-id
idはタッチ開始した描画項目のIDです。IDのない項目をタッチしても何も送られません。
マイコン側の通知処理
マイコンが表示用端末より通知文を受け取った場合の処理方法について説明します。
一番簡単な方法は通知を無視することです。通常マイコンは受信バッファを持たないので通知が溜まることはありません。
より良い方法は通知に対してマイコンが的確な処理を行うことです。
通知を受信するには受信割込みを利用するのが正しいのですが、BASICプログラムの様に受信割込みが利用できないものもあります。
受信割込みによる方法
受信割込みにより通知文を受け取った場合の対応としては、次の2つの方法が考えられます。
①受信割込みルーチンの中で処理する
②受信フラグを立てて割込みルーチンを終了し、メインルーチンで処理する
の2つの方法が考えられます。
①受信割込みルーチンの中で処理する
MBED C
char recieve[20];
int index = 0;
void pc_rx () {
char c = pc.getc();
if (c == 10) {
if (index == 4 && memcmp(recieve, "$RDY", 4) == 0) {
// 準備完了通知受信処理
}
index = 0;
} else {
recieve[index++] = pc.getc();
if (index >= 20)
index = 0;
}
}
int main() {
pc.baud(9600);
pc.format(8, Serial::None, 1);
pc.attach(pc_rx, Serial::RxIrq);
受信割込みルーチンの中で描画データの送信を行う場合は注意が必要です。メインルーチンで描画データを送付途中に受信割込みが発生し、ここで割込みによる描画データ送信が発生すると、メインルーチンの送信データの途中に割込みによる描画データが混じることになります。
これを回避するために、割込みにより描画データを送る場合は全データの先頭に「(\n」を付加し、全データの末尾に「)\n」を付加して下さい。(注)「)\n」の前にも改行があります。
これにより表示用端末では割込みにより送られた描画データを正しく表示することができます。
②受信フラグを立てて割込みルーチンを終了し、メインルーチンで処理する
MBED C
char recieve[20];
int index = 0;
bool ready = false;
void pc_rx () {
char c = pc.getc();
if (c == 10) {
if (index == 4 && memcmp(recieve, "$RDY", 4) == 0) {
ready = true;
}
index = 0;
} else {
recieve[index++] = pc.getc();
if (index >= 20)
index = 0;
}
}
int main() {
pc.baud(9600);
pc.format(8, Serial::None, 1);
pc.attach(pc_rx, Serial::RxIrq);
....
....
....
if (ready) {
// 準備完了通知受信処理
ready = false;
}
....
....
....
....
①の方法は直ちに応答できますが、②の方法は応答のタイミングが遅れますので①の方法が望ましいです。
受信割込みによらない方法
受信割込みが使えない、または使いたくない場合はメインルーチンで受信データを待受けて処理します。
MBED C
char recieve[20];
int index = 0;
while(1) {
while (pc.readable()) {
if (index >= 20)
index = 0;
char c = pc.getc();
if (c == 10) {
if (index == 4 && memcmp(recieve, "$RDY", 4) == 0) {
// 準備完了通知受信処理
}
index = 0;
} else {
recieve[index++] = pc.getc();
}
}
// 通常の処理
}
getc()で受信したデータを配列に保存しCHR$(10)を受信したら配列の中の文字を判断する。
IchigoJam BASIC
130 I=0
140 C=INKEY()
150 IF C=0 GOTO 210
160 IF I>=20 THEN I=0
170 IF C<>10 [I]=C:I=I+1:GOTO 140
180 IF I<>4 OR [0]<>ASC("$") OR [1]<>ASC("R") OR [2]<>ASC("D") OR [3]<>ASC("Y") GOTO 200
190 REM ここへ準備完了通知受信処理を記述
200 I=0
210 REM 通常の処理を記述
220 GOTO 140
INKEYで受信したデータを配列に保存しCHR$(10)を受信したら配列の中の文字を判断する。