トップへ

  検索 辞書 交通 地図 天気

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);

}

トップへ他のサンプルプログラムへ

月に2回程度の更新を目標としています

Copyright(c) Masaki Onishi All rights reserved.