#include #include #include #include #include #include #include #include #define _POSIX_SOURCE 1 /* POSIX 準拠のソース */ void errorQuit(char *s){ printf("エラー:%s\n",s); exit(-1); } int main(int argc, char * argv[]){ int fd; char buf[16384]; int len = 0; struct termios oldtio,newtio; fd=open("/dev/cua0", O_RDWR | O_NOCTTY ); if(fd<0) errorQuit("モデムデバイスを開けませんでした。"); tcgetattr(fd,&oldtio); /* 現在のシリアルポートの設定を待避させる*/ bzero(&newtio, sizeof(newtio)); /* 新しいポートの設定の構造体をクリアする */ /* BAUDRATE: ボーレートの設定.cfsetispeed と cfsetospeed も使用できる. CRTSCTS : 出力のハードウェアフロー制御 (必要な結線が全てされているケー ブルを使う場合のみ.Serial-HOWTO の7章を参照のこと) CS8 : 8n1 (8 ビット,ノンパリティ,ストップビット 1) CLOCAL : ローカル接続,モデム制御なし CREAD : 受信文字(receiving characters)を有効にする. */ newtio.c_cflag = B38400 | CRTSCTS | CS8 | CLOCAL | CREAD; /* IGNPAR : パリティエラーのデータは無視する ICRNL : CR を NL に対応させる(これを行わないと,他のコンピュータで CR を入力しても,入力が終りにならない) それ以外の設定では,デバイスは raw モードである(他の入力処理は行わない) */ newtio.c_iflag = IGNPAR | ICRNL; /* Raw モードでの出力 */ newtio.c_oflag = 0; /* ICANON : カノニカル入力を有効にする 全てのエコーを無効にし,プログラムに対してシグナルは送らせない */ newtio.c_lflag = ICANON; /* 全ての制御文字を初期化する デフォルト値は /usr/include/termios.h を見れば分かるが,コメントに書 いてあるので,ここでは見る必要はない. */ newtio.c_cc[VINTR] = 0; /* Ctrl-c */ newtio.c_cc[VQUIT] = 0; /* Ctrl-\ */ newtio.c_cc[VERASE] = 0; /* del */ newtio.c_cc[VKILL] = 0; /* @ */ newtio.c_cc[VEOF] = 4; /* Ctrl-d */ newtio.c_cc[VTIME] = 0; /* キャラクタ間タイマを使わない */ newtio.c_cc[VMIN] = 1; /* 1文字来るまで,読み込みをブロックする */ newtio.c_cc[VSWTC] = 0; /* '\0' */ newtio.c_cc[VSTART] = 0; /* Ctrl-q */ newtio.c_cc[VSTOP] = 0; /* Ctrl-s */ newtio.c_cc[VSUSP] = 0; /* Ctrl-z */ newtio.c_cc[VEOL] = 0; /* '\0' */ newtio.c_cc[VREPRINT] = 0; /* Ctrl-r */ newtio.c_cc[VDISCARD] = 0; /* Ctrl-u */ newtio.c_cc[VWERASE] = 0; /* Ctrl-w */ newtio.c_cc[VLNEXT] = 0; /* Ctrl-v */ newtio.c_cc[VEOL2] = 0; /* '\0' */ /* モデムラインをクリアし,ポートの設定を有効にする */ tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); /* 端末の設定終了.入力を処理するできるようになった. 例では,行の先頭に 'z' を入力することでプログラムを終了させる */ do { buf[0] = '\0'; len = read(fd, buf,16383); buf[16383] = '\0'; if(len >= 0 && len<16384) buf[len] = '\0'; printf("%s",buf); }while(strncmp(buf,"END",3)); return 0; }