/* * ***************************************************************** * * * * * Copyright (c) Fast Corporation, 1998 * * * * * * All Rights Reserved. Unpublished rights reserved under * * * the copyright laws of the Japan. * * * * * * The software contained on this media is proprietary to * * * and embodies the confidential technology of Fast * * * Corporation. Possession, use, duplication or * * * dissemination of the software and media is authorized only * * * pursuant to a valid written license from Fast Corporation. * * * * * ***************************************************************** */ /* CSC90X RS232C通信サンプルプログラム */ /* MS−DOS16ビット用 */ /* メインルーチン C_RCMD_M.C */ /*[作成者]A.Kameda */ /* 目的: 90Xシステムコマンドによりメジャー(2値計測)を実行します。 関数: 履歴: Ver 1.00 97/11/05 Ver 2.00 98/11/09 Watcomm C/C++ 対応。 注記: 90Xのエコーバックは[on]、ターミネートは[CR/LF]とする。 使い方 c_rcmd_m [option [option...]] -Mn ホストの機種番号です。 n は0(PC9801), 1(IBMPC), 2(J3100), 3(AX) 省略時は0 です。 -Bn ボーレートです。 n は1200, 1800, 2400, 4800, 9600, 19200 省略時は9600 です。 -Ln データ長です。 n は5, 6, 7, 8 省略時は8 です。 -Pn パリティです。 n は0(NONE), 1(ODD), 3(EVEN) 省略時は0 です。 -Sn ストップビットです。 n は0(1bits), 1(1.5bits), 3(2bits) 省略時は0 です。 -? 使い方を表示します。 Copyright (c) 1997, FAST Corporation */ /* * Include compiler runtime library */ #include #include #include #include #include /* * Include CSC90X library */ #include "clink.h" /* RS232C,C−LINKライブラリ */ #define RETRY_TIME 10 #define ON 1 #define OFF 0 #define CR_OK 0 #define CR_ERR 1 #define CR_NAK 2 #define CR_NON 3 /* * プロトタイプ宣言 */ static short rs232c_measure_cmd( void ); static short rs232c_measure_next( void ); static void rs232c_clear_cmd( void ); static void rs232c_err_message( short ); static void illegal_option( void ); /* * メイン */ void main( int argc, char **argv ) { short machine, speed, length, parities, stops, xs, channel; short ret, exit_value; #ifdef __WATCOMC__ cprintf( "\r\nRS232C Sample program【C_RCMD_M.EXE】 Ver. 2.00" ); cprintf( "\r\nCopyright (c) 1997, FAST Corporation. ALL rights reserved" ); cprintf( "\r\n" ); #else printf( "\nRS232C Sample program【C_RCMD_M.EXE】 Ver. 2.00" ); printf( "\nCopyright (c) 1997, FAST Corporation. ALL rights reserved" ); printf( "\n" ); #endif /* デフォルトセット */ machine = PC9801; speed = B9600; length = L8; parities = PNONE; stops = S1; xs = XCOFF; channel = FIRST; /* コマンドライン引き数解析 */ argv++; for( ; --argc > 0; argv++ ) { strupr( *argv ); if( **argv == '-' ) { switch( *( *argv + 1 ) ) { case 'M': if( !( strcmp( *argv + 2, "0" ) ) ) machine = PC9801; else if( !( strcmp( *argv + 2, "1" ) ) ) machine = IBMPC; else if( !( strcmp( *argv + 2, "2" ) ) ) machine = J3100; else if( !( strcmp( *argv + 2, "3" ) ) ) machine = AX; else illegal_option(); break; case 'B': if( !( strcmp( *argv + 2, "1200" ) ) ) speed = B1200; else if( !( strcmp( *argv + 2, "1800" ) ) ) speed = B2400; else if( !( strcmp( *argv + 2, "2400" ) ) ) speed = B2400; else if( !( strcmp( *argv + 2, "4800" ) ) ) speed = B4800; else if( !( strcmp( *argv + 2, "9600" ) ) ) speed = B9600; else if( !( strcmp( *argv + 2, "19200" ) ) ) speed = B19200; else illegal_option(); break; case 'L': if( !( strcmp( *argv + 2, "5" ) ) ) length = L5; else if( !( strcmp( *argv + 2, "6" ) ) ) length = L6; else if( !( strcmp( *argv + 2, "7" ) ) ) length = L7; else if( !( strcmp( *argv + 2, "8" ) ) ) length = L8; else illegal_option(); break; case 'P': if( !( strcmp( *argv + 2, "0" ) ) ) parities = PNONE; else if( !( strcmp( *argv + 2, "1" ) ) ) parities = PODD; else if( !( strcmp( *argv + 2, "3" ) ) ) parities = PEVEN; else illegal_option(); break; case 'S': if( !( strcmp( *argv + 2, "0" ) ) ) stops = S1; else if( !( strcmp( *argv + 2, "1" ) ) ) stops = S15; else if( !( strcmp( *argv + 2, "3" ) ) ) stops = S2; else illegal_option(); break; case '?': #ifdef __WATCOMC__ cprintf( "\r\nUsage:" ); cprintf( "\r\n" ); cprintf( "\r\n c_rcmd_m [option [option...]]" ); cprintf( "\r\n" ); cprintf( "\r\noptions" ); cprintf( "\r\n"); cprintf( "\r\n -Mn Machine n : 0(PC9801), 1(IBMPC), 2(J3100), 3(AX) (default : 0)" ); cprintf( "\r\n -Bn Baudrete n : 1200, 1800, 2400, 4800, 9600, 19200 (default : 9600)" ); cprintf( "\r\n -Ln Data bit n : 5, 6, 7, 8 (default : 8)" ); cprintf( "\r\n -Pn Parity n : 0(NONE), 1(ODD), 3(EVEN) (default : 0)" ); cprintf( "\r\n -Sn Stop bit n : 0(1bit), 1(1.5bit), 3(2bit) (default : 0)" ); cprintf( "\r\n"); #else printf( "\nUsage:" ); printf( "\n" ); printf( "\n c_rcmd_m [option [option...]]" ); printf( "\n" ); printf( "\noptions" ); printf( "\n"); printf( "\n -Mn Machine n : 0(PC9801), 1(IBMPC), 2(J3100), 3(AX) (default : 0)" ); printf( "\n -Bn Baudrete n : 1200, 1800, 2400, 4800, 9600, 19200 (default : 9600)" ); printf( "\n -Ln Data bit n : 5, 6, 7, 8 (default : 8)" ); printf( "\n -Pn Parity n : 0(NONE), 1(ODD), 3(EVEN) (default : 0)" ); printf( "\n -Sn Stop bit n : 0(1bit), 1(1.5bit), 3(2bit) (default : 0)" ); printf( "\n"); #endif exit( 0 ); } } } /* RS232Cの初期化 */ ret = init_rs232c( machine, speed, length, parities, stops, xs, channel ); if( NO_ERROR == ret ) { exit_value = 0; /* メジャー(2値計測)実行 */ ret = rs232c_measure_cmd(); if( CR_OK == ret ) { #ifdef __WATCOMC__ cprintf( "\r\n" ); #else printf( "\n" ); #endif } else { rs232c_err_message( ret ); exit_value = 1; } /* RS232Cの終了 */ finish_rs232c(); exit( exit_value ); } else { #ifdef __WATCOMC__ cprintf( "\r\nRS-232C Initialize error\r\n" ); #else printf( "\nRS-232C Initialize error\n" ); #endif exit( 1 ); } } /* * メジャー(2値計測)実行 */ static short rs232c_measure_cmd() { char cmd_buff[10]; /* コマンドバッファ */ short ret, ret_value; unsigned char recv_buff[10]; /* 受信バッファ */ short length; short copy_flag; ret_value = CR_ERR; /* Mコマンド */ strcpy( cmd_buff, "M 0" ); ret = outcmd_rs232c( cmd_buff ); if( NO_ERROR == ret ) { /* エコーバックのため */ gets_rs232c( WAITING, 5, recv_buff, &length, RETRY_TIME ); copy_flag = ON; while( 1 ) { /* データの受信 */ ret = gets_rs232c( WAITING, 1, recv_buff, &length, RETRY_TIME ); if( NO_ERROR == ret ) { if( '>' == recv_buff[0] ) { /* プロンプト */ break; } else if( CMD_ACK == recv_buff[0] ) { /* 正常終了('!') */ ret_value = CR_OK; copy_flag = OFF; } else if( CMD_NAK == recv_buff[0] ) { /* 異常終了('%') */ ret_value = CR_NAK; copy_flag = OFF; } else if( CMD_NON == recv_buff[0] ) { /* コマンド未定義 */ ret_value = CR_NON; copy_flag = OFF; } else { /* データ */ if( ON == copy_flag ) { #ifdef __WATCOMC__ cprintf( "%c", recv_buff[0] ); #else printf( "%c", recv_buff[0] ); #endif } } } } if( CR_OK == ret_value ) { rs232c_measure_next(); /* Eコマンド */ strcpy( cmd_buff, "E" ); ret = outcmd_rs232c( cmd_buff ); if( NO_ERROR == ret ) { /* エコーバックのため */ gets_rs232c( WAITING, 3, recv_buff, &length, RETRY_TIME ); /* コマンド応答チェック */ ret = checkcmdack_rs232c( RETRY_TIME ); if( NO_ERROR == ret ) { /* CSC901プロンプトチェック */ ret = checkprmpt_rs232c( RETRY_TIME ); } else ret_value = CR_ERR; } else ret_value = CR_ERR; } } return ret_value; } /* * 次エリア情報取得 */ static short rs232c_measure_next() { char cmd_buff[10]; /* コマンドバッファ */ short ret, ret_value; unsigned char recv_buff[10]; /* 受信バッファ */ short length; short copy_flag; short process; ret_value = CR_ERR; for( process = ON; OFF != process; ) { /* Nコマンド */ strcpy( cmd_buff, "N" ); ret = outcmd_rs232c( cmd_buff ); if( NO_ERROR == ret ) { /* エコーバックのため */ gets_rs232c( WAITING, 3, recv_buff, &length, RETRY_TIME ); copy_flag = ON; while( 1 ) { /* データの受信 */ ret = gets_rs232c( WAITING, 1, recv_buff, &length, RETRY_TIME ); if( NO_ERROR == ret ) { if( '>' == recv_buff[0] ) { /* プロンプト */ break; } else if( CMD_ACK == recv_buff[0] ) { /* 正常終了('!') */ ret_value = CR_OK; copy_flag = OFF; } else if( CMD_NAK == recv_buff[0] ) { /* 異常終了('%') */ ret_value = CR_NAK; copy_flag = OFF; process = OFF; } else if( CMD_NON == recv_buff[0] ) { /* コマンド未定義 */ ret_value = CR_NON; copy_flag = OFF; process = OFF; } else { /* データ */ if( ON == copy_flag ) { #ifdef __WATCOMC__ cprintf( "%c", recv_buff[0] ); #else printf( "%c", recv_buff[0] ); #endif } } } } } } return ret_value; } /* * 画面のクリアとフリーラン */ static void rs232c_clear_cmd() { char cmd_buff[10]; /* コマンドバッファ */ short ret; unsigned char recv_buff[10]; /* 受信バッファ */ short length; /* Cコマンド */ strcpy( cmd_buff, "C\n" ); ret = puts_rs232c( cmd_buff, 2 ); if( NO_ERROR == ret ) { /* エコーバックのため */ gets_rs232c( WAITING, 3, recv_buff, &length, RETRY_TIME ); /* コマンド応答チェック */ ret = checkcmdack_rs232c( RETRY_TIME ); if( NO_ERROR == ret ) { /* CSC901プロンプトチェック */ checkprmpt_rs232c( RETRY_TIME ); } } } /* * RS232Cエラーメッセージの出力 */ static void rs232c_err_message( short err_code ) { #ifdef __WATCOMC__ cprintf( "\r\nRS232C Error " ); switch( err_code ) { case CR_NAK: cprintf( "[MEASURE]" ); rs232c_clear_cmd(); break; case CR_NON: cprintf( "[COMMAND]" ); break; default: cprintf( "[??????????]" ); } cprintf( "\r\n" ); #else printf( "\nRS232C Error " ); switch( err_code ) { case CR_NAK: printf( "[MEASURE]" ); rs232c_clear_cmd(); break; case CR_NON: printf( "[COMMAND]" ); break; default: printf( "[??????????]" ); } printf( "\n" ); #endif } /* * コマンドライン引き数が異常のときはメッセージを表示し、プログラム * を終了します。 */ static void illegal_option(void) { #ifdef __WATCOMC__ cprintf( "\r\nInvalid options" ); #else printf( "\nInvalid options" ); #endif exit( 1 ); }