UART Rx回路を入れてみる。
出来た事
1.UART Rx プログラム追加と動作確認
2.UARTでコマンドを入れるとレスポンスするプログラムにモディファイ
(ハイパーターミナル設定注意)
3.C言語をちょっと学ぶ。(文字列の比較と分岐)
1.UART Rx プログラム追加と動作確認
まずはエレキジャックさんの記事の(8)をやっていきます。
LPC1100がLPC1343になるだけです。
問題なく出来ました(^^
2.UARTでコマンドを入れるとレスポンスするプログラムにモディファイ
ちょっとモディファイしてみます。
想定は
1.ハイパーターミナルであらかじめ決めたコマンドを入力
2.内部処理実施(内部データの参照など)
3.結果をハイパーターミナルに表示
という、実際にものを作る際に必要になりそうなものです。
で、今回は内部処理をとばして(2をとばして)1と3をやります。
ハイパーターミナルで
rd1と入力すると15
rd2と入力すると30
それ以外はna (not available)を返すというものです。
rd はreadという意味で個人的にFPGAなどをコントロールするときよく使ってます。
変更したコードは
#include
//追加
// Main loop
int main(void) {
// Variable declaration
char line[40]; // Line buffer;
char *s; // return value
char ans[2];// Initialize UART
uart_init(9600);
uart_puts("HELLO WORLD\r\n");// Enter an infinite loop, just echo lines
while (1) {
// Get a line from UART
strcpy(s,"0");
s = uart_gets(line, sizeof line);
if (s) {
// Put a line into UART if valid
// 追加スタート
if(!strcmp(s,"rd1")){
strcpy(ans,"15");
}else if(!strcmp(s,"rd2")){
strcpy(ans,"30");
}else{
strcpy(ans,"na");
}
//追加エンドuart_puts(ans);
uart_puts("\r\n");
}
}
すると
rd1と入力してリターンを押すと15
rd2と入力してリターンを押すと30
が返ってきます。
それ以外はna(not available)です。
赤い矢印がインプット
青い矢印がアウトプット(戻ってきた答え)です。
またコレをやっているときに
ハイパーターミナルの設定で少しはまりましたので注意
プロパティで以下のチェックをはずしておくことが必要です。
チェックがある場合は
リターンを押したときに復帰+改行("\r\n")になります
チェックがない場合は単純な復帰("\r")になります。
以下はエレキジャックさんのコードですが
"\r"でブレイクしてしまいます。
// receive a string via RXD
char *uart_gets(char * const buf, const int size) {
int ch;
int n = 0;while (n < size - 1) {
ch = uart_getc();
if (ch == '\r') {
// detected end of line
uart_puts("\r\n");
break;
}
uart_putc(ch);
buf[n++] = ch;
}
buf[n] = 0;
return buf;
}
ですから設定でチェックがある場合は
起動して
"rd1"+リターンとすると
"rd1\r\n" と入力されたことになります。
"\r"でブレークしてbufに"rd1"が入りますが
次に"rd2"と入れた場合に"\n"が残ってますから
bufには"\nrd2"が入ってしまい問題になります。
ですから今回は設定を変更して"\n"を無くしてこのバグを回避しました。
3.C言語をちょっと学ぶ。(文字列の比較と分岐)
今回追加した部分は文字列を使った分岐です。
FPGAのとき(Velilog)はよくCase文を使ったので調べてみると
switch case文というのがありました。
しかし文字列には使えないということ(C言語では)
なのでif文を使いました。
FPGAでは書き方で回路規模やディレイが変わるのでタイミングが厳しいところは注意が必要なんですが
MCUは順次処理だからどうでもいいのかな。。
まぁ、出来たからコレで良いやと思います。
また比較も文字列のときは
strcmp
を使わなければならないとの事で。。
そして、strcmpを使うには
#include
をインクルードしなければならないということで。。
少しずつ勉強です。。