| | // SerialPort.cpp
#include "SerailPort.h"
#include <windows.h>
struct WinSerialPort : SerialPort {
HANDLE handle;
int open(const char* name,const char* prm) {
close();
handle=CreateFileA(name,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
return handle==INVALID_HANDLE_VALUE ? 1 : 0 ;
}
void close() {
if (invalid()) return;
CloseHandle(handle); handle=INVALID_HANDLE_VALUE;
}
int invalid() { return handle==INVALID_HANDLE_VALUE; }
int setup(const char* config) {
if (invalid()) return 1;
DCB dcb[1]; ZeroMemory(dcb,sizeof(*dcb));
dcb->DCBlength=sizeof(*dcb);
// COMx[:][baud=b][parity=p][data=d][stop=s][to={on|off}][xon={on|off}][odsr={on|off}][octs={on|off}][dtr={on|off|hs}][rts={on|off|hs|tg}][idsr={on|off}]
BOOL rv=BuildCommDCBA(config,dcb); if (!rv) return 2;
rv=SetCommState(handle,dcb); if (!rv) return 3;
#if 0
COMMTIMEOUTS timeouts[1]; ZeroMemory(timeouts,sizeof(*timeouts));
timeouts->ReadIntervalTimeout=100; /* Maximum time between read chars. */
timeouts->ReadTotalTimeoutMultiplier=10; /* Multiplier of characters. */
timeouts->ReadTotalTimeoutConstant=100; /* Constant in milliseconds. */
timeouts->WriteTotalTimeoutMultiplier=10; /* Multiplier of characters. */
timeouts->WriteTotalTimeoutConstant=100; /* Constant in milliseconds. */
rv=SetCommTimeouts(handle,timeouts); if (!rc) return 4;
#endif
return 0;
}
int set_dtr(bool value) {
if (invalid()) return 1;
BOOL rv=EscapeCommFunction(handle, value ? SETDTR : CLRDTR);
return rv ? 0 : 2;
}
int set_rts(bool value) {
if (invalid()) return 1;
BOOL rv=EscapeCommFunction(handle, value ? SETRTS : CLRRTS);
return rv ? 0 : 2;
}
int get_rxqueue() {
if (invalid()) return 0;
DWORD Errors=0; COMSTAT stat[1];
BOOL rv=ClearCommError(handle,&Errors,stat);
return rv ? stat->cbInQue : 0;
}
int read(void* data,int size) {
if (invalid()) return 0;
DWORD rd=0;
BOOL rv=ReadFile(handle,data,size,&rd,0);
return rd;
}
int write(void* data,int size) {
if (invalid()) return 0;
DWORD wr=0;
BOOL rv=WriteFile(handle,data,size,&wr,0);
return wr;
}
WinSerialPort() {
handle=INVALID_HANDLE_VALUE;
}
~WinSerialPort() {
close();
}
};
SerialPort* SerialPort::create(const char* name,const char* prm) {
WinSerialPort *port=new WinSerialPort();
int res=port->open(name,prm);
if (prm) port->setup(prm);
return port;
}
|