| |
検索
辞書
交通
地図
天気
|
|
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);
}
|
|
|
|