3,245
社区成员
发帖
与我相关
我的任务
分享
//打开串口 缺省 baud_rate, n, 8, 1
bool CSerialPort::Open(DWORD dwPort, DWORD dwBaudRate, int ByteSize/* = 8*/, int StopBits/* = 1*/)
{
// [fush]: must refresh parameter
printf("READY to open com, port: %d, BaudRate: %d...\r\n", dwPort, dwBaudRate);
_dwPort = dwPort;
_DCB.BaudRate = dwBaudRate;
_DCB.ByteSize = ByteSize;
_DCB.StopBits = StopBits;
if(dwPort < 1 || dwPort > 1024)
return false;
BindCommPort(dwPort);
if(!OpenCommPort())
return false;
if(!SetupPort())
return false;
printf("Open com, port: %d, BaudRate: %d SUCCESS!\r\n", dwPort, dwBaudRate);
return SetState(dwBaudRate);
}
//绑定串口
void CSerialPort::BindCommPort(DWORD dwPort)
{
assert(dwPort >= 1 && dwPort <= 1024);
char p[5];
_dwPort = dwPort;
strcpy(_szCommStr, "\\\\.\\COM");
ltoa(_dwPort, p, 10);
strcat(_szCommStr, p);
}
//打开串口
bool CSerialPort::OpenCommPort()
{
if(IsOpen())
Close();
_hCommHandle = ::CreateFile(
_szCommStr,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | _dwIOMode,
NULL
);
if(_fAutoBeginThread)
{
if(IsOpen() && BeginThread())
return true;
else
{
Close();
//创建线程失败
return false;
}
}
return IsOpen();
}
//设置串口
bool CSerialPort::SetupPort()
{
if(!IsOpen())
return false;
if(!::SetupComm(_hCommHandle, 4096, 4096))
return false;
if(!::GetCommTimeouts(_hCommHandle, &_CO))
return false;
_CO.ReadIntervalTimeout = 0;
_CO.ReadTotalTimeoutMultiplier = 1;
_CO.ReadTotalTimeoutConstant = 1000;
_CO.WriteTotalTimeoutMultiplier = 1;
_CO.WriteTotalTimeoutConstant = 1000;
if(!::SetCommTimeouts(_hCommHandle, &_CO))
return false;
if(!::PurgeComm(_hCommHandle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ))
return false;
return true;
}
//设置串口参数:波特率,停止位,等
bool CSerialPort::SetState(DWORD dwBaudRate, DWORD dwByteSize/* = 8*/, DWORD dwParity/* = NOPARITY*/, DWORD dwStopBits /*= ONESTOPBIT*/)
{
if(IsOpen())
{
if(::GetCommState(_hCommHandle, &_DCB) != TRUE)
return false;
_DCB.BaudRate = dwBaudRate;
_DCB.ByteSize = (unsigned char)dwByteSize;
_DCB.Parity = (unsigned char)dwParity;
_DCB.StopBits = (unsigned char)dwStopBits;
return ::SetCommState(_hCommHandle, &_DCB) == TRUE;
}
return false;
}