//=========================================================
#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);
}
//=========================================================