//-------------------------------------------------------// // // rs.cpp - シリアルポート制御クラス // // #include #include "rs.h" //-------------------------------------------------------// crs232c::crs232c(void) { Fhandle = 0; } crs232c::crs232c(int port) { Fhandle = 0; ZeroMemory(&Fcomstat, sizeof(Fcomstat)); setPort(port); } crs232c::~crs232c(void) { close(); } //-------------------------------------------------------// int crs232c::getDCB(DCB *pdcb) { return GetCommState(Fhandle, pdcb); } int crs232c::setDCB(DCB *pdcb) { return SetCommState(Fhandle, pdcb); } int crs232c::setRate(int rate) { getDCB(&Fdcb); Fdcb.BaudRate = rate; if (!setDCB(&Fdcb)) return 0; return rate; } int crs232c::getRate(void) { getDCB(&Fdcb); return Fdcb.BaudRate; } int crs232c::setPort(int port) { Fport = port; if (!open()) return 0; return Fport; } int crs232c::getPort(void) { return Fport; } int crs232c::setTimeout(int timeval) { GetCommTimeouts(Fhandle, &Fcommtimeouts); Fcommtimeouts.ReadIntervalTimeout = 0; Fcommtimeouts.ReadTotalTimeoutMultiplier = 0; Fcommtimeouts.ReadTotalTimeoutConstant = timeval; Fcommtimeouts.WriteTotalTimeoutMultiplier = 0; Fcommtimeouts.WriteTotalTimeoutConstant = timeval; if (!SetCommTimeouts(Fhandle, &Fcommtimeouts)) { return -1; } return timeval; } int crs232c::getTimeout(void) { GetCommTimeouts(Fhandle, &Fcommtimeouts); return (int)Fcommtimeouts.WriteTotalTimeoutConstant; } int crs232c::getInque(void) { DWORD errorVal; Fcomstat.cbInQue = 0; ClearCommError(Fhandle, &errorVal, &Fcomstat); return Fcomstat.cbInQue; } void crs232c::clear(void) { PurgeComm(Fhandle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR); } //-------------------------------------------------------// int crs232c::open(void) { char portName[6] = "COM"; if (Fhandle != 0) close(); portName[3] = (char)Fport + '0'; portName[4] = '\0'; Fhandle = CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if (!Fhandle) return 0; getDCB(&Fdcb); Fdcb.BaudRate = CBR_57600; Fdcb.ByteSize = 8; Fdcb.StopBits = ONESTOPBIT; Fdcb.Parity = NOPARITY; Fdcb.fParity = false; Fdcb.fOutxCtsFlow = true; Fdcb.fRtsControl = RTS_CONTROL_HANDSHAKE; setDCB(&Fdcb); setTimeout(30000); clear(); return (int)Fhandle; } void crs232c::close(void) { if (Fhandle == 0) return; CloseHandle(Fhandle); } //-------------------------------------------------------// int crs232c::getch(void) { int ch; read((char *)&ch, 1); return ch; } void crs232c::putch(int ch) { write((char *)&ch, 1); } unsigned int crs232c::read(char* buf, int len) { DWORD readsize; int inquesize = getInque(); if (len > inquesize) len = inquesize; ReadFile(Fhandle, buf, len, &readsize, NULL); return (unsigned int)readsize; } unsigned int crs232c::write(char* buf, int len) { DWORD writesize; WriteFile(Fhandle, buf, len, &writesize, NULL); return (unsigned int)writesize; } //-------------------------------------------------------// HANDLE crs232c::handle(void) { return Fhandle; }