版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sz76211822/article/details/80742253
HANDLE hCom = CreateFile(L"\\\\.\\COM4", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hCom == INVALID_HANDLE_VALUE){
DWORD dwErr = GetLastError();
char cData[2048] = {0};
sprintf(cData, "打开串口失败:%d", dwErr);
OutPut(NORMAL_LOG, cData);
return false;
}
//设置读超时
COMMTIMEOUTS timeouts;
GetCommTimeouts(hCom, &timeouts);
timeouts.ReadIntervalTimeout = 0;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 60000;
timeouts.WriteTotalTimeoutMultiplier = 0;
timeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(hCom, &timeouts);
//设置读写缓冲区大小
static const int g_nZhenMax = 32768;
if (!SetupComm(hCom, g_nZhenMax, g_nZhenMax)){
DWORD dwErr = GetLastError();
char cData[2048] = { 0 };
sprintf(cData, "设置读写缓冲区大小失败:%d", dwErr);
OutPut(NORMAL_LOG, cData);
CloseHandle(hCom);
return false;
}
//设置串口配置信息
DCB dcb;
if (!GetCommState(hCom, &dcb)){
DWORD dwErr = GetLastError();
char cData[2048] = { 0 };
sprintf(cData, "设置串口配置信息失败:%d", dwErr);
OutPut(NORMAL_LOG, cData);
CloseHandle(hCom);
return false;
}
dcb.DCBlength = sizeof(DCB);
dcb.BaudRate = 9600;//波特率为9600
dcb.Parity = 0;//校验方式为无校验
dcb.ByteSize = 8;//数据位为8位
dcb.StopBits = ONESTOPBIT;//停止位为1位
if (!SetCommState(hCom, &dcb)){
DWORD dwErr = GetLastError();
char cData[2048] = { 0 };
sprintf(cData, "设置串口配置信息失败:%d", dwErr);
OutPut(NORMAL_LOG, cData);
CloseHandle(hCom);
return false;
}
//清空缓冲
PurgeComm(hCom, PURGE_RXCLEAR | PURGE_TXCLEAR);
//清除错误
DWORD dwError;
COMSTAT cs;
if (!ClearCommError(hCom, &dwError, &cs)){
CloseHandle(hCom);
return false;
}
//设置串口监听事件
SetCommMask(hCom, EV_RXCHAR);
DWORD dwWrite = 0;
unsigned char btCMD_OpenDoor[4] = { 0xa0, 0x01, 0x01, 0xa2 };
unsigned char btCMD_CloseDoor[4] = { 0xa0, 0x01, 0x00, 0xa1 };
while (true){
if (WaitForSingleObject(pMain->m_hCLOSE_ALL_THREAD, 10) == WAIT_OBJECT_0){
break;
}
WriteFile(hCom, btCMD_OpenDoor, 4, &dwWrite, NULL);
Sleep(1000);
WriteFile(hCom, btCMD_CloseDoor, 4, &dwWrite, NULL);
}
WriteFile(hCom, btCMD_CloseDoor, 4, &dwWrite, NULL);
CloseHandle(hCom);