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

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);

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值