📄 serialport.cpp
字号:
// SerialPort.cpp: implementation of the CSerialPort class.
//
////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SerialPort.h"
CSerialPort::CSerialPort()
{
m_hComm = NULL;
m_hIOEvent = CreateEvent(NULL, false, false, NULL);
}
CSerialPort::~CSerialPort()
{
CloseHandle(m_hIOEvent);
ClosePort();
}
BOOL CSerialPort::OpenPort(TCHAR* strPortName)
/*
指定异步IO方式打开串口
*/
{
m_hComm = CreateFile(strPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING,
FILE_FLAG_OVERLAPPED, 0);
if(m_hComm == INVALID_HANDLE_VALUE)
{
MessageBox(NULL, _T("Cannot open Communication Port.Please\nQuit the program and Re-start your PC."),
_T("Com Port Error"), MB_OK | MB_ICONERROR);
return false;
}
return true;
}
BOOL CSerialPort::ConfigurePort(DWORD BaudRate, BYTE ByteSize, BOOL bParity,
BYTE ParityMode, BYTE StopBits, int in_buffer, int out_buffer)
{
if(!::GetCommState(m_hComm, &m_dcb))
{
MessageBox(NULL, _T("GetCommState Error"), _T("Error"), MB_OK + MB_ICONERROR);
ClosePort();
return false;
}
m_dcb.BaudRate = BaudRate;
m_dcb.ByteSize = ByteSize;
m_dcb.Parity = ParityMode;
m_dcb.StopBits = StopBits;
m_dcb.fParity = bParity;
//m_dcb.fBinary = 1;
//m_dcb.XoffLim = 0;
//m_dcb.XonLim = 0;
//m_dcb.fDtrControl = DTR_CONTROL_ENABLE;
//m_dcb.fRtsControl = RTS_CONTROL_ENABLE;
if(!::SetCommState(m_hComm, &m_dcb))
{
MessageBox(NULL, _T("SetCommState Error"), _T("Error"), MB_OK|MB_ICONERROR);
ClosePort();
return false;
}
::SetupComm(m_hComm, in_buffer, out_buffer);
return true;
}
BOOL CSerialPort::SetCommunicationTimeouts(DWORD ReadIntervalTimeout, DWORD ReadTotalTimeoutMultiplier,
DWORD ReadTotalTimeoutConstant,
DWORD WriteTotalTimeoutMultiplier,
DWORD WriteTotalTimeoutConstant)
/*
设置的Timeouts参数,默认值如下:
//
// 对于读操作,使用以下的值,可以在缓冲区有数据时立即返回,
// 无数据时等待ReadTotalTimeoutConstant时间。
//
DWORD ReadIntervalTimeout = 0xffffffff,
DWORD ReadTotalTimeoutMultiplier = 0xffffffff,
DWORD ReadTotalTimeoutConstant = 1000,
//
// 考虑发送短信的情况每次发送的字节数有限,参考设备的波特率为
// 9600, 设置以下超时参数.
//
DWORD WriteTotalTimeoutMultiplier = 0,
DWORD WriteTotalTimeoutConstant = 1000
*/
{
if(!::GetCommTimeouts(m_hComm, &m_CommTimeouts))
return false;
m_CommTimeouts.ReadIntervalTimeout = ReadIntervalTimeout;
m_CommTimeouts.ReadTotalTimeoutConstant = ReadTotalTimeoutConstant;
m_CommTimeouts.ReadTotalTimeoutMultiplier = ReadTotalTimeoutMultiplier;
m_CommTimeouts.WriteTotalTimeoutConstant = WriteTotalTimeoutConstant;
m_CommTimeouts.WriteTotalTimeoutMultiplier = WriteTotalTimeoutMultiplier;
if(!::SetCommTimeouts(m_hComm, &m_CommTimeouts))
{
MessageBox(NULL, _T("StCommTimeouts function failed"), _T("Com Port Error") , MB_OK + MB_ICONERROR);
ClosePort();
return false;
}
return true;
}
BOOL CSerialPort::SelectEvents(DWORD dwEvents)
{
return ::SetCommMask(m_hComm, dwEvents);
}
int CSerialPort::WaitEvents(DWORD* pdwEvents, OVERLAPPED *pov)
{
if(::WaitCommEvent(m_hComm, pdwEvents, pov) == 0)
{
if(GetLastError() != ERROR_IO_PENDING)
return -1;
}
return 0;
}
void CSerialPort::ClosePort()
{
if(m_hComm != NULL)
CloseHandle(m_hComm);
m_hComm = NULL;
}
/////////////////////////////////////////////////////////////////////////
int CSerialPort::WriteBytes(PBYTE pSent, int nLength)
{
DWORD dwWriten;
OVERLAPPED ov = { 0 };
ov.hEvent = m_hIOEvent;
if(WriteFile(m_hComm, pSent, nLength, &dwWriten, &ov) == false)
{
if(GetLastError() != ERROR_IO_PENDING)
{
printf("write error: %d\n", GetLastError());
return -1;
}
if(GetOverlappedResult(m_hComm, &ov, &dwWriten, true) == 0)
{
printf("GetOverlappedResult error: %d\n", GetLastError());
return -1;
}
}
return dwWriten;
}
int CSerialPort::ReadBytes(PBYTE pResp, int nLength)
{
DWORD dwRead = 0;
int read = 0;
OVERLAPPED ov = { 0 };
ov.hEvent = m_hIOEvent;
while(read < nLength)
{
if(ReadFile(m_hComm, pResp, nLength - read, &dwRead, &ov) == false)
{
if(GetLastError() != ERROR_IO_PENDING)
{
printf("read error: %d\n", GetLastError());
return -1;
}
if(GetOverlappedResult(m_hComm, &ov, &dwRead, true) == 0)
{
printf("GetOverlappedResult error: %d\n", GetLastError());
return -1;
}
if(dwRead == 0)
return read;
}
read += dwRead;
}
pResp[nLength] = 0;
return nLength;
}
int CSerialPort::ReadLine(PBYTE pLine, int nBufferLen)
{
int read, ret;
read = 0;
ret = ReadBytes(pLine + read, 1);
while(read < nBufferLen && ret > 0)
{
if(read >= 1 && pLine[read - 1] == '\r' && pLine[read] == '\n')
{
pLine[read + 1] = 0;
return read + 1;
}
read++;
ret = ReadBytes(pLine + read, 1);
}
return -1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -