16,471
社区成员
发帖
与我相关
我的任务
分享
bool OperatorComPort::WriteCom(unsigned char *str, int len)
{
DWORD dwNumWrite = 0;
if (NULL == m_hComm)
{
return FALSE;
}
if (WriteFile(m_hComm, str, (DWORD)len, &dwNumWrite, &m_osWrite))
{
return TRUE;
}
if (GetLastError() != ERROR_IO_PENDING)
{
return FALSE;
}
GetOverlappedResult(m_hComm, &m_osWrite, &dwNumWrite, TRUE);
if ((DWORD)len != dwNumWrite)
{
return FALSE;
}
return ((DWORD)len == dwNumWrite);
}
bool OperatorComPort::InitComport(int pPort)
{
DCB dcb; // 串口控制块
COMMTIMEOUTS timeouts;
//设置读超时
timeouts.ReadIntervalTimeout = 100;
timeouts.ReadTotalTimeoutMultiplier = 500; //500;
timeouts.ReadTotalTimeoutConstant = 2000;//2000;
//设置写超时
timeouts.WriteTotalTimeoutMultiplier = 500;
timeouts.WriteTotalTimeoutConstant = 2000;
wchar_t *szPort = new wchar_t[50];
swprintf(szPort, L"COM%d", pPort);
m_hComm = CreateFile(szPort, // 串口名称或设备路径
GENERIC_READ | GENERIC_WRITE, // 读写方式
0, // 共享方式:独占
NULL, // 默认的安全描述符
OPEN_EXISTING, // 创建方式
FILE_FLAG_OVERLAPPED,//异步操作
NULL); // 不需参照模板文件
if (m_hComm == INVALID_HANDLE_VALUE) // 打开串口失败
{
delete [] szPort;
//_snprintf(m_szErrorInfo, MAX_ERR_BUFF_LEN, "open %s error, not exist or already in use", pPort);
return FALSE;
}
if (0 == GetCommState(m_hComm, &dcb)) // 取DCB
{
delete [] szPort;
//_snprintf(m_szErrorInfo, MAX_ERR_BUFF_LEN, "open %s error, GetCommState failed!", pPort);
CloseCom();
return FALSE;
}
dcb.BaudRate = CBR_38400;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
if (0 == SetCommState(m_hComm, &dcb)) // 设置DCB
{
delete [] szPort;
//_snprintf(m_szErrorInfo, MAX_ERR_BUFF_LEN, "open %s error, SetCommState failed! ErrorNo: %d", pPort, GetLastError());
CloseCom();
return FALSE;
}
if (0 == SetupComm(m_hComm, 1024, 1024)) // 设置输入输出缓冲区大小
{
delete [] szPort;
//_snprintf(m_szErrorInfo, MAX_ERR_BUFF_LEN, "open %s error, SetupComm failed! ErrorNo: %d", pPort, GetLastError());
CloseCom();
return FALSE;
}
//PurgeComm(m_hCom, PURGE_TXCLEAR | PURGE_RXCLEAR);
if (0 == SetCommTimeouts(m_hComm, &timeouts)) // 设置超时
{
delete [] szPort;
//_snprintf(m_szErrorInfo, MAX_ERR_BUFF_LEN, "open %s error, SetCommTimeouts failed! ErrorNo: %d", pPort, GetLastError());
CloseCom();
return FALSE;
}
PurgeComm(m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
delete [] szPort;
m_connectype = COM;
return TRUE;
}
COMMTIMEOUTS CommTimeOuts;// 定义超时参数
//GetCommTimeouts(m_hComm, &CommTimeOuts);
CommTimeOuts.ReadIntervalTimeout = MAXDWORD; // 接收字符间最大时间间隔
CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
CommTimeOuts.ReadTotalTimeoutConstant = 0; // 读数据总超时常量
CommTimeOuts.WriteTotalTimeoutMultiplier = 50;
CommTimeOuts.WriteTotalTimeoutConstant = 100;