トップへ

  検索 辞書 交通 地図 天気

RS232C の入出力を行うプログラム
linux gcc で主にVISCAプロトコルで動作するソニー製のカメラを制御するために作成したサンプルプログラムですが, 他の RS232C の入出力を行って制御するプログラムにも転用できると思います. Windows VC++ 版を探している方はこちらへどうぞ.
//RS232C制御用アプリケーションのサンプル
//EVI-D100 を制御するためのサンプルですが他の場合にも役立つでしょう.

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>

//ここからメイン
int main( void )
{
  //変数宣言
  int fd;
  struct termios tio;
  int err;
  int i,j;

  // 送信用
  char send[32];
  int send_length;
  
  //受信用
  unsigned char resv[32];
  int resv_length;
  unsigned char buff;

  // Com1 を開いて初期設定
  if ((fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY | O_NONBLOCK))<0) {
    exit(-1);
  }
  bzero(&tio, sizeof(tio));
  tio.c_cflag = B9600 | CS8 | CLOCAL | CREAD;
  tio.c_iflag = IGNPAR;
  tio.c_oflag = 0;
  tio.c_lflag = 0;
  tio.c_cc[VTIME] = 0;
  tio.c_cc[VMIN] = 1;
  
  tcflush(fd, TCIFLUSH);
  tcsetattr(fd, TCSANOW, &tio);
  fcntl(fd, F_SETFL, FNDELAY);
  //初期設定ここまで

  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(1);
	
    err = write(fd, send, send_length); //書き込み
    
    printf("%d 回目:",j+1);
    for(i=0;i<32;i++){
      err=-1;
      while(err<0){
	err = read(fd,&buff,1); //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");
  }
  
  //後処理
  close( fd );
}

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

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

Copyright(c) Masaki Onishi All rights reserved.