windows C++ 串口通信基本代码

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);

猜你喜欢

转载自blog.csdn.net/sz76211822/article/details/80742253