2,640
社区成员
发帖
与我相关
我的任务
分享
//Myserial.h
class CMySerial
{
public:
void Port_Close();
bool Port_Init();
CMySerial();
virtual ~CMySerial();
HANDLE CommHandle;
COMMPROP CommProps;
COMMTIMEOUTS commTimeOuts;
DCB CommDcb;
int m_nBaudRate;
int m_nPort;
bool m_bOpen;
char m_sLastError[128];
}
//Myserial.cpp
CMySerial::CMySerial()
{
this->m_bOpen = false;
}
CMySerial::~CMySerial()
{
}
bool CMySerial::Port_Init()
{
if (this->m_bOpen)
{
Port_Close();
}
CString port;
port.Format(_T("\\\\.\\COM%d"),this->m_nPort);
CommHandle = CreateFile(port,
GENERIC_READ | GENERIC_WRITE,
NULL, // don't share port
NULL, // SecurityAttributes - none in Win95
OPEN_EXISTING, // how to create
0, // file attributes
NULL // handle of file with attributes to copy
);
if (CommHandle != INVALID_HANDLE_VALUE)
{
CommProps.wPacketLength = sizeof(COMMPROP);
SetupComm (CommHandle,4096, 4096);
GetCommProperties (CommHandle, &CommProps);
GetCommState (CommHandle, &CommDcb);
this->CommDcb.DCBlength = sizeof(DCB);
CommDcb.BaudRate =this->m_nBaudRate;
CommDcb.ByteSize = 8;
CommDcb.fParity = FALSE;
CommDcb.StopBits = ONESTOPBIT;
CommDcb.fBinary = TRUE;
CommDcb.fOutxCtsFlow = FALSE;
CommDcb.fOutxDsrFlow = FALSE;
CommDcb.fDtrControl = DTR_CONTROL_ENABLE;
EscapeCommFunction(CommHandle, SETDTR);
CommDcb.fRtsControl = RTS_CONTROL_ENABLE;
EscapeCommFunction(CommHandle, SETRTS);
CommDcb.fDsrSensitivity = FALSE;
CommDcb.fTXContinueOnXoff = FALSE;
CommDcb.fOutX = FALSE;
CommDcb.fInX = FALSE;
CommDcb.fErrorChar = FALSE;
CommDcb.fNull = FALSE;
CommDcb.fAbortOnError = FALSE;
if (SetCommState (CommHandle, &CommDcb) == FALSE)
{
CloseHandle(CommHandle);
strcpy(this->m_sLastError,"Could not setup COMM port");
return false;
}
commTimeOuts.ReadIntervalTimeout = 0;
commTimeOuts.ReadTotalTimeoutMultiplier = 0;
commTimeOuts.ReadTotalTimeoutConstant = 500;//
commTimeOuts.WriteTotalTimeoutMultiplier = 0;
commTimeOuts.WriteTotalTimeoutConstant = 0;
if (SetCommTimeouts (CommHandle, &commTimeOuts) == FALSE)
{
strcpy(this->m_sLastError,"Could not set COMM timeouts");
return false;
}
PurgeComm (CommHandle, PURGE_TXCLEAR | PURGE_RXCLEAR);
}
else
{
strcpy(this->m_sLastError,"Open Comm Fail!");
return false;
}
m_bOpen = true;
return true;
}
void CMySerial::Port_Close()
{
if (this->m_bOpen==false)
return;
if (CommHandle != INVALID_HANDLE_VALUE)
{
CloseHandle(this->CommHandle);
CommHandle = INVALID_HANDLE_VALUE;
this->m_bOpen = false;
}
}