/*シリアルポートsci0を使った通信(受信)*/
#include <string.h>
#include <mes2.h>
int main() {
int fd,i,len,r = 0;
unsigned char lcd[82];
char *a;
unsigned char Word[] = "ニュウリョクシテクダサイ:";
// ポインタに配列lcdの先頭アドレスを入れる
a = lcd;
// LCD画面の消去
fd = open("lcd0", 0);
for(i=0;i<32;++i){
seek(fd, i);
fprintf(fd, " ");
}
close(fd);
fd = open("com0", 0);
write(fd, Word, strlen(Word));
close(fd);
do{
// 文字入力があるまで待つ
while(r == 0){
fd = open("com0",0);
sleep(80);
r = read(fd, a, 1);
close(fd);
printf("%d",r);
}
// 画面に入力中の文字を表示する
fd = open("com0",0);
write(fd,a,1);
close(fd);
r = 0;
// ポインタaを一要素分進める
a = ++a;
}
// ENTERキーが押されるまで受け付ける
while(*(a-1)!= 0x0D);
//受信したらLCDに書き出す
fd = open("lcd0", 0);
write(fd, lcd, strlen(lcd));
close(fd);
len = strlen(lcd);
printf("\r\n%d文字受信しました",len);
}//main
今回は上のようなプログラムで動きました。
特に大事なのは、readする前のsleep();です。最初ここを書かずにやっていたのですが、文字を受信できませんでした。com0をopenした後、sleepを入れたほうがよいようです。
sleepの数字はいくつか試して適当な値(ここでは80)を入れています。この数字が大きすぎても小さすぎてもだめなようです。いろいろ試してやってみると面白いかもしれません。
このsci0_2.cはこちらにおきます。ダウンロードして使ってください。保存先はC:\mes\sci0_2フォルダの中にします(sci0_2フォルダをmesフォルダの中に新規作成する)。
そして、コンパイル、RAMに転送します。RAMに転送する際、ハイパーターミナルからではなく、先ほどインストールしたTeraTermを使ってください。これまでのプログラム転送の手順と一緒です。ifconfigでマイコンにIPアドレスを設定し、pingでマイコン側からパソコンへ通信できるか確認、その後、tftpサーバを立ち上げて、プログラムをLANを使って転送します。
elfファイルの転送が完了したら、プログラムを実行する前に、(TeraTermも起動したまま)ハイパーターミナルを立ち上げます。ハイパーターミナルのシリアルポートの設定はCOM1に合わせ、ボーレート(速度)は57600にしておき、通話状態にさせます。
COM1側の準備が整ったら、TeraTerm画面から下のようにsci0_2.elfを実行します。
sci0_2.elfを実行すると、ハイパーターミナルの画面に「ニュウリョクシテクダサイ:」と半角カナで表示されます。これで受信まち状態に入っています。
ハイパーターミナルの画面の上でクリックして、ゆっくりと文字を打ち込んでいきます。早すぎると取りこぼすので一つずつキーを押して、取り込まれるのを確認しながら打ちましょう。Enterキーが押されるまで受信するようにプログラムを書いているので、終わったらEnterキーを押してください。
Enterキーが押されると、上図でいうと上部のほう(TeraTermの画面の一部です)にあるように、「○文字受信しました」という表示がでます。この○文字は最後のEnterキーを含んだ受信数です。
なお、受信中にTeraTermの画面では、0や1の数字がだーっと並んで表示されていますが、これはrの値(受信した文字が何文字か)です。1と表示されているところで文字を受信したことが分かります。本当に受信が正しくできているかを見るために今回はこのように書きました。
今回の受信動作については実験を始めてからなかなか成功せず、少し時間が掛かってしまいました。プログラムも相変わらず無駄の多いものになってます。とりあえず動いた!っていうのを載せておこうと思います。
もっといいプログラムが書けたらそれに差し替えます。・・書けないだろうけど(汗)。
次は9.H8-3069ボード同士の通信です。>>
|