|
|
当サイトは、玄箱PRO (KURO-BOX/Pro)を中心とした組み込み、Linuxと電子工作を扱っています。
会社案内
情報セキュリティおよび個人情報の取り扱いについて コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。コメントはそれぞれ投稿した人のものです。 |
int
asy_init(int fd, speed_t speed)
{
struct termios t;
int modemline; /* 現在の設定を読む */
tcgetattr(fd, &t);
ここで、現在の設定を構造体 t に読み込みます。
ボーレートを設定します。asy_init()を呼び出すときに speed で指定されたものをそのまま cfsetspeed() に渡しています。speed は、数値ではなく、 B38400 など、ボーレートに B をつけたもので指定します。B38400 などはヘッダ・ファイル内で定義されています。/* ボーレートのセット */ cfsetspeed(&t, speed);
ブレーク信号やパリティ・エラーが発生しても無視します。/* raw モードのセット(パリティ・チェックなし) */ cfmakeraw(&t); /* 入力モードの設定 */ t.c_iflag = (IGNBRK | IGNPAR);
8ビット, 受信許可, フロー制御なしとします。CREAD を設定しないと受信できないことに注意します。ここで CSTOPB を指定しなければストップ・ビットは'1'になります。/* 制御モードの設定 */ t.c_cflag = (CS8 | CREAD | CLOCAL);
データを受信しなかったときに、 read() 関数があきらめるまでの設定をします。VTIME はあきらめるまでの時間を 0.1秒単位で指定します。VMIN は最低読み込む文字数です。ここでは、0.1秒間 1 文字以上受信できるまで read() 関数はあきらめません。その間、read() 関数を呼び出した側はブロックされます。 両方とも '0' を設定すると、受信バッファがからのときも read() 関数はすぐに戻ってきます。/* 制御文字の設定, 0.1 秒が経過するか 1 文字受信するまでブロックする */ t.c_cc[VTIME] = 1; /* 0.1 sec */ t.c_cc[VMIN] = 1; /* 1 char */
tcsetattr() を使うことで設定をします。TCSANOW を指定しているのですぐに設定が反映されます。/* 上記の設定をする */ tcsetattr(fd, TCSANOW, &t);
送受信バッファを消してしまいます。/* バッファをフラッシュする */ tcflush(fd, TCIOFLUSH);
return 0; }
int
mywrite(int fd, const void *buf, int count)
{
int i; for (i=0; i
write(fd, buf, 1);
buf ++;
usleep(1*1000);
}
return i;
}
void
checkret(int fd, char c)
{
char r; if (read(fd, &r, 1) < = 0) {
fprintf(stderr, "Read timeoutn");
exit(1);
}
if (r != c) {
fprintf(stderr, "Unexpected char returnedn");
exit(1);
}
}
struct timezone tz;
struct tm tm_; gettimeofday(&tv, &tz);
localtime_r(&tv.tv_sec, &tm_);
sprintf(buf, "%02d/%02d %02d:%02d %02d", tm_.tm_mon + 1, tm_.tm_mday,
tm_.tm_hour, tm_.tm_min, tm_.tm_sec);
cc -o clock clock.cまたは、
でコンパイルしてください。グラフィック液晶をつないだポートを指定し、実行します。make clock
./clock /dev/ttyUSB0/dev/ttyUSB0 の場合は省略可能です。実行すると動画のように表示されます。
このブログ記事を参照しているブログ一覧: シリアル・ポートを使ってLCDに時刻を表示してみる
このブログ記事に対するトラックバックURL: http://www.eleki-jack.com/mt/mt-tb.cgi/1089
おすすめ書籍 |
![]() |
コメントする