Window API读取串口

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

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

猜你喜欢

转载自blog.csdn.net/sea_snow/article/details/76209756