Вот кое что
| Код | //comport.h #ifndef ComPortH #define ComPortH
#include <Classes.hpp> #include<string>
using std::string;
class ModemComPort { public: ModemComPort(); ModemComPort(string CPName); ~ModemComPort(); int Open(); int Close(); int getEofCode(); int WriteString(string Str); string ReadString(); string WriteAndRead(string Input); int setComPortName(string CPName); string getComPortName(); private: bool Opened; HANDLE hPort; string ComPortName; };
#endif
|
| Код | // ComPort.cpp #include "ComPort.h"
string ModemComPort::WriteAndRead(string Input) { WriteString(Input); return ReadString(); }
ModemComPort::~ModemComPort() { Close(); }
int ModemComPort::WriteString(string Str) { PurgeComm(hPort,PURGE_TXCLEAR | PURGE_RXCLEAR); Str = Str + "\r"; DWORD dwError , dwNumBytesWritten; WriteFile( hPort, Str.c_str(), Str.length(), &dwNumBytesWritten, NULL); return (int)dwNumBytesWritten; }
string ModemComPort::ReadString() { string Out = ""; DWORD dwCommModemStatus , dwBytesTransferred; BYTE Byte; // SetCommMask(hPort , EV_RXCHAR); WaitCommEvent(hPort , &dwCommModemStatus , 0); if(dwCommModemStatus & EV_RXCHAR || dwCommModemStatus & EV_RXFLAG) { do { ReadFile(hPort , &Byte , 1 , &dwBytesTransferred , 0); if(dwBytesTransferred == 1) Out = Out + (char)Byte; } while(dwBytesTransferred == 1); } // óäàëÿåì ñíà÷àëà è ñ êîíöà \n int Start = 0 , End = 0; for(string::iterator i = Out.begin() ; i != Out.end() && (*i == '\n' || *i == '\r') ; ++ i , ++ Start); for(string::reverse_iterator i = Out.rbegin() ; i != Out.rend() && (*i == '\n' || *i == '\r') ; ++ i , ++ End); return Out.substr(Start , Out.length() - End - Start); }
ModemComPort::ModemComPort() { }
ModemComPort::ModemComPort(string CPName) : ComPortName(CPName) { }
string ModemComPort::getComPortName() { return ComPortName; }
int ModemComPort::setComPortName(string CPName) { ComPortName = CPName; return 1; }
int ModemComPort::Open() { hPort = CreateFile( ComPortName.c_str(), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL ); if(hPort == INVALID_HANDLE_VALUE) { return 0; } DCB PortDCB;
PortDCB.DCBlength = sizeof(DCB);
GetCommState(hPort , &PortDCB);
PortDCB.BaudRate = 9600; PortDCB.fBinary = true; //! PortDCB.fParity = true; PortDCB.fOutxCtsFlow = false; PortDCB.fOutxDsrFlow = false; PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
PortDCB.fDsrSensitivity = false; PortDCB.fTXContinueOnXoff = false; PortDCB.fOutX = false; PortDCB.fInX = false; PortDCB.fErrorChar = true; PortDCB.fNull = false; PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
PortDCB.fAbortOnError = false;
PortDCB.ByteSize = 8; PortDCB.Parity = NOPARITY; PortDCB.StopBits = ONESTOPBIT; // PortDCB.EofChar = '!';
if(!SetCommState(hPort , &PortDCB)) { return 0; // ShowMessage("Unable to configure the serial port"); }
COMMTIMEOUTS CommTimeouts;
GetCommTimeouts(hPort,&CommTimeouts);
CommTimeouts.ReadIntervalTimeout = 50; CommTimeouts.ReadTotalTimeoutMultiplier = 1; CommTimeouts.ReadTotalTimeoutConstant = 50; CommTimeouts.WriteTotalTimeoutMultiplier = 1; CommTimeouts.WriteTotalTimeoutConstant = 50;
SetCommTimeouts(hPort,&CommTimeouts); FlushFileBuffers(hPort); Opened = true; return 1; }
int ModemComPort::getEofCode() { DCB PortDCB;
PortDCB.DCBlength = sizeof(DCB);
GetCommState(hPort , &PortDCB); return PortDCB.EofChar; }
int ModemComPort::Close() { if(Opened) { CloseHandle(hPort); Opened = false; return 1; } else return 0; }
|
|