Window API读取串口

本文提供了一个串口通信的基本流程,包括使用Windows API进行串口的打开、配置、读写及关闭操作。通过示例代码详细介绍了如何利用C++实现串口通信,并提供了错误处理的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文只是写出最基本的步骤,可能有些变量没有列出

1. 包含windows.h头文件

#include <windows.h>

**2. 打开串口 **

portnum = "\\\\.\\" + portnum;      //Port避免超过10打不开
HANDLE hCom;

hCom = CreateFile((LPCWSTR)portnum.data(),
                 GENERIC_READ | GENERIC_WRITE,
                 0,
                 NULL,
                 OPEN_EXISTING,
                 0,
                 NULL);
            if(hCom == INVALID_HANDLE_VALUE)
            {
                com_opened = false;
                WeightLog("lyh -> Open com fail: " + portnum);
            }

3.设置串口

	/* 设置串口相关 */
	DWORD dwEroor = 0;
	COMSTAT cs;
	memset(&cs, 0, sizeof(COMSTAT));
	DCB dcb;
	memset(&dcb, 0, sizeof(DCB));

	if(!GetCommState(hCom, &dcb))
	{
		com_opened = false;
		WeightLog("lyh -> Get GuadPort State fail");
	}
        else
	{
		dcb.DCBlength = sizeof(DCB);
		dcb.BaudRate = 9600;
		dcb.ByteSize = 8;
		dcb.Parity = NOPARITY;
		dcb.StopBits = ONESTOPBIT;
		if(!SetCommState(hCom, &dcb))
		{
			com_opened = false;
			WeightLog(" Set GuardPort fail ");
		}
		/* 设置端口缓存 */
		SetupComm(hCom, 2048, 2048);
		/* 清理端口信息 */
		PurgeComm(hCom, PURGE_RXCLEAR); //清除串口缓存,准备读取串口数据
	}

4 读写串口

/* a.读串口数据 */
[cpp] view plain copy
char rBuf[100] = {0}; //存放串口数据  
DWORD dwSizeReaded = 0;  
  
if(ReadFile(hCom, rBuf, 20, &dwSizeReaded, NULL))  
{  
    receiveData = QByteArray((char *)rBuf); //数据放到rBuf里面,把它转成QByteArray,如果你不是QT,可以不用转  
      
    /*  处理读取数据 */  
    if(receiveData != "")  
    {  
        if(receiveData.startsWith("ST") || receiveData.startsWith("UT"))  
        {  
            ConvertToNumber();  
        }  
        else  
        {  
            /* 清理端口信息 */  
            PurgeComm(hCom, PURGE_RXCLEAR); //如果读到的数据有问题,清除串口数据  
        }  
    }  
    else  
    {  
        WeightLog("lyh -> ReadData=NULL!");  
    }  
}  
else  
{  
    /* 清除错误 */  
    dwEroor = 0;  
    memset(&cs, 0, sizeof(COMSTAT));  
    ClearCommError(hCom, &dwEroor, &cs)  //如果读串口失败,需要清除串口错误,才能继续读  
  
}  

/* b.写串口数据*/
DWORD dwEroor = 0;  
COMSTAT cs;  
memset(&cs, 0, sizeof(COMSTAT));  
  
/* a.清理发送区缓存 */  
PurgeComm(hCom, PURGE_TXCLEAR);  
/* b.向端口发送数据 */  
DWORD dwByteWritten = 0;  
if(WriteFile(hCom, \  
             (unsigned char *)TxData.data(), \  
             (DWORD)strlen(TxData.data()), \  
             &dwByteWritten, \  
             NULL))  
{  
    WeightLog("Clear Weight: " + message);  
}  
else  
{  
    ClearCommError(hCom, &dwEroor, &cs) //写串口失败,清除串口错误  
}

**5.关闭串口 **

CloseHandle(hCom);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值