//========================================================= #include "rs232c.h" #include //========================================================= RS232C::RS232C(int ComNum, char *param) { char buf[MAXPATH]; MyComNum = ComNum; wsprintf(buf, "COM%1d", ComNum); ComHandle = CreateFile(buf, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); ComStatus = (ComHandle == INVALID_HANDLE_VALUE)? NG : READY; if(ComStatus != READY) return; if(SetupComm(ComHandle, RX_BUF_SIZE, TX_BUF_SIZE) != TRUE) { ComStatus = NG; return; } GetCommState(ComHandle, &dcb); if(BuildCommDCB(param, &dcb) != TRUE) { ComStatus = NG; return; } //InitDCB(); //独自設定 dcb.EvtChar = 0x0d; //1行読み込みモード if(SetDCB() == NG) return; SetTimeOut( 0 ); // MAXDWORD // SetCommMask(ComHandle, EV_RXCHAR); } //---------------------------------- RS232C::~RS232C() { if ( ComStatus == READY) CloseHandle(ComHandle); } //========================================================= //受信バッファ、送信バッファは4kぐらいを想定 //#define TX_BUF_SIZE 4096 //#define RX_BUF_SIZE 4096 //BuildComで初期化するときは、この関数の後にすること void RS232C::InitDCB(void) { // dcb.fBinary = 1; /* バイナリ モード、 EOFをチェックしない */ // dcb.fParity = 1; /* パリティ チェックを有効 */ // dcb.fOutxCtsFlow = 0; /* CTS出力フロー制御 */ // dcb.fOutxDsrFlow = 0; /* DSR出力フロー制御 */ // dcb.fDtrControl = DTR_CONTROL_ENABLE; /* DTRフロー制御の種類 */ // dcb.fDsrSensitivity =1; /* DSRの感度 */ // dcb.fTXContinueOnXoff = 1; /* XOFF後も送信を継続 */ // dcb.fOutX = 1; /* XON/XOFF出力フロー制御 */ // dcb.fInX = 1; /* XON/XOFF入力フロー制御 */ // dcb.fErrorChar = 1; /* エラーによる置換を有効 */ // dcb.fNull = 1; /* ヌル ストリッピングを有効 */ // dcb.fRtsControl = 2; /* RTSフロー制御 */ // dcb.fAbortOnError = 1; /* エラー時に読み取りまたは書き込みを中止 */ // dcb.wReserved = 0; /* 現バージョンでは使わない */ // dcb.XonLim = 256; /* 送信におけるXONスレッショルド */ // dcb.XoffLim = 256; /* 送信におけるXOFFスレッショルド */ // dcb.ByteSize= 8; /* バイト当たりのビット数 (4〜8) */ // dcb.Parity = 0; /* 0〜4、 0 = なし、 1 = 奇数、 2 = 偶数、 3 = マーク、 4 = 空白 */ // dcb.StopBits= 0; /* 0、 1、 2 = 1、 1.5、 2 */ // dcb.XonChar = 0x11; /* 送信および受信に対するXON文字 */ // dcb.XoffChar= 0x13; /* 送信および受信に対するXOFF文字 */ // dcb.ErrorChar = 0xff; /* エラー置換文字 */ // dcb.EofChar = 0x1a; /* 入力文字の終わり */ // dcb.EvtChar = 0x0a; /* 受け取ったイベント文字 */ } //---------------------------------- RS232C::ComStat RS232C::SetDCB(void) { return ComStatus= SetCommState(ComHandle, &dcb)? READY : NG; } //---------------------------------- //Data Communication //送信に成功した数を返す int RS232C::Send( const void *buf, int size) // 981005 F { DWORD rc; if(WriteFile(ComHandle, buf, size, &rc, 0) == FALSE) GetLastError(); return rc; } //---------------------------------- //受信したバイト数を返す int RS232C::Read(void *buf, int size) { DWORD rc = 0; if(ReadFile(ComHandle, buf, size, &rc, 0) == FALSE) { GetLastError(); } return rc; } //---------------------------------- //文字列として受信 char *RS232C::ReadStr(char *buf, int size) { DWORD rc; rc = Read(buf, size-1); buf[rc] = 0; return buf; } //---------------------------------- // 指定した終端文字(一般に改行)まで読み、0で終端させて受信文字数を返す // タイムアウトしないばあいがあるので一文字ずつ受信する。 // タイムアウトまたは、バッファいっぱいのばあいは、0−受信文字数を返す。 // サイズは31ビット分ですよ。 1998/10/07 Fujinaga. int RS232C::ReadLine(char *rcvStr, char nl, int bufsize ) { int count = 0, tmout = 1; while ( (Read( rcvStr, 1 ) == 1) && (count < bufsize -1) ){ if ( *rcvStr == nl ){ rcvStr++; tmout = 0; break; } count++; rcvStr++; } *rcvStr = 0; // 文字列の終端 if ( tmout ) count = 0 - count; return count; } //---------------------------------- // タイムアウト時間設定 void RS232C::SetTimeOut( DWORD t ) { // 受信待ち時間指定 comtime.ReadIntervalTimeout = MAXDWORD; comtime.ReadTotalTimeoutMultiplier = 0; comtime.ReadTotalTimeoutConstant = t; // 送信タイムアウトはしない。 comtime.WriteTotalTimeoutMultiplier = comtime.WriteTotalTimeoutConstant = 0; SetCommTimeouts(ComHandle, &comtime); } //=========================================================