Window API读取串口

来源:互联网 发布:数据挖掘原理 david 编辑:程序博客网 时间:2024/06/10 13:45

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

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 copychar 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);
原创粉丝点击