本文只是写出最基本的步骤,可能有些变量没有列出
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);