mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-16 22:02:58 -06:00
244 lines
5.7 KiB
C++
244 lines
5.7 KiB
C++
#ifndef _COMPORT_
|
|
#include "ComPort.hpp"
|
|
#endif
|
|
|
|
//using namespace std;
|
|
|
|
COMPort::COMPort () : dcb (NULL) {
|
|
dcb = new char [sizeof(DCB)];
|
|
getState(); // Riempie il DCB con le impostazioni attuali della porta
|
|
setBlockingMode();
|
|
setHandshaking();
|
|
open = false;
|
|
}
|
|
|
|
COMPort::~COMPort() {
|
|
delete [] dcb;
|
|
|
|
CloseHandle ((HANDLE)portHandle);
|
|
open = false;
|
|
}
|
|
|
|
COMPort& COMPort::connect(const char * const portName, unsigned long _rate, Parity _parity, DataBits _bytesize, StopBits _stopbits ) {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
|
|
if(!open) {
|
|
portHandle = (unsigned) CreateFile ( portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_NO_BUFFERING, NULL );
|
|
if (portHandle == HFILE_ERROR) return *this;
|
|
|
|
aDCB.fBinary = true;
|
|
aDCB.fNull = false;
|
|
aDCB.BaudRate = _rate;
|
|
aDCB.Parity = _parity;
|
|
aDCB.ByteSize = _bytesize;
|
|
aDCB.StopBits = _stopbits;
|
|
aDCB.fAbortOnError = true;
|
|
|
|
open = true;
|
|
return setState();
|
|
}
|
|
else return *this;
|
|
}
|
|
|
|
COMPort& COMPort::disconnect() {
|
|
if(open) CloseHandle((HANDLE)portHandle);
|
|
open = false;
|
|
}
|
|
|
|
void COMPort::getState () const {
|
|
if (!GetCommState ( (HANDLE)portHandle, (LPDCB)dcb ) ) {
|
|
}
|
|
}
|
|
|
|
COMPort& COMPort::setState () {
|
|
if (!SetCommState ( (HANDLE)portHandle, (LPDCB)dcb ) ) {
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
COMPort& COMPort::setBitRate ( unsigned long Param ) {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
aDCB.BaudRate = Param;
|
|
return setState();
|
|
}
|
|
|
|
unsigned long COMPort::bitRate() const {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
return aDCB.BaudRate;
|
|
}
|
|
|
|
COMPort& COMPort::setLineCharacteristics( char * inConfig ) {
|
|
COMMTIMEOUTS aTimeout;
|
|
if ( !BuildCommDCBAndTimeouts ( inConfig, (LPDCB)dcb, &aTimeout ) ) {
|
|
}
|
|
if ( ! SetCommTimeouts ( (HANDLE(portHandle)), &aTimeout ) ) {
|
|
}
|
|
return setState();
|
|
}
|
|
|
|
char COMPort::read () {
|
|
char buffer;
|
|
DWORD charsRead = 0;
|
|
|
|
ReadFile ((HANDLE(portHandle)), &buffer, sizeof(char), &charsRead, NULL);
|
|
return buffer;
|
|
}
|
|
|
|
unsigned long COMPort::readString ( void *inBuffer, const unsigned long inCharsReq) {
|
|
DWORD charsRead = 0;
|
|
|
|
ReadFile ((HANDLE(portHandle)), inBuffer, inCharsReq, &charsRead, NULL);
|
|
return charsRead;
|
|
}
|
|
|
|
COMPort & COMPort::write ( const char inChar ) {
|
|
char buffer = inChar;
|
|
DWORD charsWritten = 0;
|
|
|
|
if ( !WriteFile ( (HANDLE(portHandle)), &buffer, sizeof(char), &charsWritten, NULL) ) {
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
unsigned long COMPort::writeString ( const void *inBuffer, const unsigned long inBufSize ) {
|
|
|
|
DWORD charsWritten = 0;
|
|
|
|
if ( !WriteFile ( (HANDLE(portHandle)), inBuffer, inBufSize, &charsWritten, NULL ) ) {
|
|
}
|
|
|
|
return charsWritten;
|
|
}
|
|
|
|
COMPort& COMPort::setxONxOFF ( bool Param ) {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
aDCB.fOutX = Param ? 1 : 0;
|
|
aDCB.fInX = Param ? 1 : 0;
|
|
return setState();
|
|
}
|
|
|
|
bool COMPort::isxONxOFF () const {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
return (aDCB.fOutX && aDCB.fInX);
|
|
}
|
|
|
|
COMPort& COMPort::setBlockingMode ( unsigned long inReadInterval, unsigned long inReadMultiplyer, unsigned long inReadConstant ) {
|
|
COMMTIMEOUTS commTimeout;
|
|
|
|
if ( !GetCommTimeouts ( (HANDLE(portHandle)), &commTimeout ) ) {
|
|
}
|
|
commTimeout.ReadIntervalTimeout = inReadInterval;
|
|
if ( inReadInterval==MAXDWORD ) {
|
|
commTimeout.ReadTotalTimeoutMultiplier = 0;
|
|
commTimeout.ReadTotalTimeoutConstant = 0;
|
|
}
|
|
else {
|
|
commTimeout.ReadTotalTimeoutMultiplier = inReadMultiplyer;
|
|
commTimeout.ReadTotalTimeoutConstant = inReadConstant;
|
|
}
|
|
if ( !SetCommTimeouts ( (HANDLE(portHandle)), &commTimeout) ) {
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
COMPort & COMPort::setHandshaking ( bool inHandshaking ) {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
|
|
if (inHandshaking) {
|
|
aDCB.fOutxCtsFlow = TRUE;
|
|
aDCB.fOutxDsrFlow = FALSE;
|
|
aDCB.fRtsControl = RTS_CONTROL_HANDSHAKE;
|
|
}
|
|
else {
|
|
aDCB.fOutxCtsFlow = FALSE;
|
|
aDCB.fOutxDsrFlow = FALSE;
|
|
aDCB.fRtsControl = RTS_CONTROL_ENABLE;
|
|
}
|
|
return setState();
|
|
}
|
|
|
|
unsigned long COMPort::getMaximumBitRate() const {
|
|
COMMPROP aProp;
|
|
if ( !GetCommProperties ( (HANDLE)portHandle, &aProp ) ) {
|
|
}
|
|
return aProp.dwMaxBaud;
|
|
}
|
|
|
|
COMPort::MSPack COMPort::getModemSignals() const {
|
|
MSPack aPack;
|
|
|
|
if ( !GetCommModemStatus ( (HANDLE)portHandle, (LPDWORD)&aPack ) ) {
|
|
}
|
|
return aPack;
|
|
}
|
|
|
|
COMPort& COMPort::setParity ( Parity Param ) {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
aDCB.Parity = Param;
|
|
|
|
return setState();
|
|
}
|
|
|
|
COMPort& COMPort::setDataBits ( DataBits Param ) {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
aDCB.ByteSize = Param;
|
|
|
|
return setState();
|
|
}
|
|
|
|
COMPort& COMPort::setStopBits ( StopBits Param ) {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
aDCB.StopBits = Param;
|
|
|
|
return setState();
|
|
}
|
|
|
|
COMPort::Parity COMPort::parity () const {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
|
|
return (COMPort::Parity)aDCB.Parity;
|
|
}
|
|
|
|
COMPort::DataBits COMPort::dataBits () const {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
|
|
return (COMPort::DataBits)aDCB.ByteSize;
|
|
}
|
|
|
|
COMPort::StopBits COMPort::stopBits () const {
|
|
DCB & aDCB = *((LPDCB)dcb);
|
|
|
|
return (COMPort::StopBits)aDCB.StopBits;
|
|
}
|
|
|
|
COMPort::errorStatus COMPort::clearError() const {
|
|
errorStatus eS;
|
|
BOOL fOOP, fOVERRUN, fPTO, fRXOVER, fRXPARITY, fTXFULL;
|
|
BOOL fBREAK, fDNS, fFRAME, fIOE, fMODE;
|
|
|
|
// Get and clear current errors on the port.
|
|
if (!ClearCommError((HANDLE(portHandle)), &eS.dwErrors, &eS.comStat)) {
|
|
}
|
|
return eS;
|
|
}
|
|
|
|
bool COMPort::Setup(DWORD dwInQueue, DWORD dwOutQueue) {
|
|
return SetupComm((HANDLE(portHandle)), dwInQueue, dwOutQueue);
|
|
}
|
|
|
|
bool COMPort::Purge(DWORD dwFlags) {
|
|
return PurgeComm((HANDLE(portHandle)), dwFlags);
|
|
}
|
|
|
|
bool COMPort::ClearWriteBuffer() {
|
|
return Purge(PURGE_TXCLEAR);
|
|
}
|
|
|
|
bool COMPort::ClearReadBuffer() {
|
|
return Purge(PURGE_RXCLEAR);
|
|
}
|
|
|
|
bool COMPort::Flush() {
|
|
return FlushFileBuffers((HANDLE(portHandle)));
|
|
}
|