/* Copyright(c) 2002,2003 Device Drivers Limited, All rights reserved. */ /* info@devdrv.com http://www.devdrv.com/ */ #include #include #include #include int fdr; int fdw; char rbuf[256]; /* 受信側バッファ */ char wbuf[256] = "abcdefghij"; /* ダミーの送信データ、一応内容を確認するため */ #define LOOP_COUNT 20 /* ループカウント,115200bpsで停止させるるために必要 */ /* 書き込み側スレッド */ void *threadA (char *arg) { int i, len; printf("Thread-A Start.\n"); for(i = 0; i < LOOP_COUNT; i++) { len = write(fdw, wbuf, 256); /* 256バイト×20回のデータ出力 */ } close(fdw); } /* 読み込み側スレッド */ void *threadB (char *arg) { int i, len, total; total = 0; printf("Thread-B Start.\n"); for(i = 0;; i++) { /* 条件成立までの無限ループ */ len = read(fdr, rbuf, 256); /* 実際の入力バイト数をlenに保存 */ if(i == 1) { /* カウンタが1のとき(2回目のループで)*/ tcflow(fdr, TCOOFF); /* RTSをOFFにして通信停止要求する */ sleep(1); /* 1秒間待つ */ tcflow(fdr, TCOON); /* RTSをONにして通信を再開 */ } printf("%d(%d): %s\n", i, len, rbuf); /* 動作確認のための途中経過表示 */ if ((total+=len) >= (LOOP_COUNT * 256)) /* 合計入力バイト数を計算 */ break; /* 出力したバイトと一致したらば終了 */ } close(fdr); } int main() { int s; struct termios tio; pthread_t thA, thB; /* 読み込み側ディスクリプタのオープン処理 */ if ((fdr = open("/dev/ttyS0", O_RDONLY)) < 0) { fprintf(stderr, "th: open error\n"); exit(1); } /* 書き込み込み側ディスクリプタのオープン処理 */ if ((fdw = open("/dev/ttyS0", O_WRONLY)) < 0) { fprintf(stderr, "th: open error\n"); exit(1); } printf("Program Start.\n"); bzero(&tio, sizeof(tio)); /* アトリビュート設定構造体の初期化 */ /* 115200bps, フロー制御有り, 8ビット,DTR/DSR無効,受信可能 */ tio.c_cflag = B115200 | CRTSCTS | CS8 | CLOCAL | CREAD; tio.c_cc[VMIN] = 1; /* 入力データをバッファしない */ tcsetattr(fdr, TCSANOW, &tio); /* 受信側アトリビュートのセット */ tcsetattr(fdw, TCSANOW, &tio); /* 送信側アトリビュートのセット */ if ((s = pthread_create(&thB, NULL, (void*) threadB, NULL)) != 0) { printf("thB: create error!\n"); /* 読み込み側スレッドの起動とエラー処理 */ exit(2); } if ((s = pthread_create(&thA, NULL, (void*) threadA, NULL)) != 0) { printf("thA: create error!\n"); /* 書き込み側スレッドの起動とエラー処理 */ exit(3); } if ((s = pthread_join(thA, NULL)) != 0) { /* スレッドの終了待ち */ printf("thA: join error!\n"); exit(4); } printf("Thread-A Exit.\n"); if ((s = pthread_join(thB, NULL)) != 0) { /* スレッドの終了待ち */ printf("thB: join error!\n"); exit(5); } printf("Thread-B Exit.\n"); exit(0); } /* コンパイルコマンド: cc -g -lpthread -o thread-io thread-io.c */