1、包含头文件:
#include <iostream>
#include <Windows.h>
2、打开配置串口:
HANDLE Serial;//串口句柄
DCB dcbSerialParams = { 0 };
COMMTIMEOUTS timeouts = { 0 };
// 打开串口
Serial = CreateFileA("COM1",//需要打开的号
GENERIC_READ | GENERIC_WRITE,//读写访问 允许读和写
0,//独占方式
NULL,// 默认安全属性
OPEN_EXISTING, //打开而不是创建
0,//同步方式
NULL// 不使用模板文件);
if (Serial == INVALID_HANDLE_VALUE) {
std::cerr << "打开串口" << "COM1" << "出错!" << std::endl;
}
// 配置串口参数
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(Serial, &dcbSerialParams)) {
std::cerr << "获取当前串口" << "COM1" << "状态出错!" << std::endl;
CloseHandle(Serial);
}
// 这里可以根据需要设置串口参数,如波特率、数据位、停止位等
dcbSerialParams.BaudRate = 9600;//波特率,常见 19200 57600 115200
dcbSerialParams.ByteSize = 8;//数据位
dcbSerialParams.StopBits = ONESTOPBIT;//停止位 两位停止位TWOSTOPBITS
dcbSerialParams.Parity = NOPARITY;//校验位 偶校验EVENPARITY 奇校验ODDPARITY
if (!SetCommState(Serial, &dcbSerialParams)) {
std::cerr << "设置当前串口" << "COM1" << "状态出错!" << std::endl;
CloseHandle(Serial);
}
// 设置超时
timeouts.ReadIntervalTimeout = 5; //读间隔超时
timeouts.ReadTotalTimeoutConstant = 5;//读总超时常量
timeouts.ReadTotalTimeoutMultiplier = 1;//读总超时乘数
timeouts.WriteTotalTimeoutConstant = 50;//写总超时常量
timeouts.WriteTotalTimeoutMultiplier = 10; //写总超时乘数
if (!SetCommTimeouts(Serial, &timeouts)) {
std::cerr << "设置当前串口" << "COM1" << "超时出错!" << std::endl;
CloseHandle(Serial);
}
cout << "打开耳标串口完毕" << endl;
3、读串口:
uint16_t Read_Data_Length = 42;//读取字节长度
unsigned char readBuffer[256] = { 0 };//读取缓存区
COMSTAT ComStat;//串口状态
DWORD dwErrorFlags;//错误标志
DWORD bytesRead = Read_Data_Length;//读取字节长度
ClearCommError(Serial, &dwErrorFlags, &ComStat);
PurgeComm(Serial, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);//清空缓存区
if (!ReadFile(Serial, readBuffer, sizeof(readBuffer), &bytesRead, NULL)) {
std::cerr << "从串口读取数据错误!" << GetLastError() << std::endl;
}
//输出为unsigned char类型readBuffer变量
4、写串口:
unsigned char sendhex;//写入数据
COMSTAT ComStat;//串口状态
DWORD dwErrorFlags;//错误标志
BOOL bWriteStat;//写入状态
DWORD dwBytesWrite = 20;//写字节长度
ClearCommError(Serial, &dwErrorFlags, &ComStat);
PurgeComm(Serial, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);//清空缓存区
bWriteStat = WriteFile(Serial, sendHex, dwBytesWrite, &dwBytesWrite, NULL);
if (!bWriteStat) { cout << " 天线写开始指令串口失败! " << endl; }
//输入为unsigned char类型sendHex变量
5、关闭串口:
//关闭串口
CloseHandle(Serial);