///////////////////////////////////////////////////////////////////////// // C++でのRS232c通信クラス ///////////////////////////////////////////////////////////////////////// // //このクラスの使い方サンプル // //#include "RS232c.h" //このヘッダーを取り込みます。 // //int _tmain(int argc, _TCHAR* argv[]) //{ // RS232c rs; // rs.Connect(); //接続します。ここで各種パラメータを設定します。詳しくはインターフェイス参照 // rs.Send("test data"); //文字列を送信 Send(送信文字列) // char w[100]; // rs.Read(w,100); //文字列の受信 Read(char配列,読み込む文字数) // //もしくは、 // //rs.Read_CRLF(w,99); //最後にCRLFが付くまで受信 Read_CRLF(char配列,配列サイズ) // printf(w); // //クローズする必要はありません、オブジェクトが破棄された時、クローズされます // getchar(); // return 0; //} //マルチスレッドには対応しておりません。マルチスレッドにて使用する場合は、 //SendとReadを同時に読み出さないようにしてください。 ////////////////////////////////////////////////////////////////////////// #ifndef _RS_232C_H_ #define _RS_232C_H_ #if _MSC_VER > 1000 #pragma once #endif #include class RS232c{ private: HANDLE m_hComm; DWORD size; DCB m_Dcb; public: //各種パラメーターの設定後に接続します。 返り値 TRUE = 成功 FALSE = 失敗 bool Connect(char* PortNmae, //ポート名を指定します COM1 COM2など、初期値はCOM1 int BaudRate,//ボーレートを指定します。初期値は 9600 int ByteSize,//1バイトのビット数を指定します。初期値は 8 int Parity,//パリティを指定します。パリティなし: NOPARITY //偶数パリティ: EVENPARITY //奇数パリティ: ODDPARITY //初期値は、パリティなし: NOPARITY int StopBits,//ストップビット数を指定します。 //1ビット: ONESTOPBIT //1.5ビット: ONE5STOPBITS //2ビット: TWOSTOPBITS //初期値は 1ビット: ONESTOPBIT int RTS, //RTSをON=RTS_CONTROL_ENABLE 初期値は無効です int DTR, //DTRをON=DTR_CONTROL_ENABLE 初期値は無効です int ReadTimeOut,//受信時のタイムアウト msで指定 初期値は 5000ms int WriteTimeOut//送信時のタイムアウト msで指定 初期値は 20000ms ); //文字列の受信 Read(char配列,読み込む文字数) 返り値 TRUE = 成功 FALSE = 失敗 bool Read(char* Buff,int NumberOfCharactersToRead); //文字列の受信 Read_CRLF(char配列,バッファーサイズ) 返り値 TRUE = 成功 FALSE = 失敗 //CRLFをキャッチしたときに受信完了します、読み込み文字列がバッファーサイズをあふれた場合は //その時点までの文字列しか受信できません bool Read_CRLF(char* Buff,int NumberOfCharactersToRead); //文字列を送信 Send(送信文字列) 返り値 TRUE = 成功 FALSE = 失敗 bool Send(char* word); //接続の状態を取得します bool RS232c::isLink(); //デストラクタ ポートを閉じます ~RS232c(); }; bool RS232c::Connect(char* PortNmae="COM1", int BaudRate = 9600, int ByteSize = 8, int Parity = NOPARITY, int StopBits = ONESTOPBIT, int RTS = RTS_CONTROL_DISABLE, int DTR = DTR_CONTROL_DISABLE, int ReadTimeOut =5000, int WriteTimeOut = 20000 ) { m_hComm = CreateFile( PortNmae, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0 ); if( m_hComm == INVALID_HANDLE_VALUE ) return FALSE; // イベントを使用しないようにセットする SetCommMask( m_hComm, 0 ); // 入出力バッファの許容量設定 SetupComm( m_hComm, 2000L, 2000L ); // タイムアウト情報のセット COMMTIMEOUTS m_CommTime; m_CommTime.ReadIntervalTimeout = 0xFFFFFFFF; m_CommTime.ReadTotalTimeoutMultiplier = 0; m_CommTime.ReadTotalTimeoutConstant = ReadTimeOut; m_CommTime.WriteTotalTimeoutMultiplier = 0; m_CommTime.WriteTotalTimeoutConstant = WriteTimeOut; // タイムアウトの設定 SetCommTimeouts( m_hComm, &m_CommTime); // 通信デバイス情報の取得 GetCommState( m_hComm, &m_Dcb ); // 通信デバイス情報の修正 m_Dcb.DCBlength = sizeof( DCB ); m_Dcb.fBinary = FALSE; m_Dcb.BaudRate = BaudRate; m_Dcb.ByteSize = ByteSize; m_Dcb.Parity = Parity; m_Dcb.StopBits = StopBits; m_Dcb.fRtsControl = RTS; m_Dcb.fDtrControl = DTR; m_Dcb.fDsrSensitivity = FALSE; m_Dcb.fAbortOnError = FALSE; m_Dcb.fNull = TRUE; m_Dcb.fParity =TRUE; m_Dcb.ErrorChar =0x00; m_Dcb.fErrorChar = TRUE; SetCommState( m_hComm, &m_Dcb ) ; if( !SetCommState( m_hComm, &m_Dcb ) ) return FALSE; return TRUE; } bool RS232c::Read(char* Buff,int NumberOfCharactersToRead){ for(int i=0;i1) beChar=Buff[c-1]; Buff[c++]=buf[0]; }else{ return FALSE; } } return TRUE; } bool RS232c::Send(char* word){ if(0==WriteFile(m_hComm,word,strlen(word),&size, NULL)){ return FALSE; }else{ return TRUE; } } bool RS232c::isLink(){ if(m_Dcb.fDtrControl == DTR_CONTROL_ENABLE){ //DTRが有効の場合のみ有効 DWORD dwSts; BOOL fSuccess = GetCommModemStatus( m_hComm, &dwSts ); // 信号ステータスの取得 if( !fSuccess ){ } else { if(!(dwSts & MS_DSR_ON)) return FALSE; //DSR信号ON //if(dwSts & MS_CTS_ON) //CTSON //if(dwSts & MS_RING_ON) //RINGON if(!(dwSts & MS_RLSD_ON)) return FALSE; //RLSDON } } return TRUE; } RS232c::~RS232c(){ //ポートを閉じます CloseHandle(m_hComm); } #endif // _RS_232C_H_