/* Linux 仮想COM版 DACS-8200 通信サンプルプログラム LD82DIVC.c 2008/8/8 ダックス技研株式会社 */ #include #include #include #include #include #include #include #include #define BAUDRATE B38400 /* 通信速度の仮設定。実際に動作する通信速度ではない */ #define MODEMDEVICE "/dev/ttyUSB0" /* デバイスファイルの指定 */ int main() { int fd; /* fd:ファイルディスクリプタ */ int res, txs; /* res:受け取った文字数 txs:送信文字数 */ int recpoint; /* recpoint:受信データ格納ポイント */ long rxtout; /* rxtout:受信タイムアウトカウンタ */ int i, j, k; struct termios oldtio, newtio; /* 通信ポートを制御するためのインターフェイス */ struct serial_struct serial; char buf[256]; /* 送受信文字格納領域 */ char txtbuf[256]; /* キー入力文字格納領域 */ char recbuf[11000]; /* 受信データ格納領域 */ 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; /* カノニカル入力を無効とする AD変換データを(約)100ポイント以上指定すると データ量が多くてカノニカルでは処理できないため */ tcflush(fd, TCIFLUSH); tcsetattr(fd,TCSANOW,&newtio); /* DACS-8200用のボーレート1382400bpsを設定 この速度は、DACS-8200内部のUSB専用ICとMPU間のデータ転送速度となる */ ioctl(fd,TIOCGSERIAL,&serial); serial.custom_divisor = serial.baud_base / 1382400; serial.flags = 0x0030; ioctl(fd,TIOCSSERIAL,&serial); 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 > 10240) 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){ if(recpoint < 41) printf("RX data > %s",recbuf); /* データ数が少ないときの受信文字を表示 */ else{ /* 以下は、データ数が40文字を超えるときの表示処理 */ j = (recpoint+39)/40; for(i = 0; i != j; i++){ if((i+1)*40 < recpoint){ printf("RX data%3d> ",i); for(k = 0; k != 40; k++){ /* 1行分受信文字を表示 */ printf("%c",recbuf[i*40+k]); } printf("\n"); } else printf("RX data%3d> %s",i, &recbuf[i*40]); } } } }while(1); tcsetattr(fd, TCSANOW, &oldtio); /* 退避させた設定に戻す */ close(fd); /* ポートを閉じる */ return(0); }