検索 辞書 交通 地図 天気 |
RS232C の入出力を行うプログラム
Windows VisualC++ で主にVISCAプロトコルで動作するソニー製のカメラを制御するために作成したサンプルプログラムですが, 他の RS232C の入出力を行って制御するプログラムにも転用できると思います. linux gcc 版を探している方はこちらへどうぞ. //RS232C制御用アプリケーションのサンプル //EVI-D100 を制御するためのサンプルですが他の場合にも役立つでしょう. #include "stdafx.h" #include "windows.h" //RS232C 制御用 #define ASCII_BEL 0x07 #define ASCII_BS 0x08 #define ASCII_LF 0x0A #define ASCII_CR 0x0D #define ASCII_XON 0x11 #define ASCII_XOFF 0x13 int main(int argc, char* argv[]) { HANDLE hCom; //RS232C制御用 RS232C の初期化 hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL); if (hCom == INVALID_HANDLE_VALUE) { return; } DCB dcb; BOOL fRetVal ; BYTE bSet ; dcb.DCBlength = sizeof(DCB) ; GetCommState(hCom, &dcb) ; dcb.BaudRate = 9600; // 通信速度 dcb.ByteSize = 8; // データ長 dcb.Parity = NOPARITY; // パリティビット:EVENPARITY,MARKPARITY,NOPARITY,ODDPARITY dcb.StopBits = ONESTOPBIT; // ストップビット:ONESTOPBIT,ONE5STOPBITS,TWOSTOPBITS dcb.fOutxDsrFlow = bSet ; if (bSet) { dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ; } else { dcb.fDtrControl = DTR_CONTROL_ENABLE ; } bSet = 0; dcb.fInX = dcb.fOutX = bSet ; dcb.XonChar = ASCII_XON ; dcb.XoffChar = ASCII_XOFF ; dcb.XonLim = 100 ; dcb.XoffLim = 100 ; dcb.fBinary = TRUE ; dcb.fParity = TRUE ; SetCommState(hCom, &dcb); //RS232Cの初期化ここまで int i,j; unsigned long len; // 送信用 char send[32]; int send_length; //受信用 unsigned char resv[32]; int resv_length; unsigned char buff; for(j=0;j<5;j++){ switch(j){ case 0: sprintf(send,"\x88\x30\x01\xff"); send_length=4; break; //アドレス設定 case 1: sprintf(send,"\x88\x01\x00\x01\xff"); send_length=5; break; //インタフェイスクリア case 2: sprintf(send,"\x81\x01\x06\x04\xff"); send_length=5; break; //ホーム case 3: sprintf(send,"\x81\x01\x06\x01\x10\x10\x03\x01\xff"); send_length=9; break; //上向く case 4: sprintf(send,"\x81\x01\x06\x04\xff"); send_length=5; break; //ホーム } Sleep(1000); WriteFile(hCom,send,send_length,&len,NULL); //書き込み printf("%d 回目:",j+1); for(i=0;i<32;i++){ ReadFile(hCom,&buff,1,&len,NULL); //1つずつ受信 resv[i]=buff; printf("%02x ",buff); if(buff==0xff){//ACK の次は Completion if(resv[0]==0x90 && resv[1]==0x41) i=0; else i=32; } } printf("\n"); } //後処理 CloseHandle(hCom); } |
| ||