/* Linux 仮想COM版 DACS-1500/1700/2500 通信サンプルプログラム LD15DIVC.c 2008/8/8 ダックス技研株式会社 */ #include #include #include #include #include #include #define BAUDRATE B38400 /* 通信速度の仮設定(標準ボーレートであればよい) DACS-1500/1700/2500は専用USBデバイスなので、 この速度は実際に動作する通信速度ではない。 USB2.0ハイスピードモードにて動作する。*/ #define MODEMDEVICE "/dev/ttyUSB0" /* デバイスファイルの指定 */ int main() { int fd; /* fd:ファイルディスクリプタ */ int res, txs; /* res:受け取った文字数 txs:送信文字数 */ int recpoint; /* recpoint:受信データ格納ポイント */ long rxtout; /* rxtout:受信タイムアウトカウンタ */ int i; struct termios oldtio, newtio; /* 通信ポートを制御するためのインターフェイス */ char buf[256]; /* 送受信文字格納領域 */ char txtbuf[256]; /* キー入力文字格納領域 */ char recbuf[256]; /* 受信データ格納領域 */ if((fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY ))==-1){ /* O_RDWR:読み書き両用 O_NOCTTY:tty制御をしない */ perror(MODEMDEVICE); exit(-1); } tcgetattr(fd, &oldtio); /* 現在のシリアルポートの設定を待避させる*/ bzero(&newtio, sizeof(newtio)); /* 新しいポート設定の構造体をクリアする*/ newtio.c_cflag = (BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD); newtio.c_iflag = (IGNPAR | ICRNL); newtio.c_oflag = 0; /* Raw モードでの出力 */ newtio.c_lflag = 0; /* カノニカル入力を無効とする */ tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); do{ printf("input > "); fgets(txtbuf,32,stdin); /* キーボードより文字列を入力 */ if(txtbuf[0] == '-') break; /* - を入力すると終了 */ txs = strlen(txtbuf); printf("TX data > %s",txtbuf); txtbuf[txs-1] = 0xd; res = read(fd,buf,40); /* 残留データ受信処理(残留データの破棄) */ write(fd,txtbuf,txs); /* 送信処理 */ recpoint = 0; /* 受信データ格納ポイント初期化 */ rxtout = 0; /* 受信タイムアウトカウンタをリセット*/ do{ res = read(fd,buf,40); /* 受信処理 */ if(res != 0){ for(i = 0; i != res; i++){ recbuf[recpoint] = buf[i]; /* 受信データを連結 */ recpoint = recpoint + 1; if(recpoint > 200) break; } recbuf[recpoint] = 0; /* 文字列の終端をセットする */ rxtout = 0; /* 受信タイムアウトカウンタをリセット*/ res = res - 1; if((buf[res] == 0xd) || (buf[res] == 0xa)) break; } else rxtout = rxtout + 1; /* 受信タイムアウトカウンタを更新 */ }while(rxtout < 2000000); if(recpoint != 0) printf("RX data > %s",recbuf); /* 受信データ表示 */ }while(1); tcsetattr(fd, TCSANOW, &oldtio); /* 退避させた設定に戻す */ close(fd); /* ポートを閉じる */ return(0); }