基本概念
串口通信是嵌入式、物联网、工业控制领域的基石技术,其本质是通过操作系统 API 直接操作 UART 硬件接口完成二进制/文本协议传输。Windows 系统通过 文件化抽象 实现串口控制。
核心流程:打开串口–>配置串口参数–>数据收发–>关闭串口
使用示例
1)端口初始化
HANDLE hSerial = CreateFile(
L"COM3", // 串口号 (Unicode 宽字符 L)
GENERIC_READ | GENERIC_WRITE, // 访问权限(位运算组合)
0, // 独占模式(禁止其他进程访问)
NULL, // 默认安全属性
OPEN_EXISTING, // 创建方式:打开已存在的设备
FILE_ATTRIBUTE_NORMAL, // 文件属性:普通文件(无特殊属性)
NULL // 无模板文件
);
- 返回的
HANDLE
需全局管理 :避免重复打开。- 校验返回值 :检查
hSerial
是否等于INVALID_HANDLE_VALUE
,以确定串口打开是否失败。
2)协议配置:DCB 结构体与流控制
DCB dcb = { 0 }; // 必须初始化归零
dcb.DCBlength = sizeof(dcb); // 结构体大小(API 依赖此字段)
GetCommState(hSerial, &dcb);
// 优先使用字符串配置(结构化语法)
std::wostringstream oss; // 宽字符流 W
// 波特率、校验位、数据位、停止位、timeout、DTR、RTS
oss << L"baud=9600 parity=N data=8 stop=1 to=off dtr=off rts=on";
BuildCommDCBW(oss.str().c_str(), &dcb) // 使用宽字符版本 W
// 手动覆盖流控制策略
dcb.fDtrControl = DTR_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_ENABLE;
SetCommState(hSerial, &dcb) // 应用配置
- 严格遵循
BuildCommDCBW
的字符串语法 :确保格式为key=value
。- 校验关键函数返回值 :检查
BuildCommDCBW
和SetCommState
是否成功。
3)数据收发
发送数据
char data[] = "AT\r\n"; //\r\n 回车+换行
DWORD bytesWritten; // 发送的字节数
WriteFile(hSerial, data, strlen(data), &bytesWritten, NULL);
接收数据
char buffer[256];
DWORD bytesRead; // 接收的字节数
ReadFile(hSerial, buffer, sizeof(buffer) - 1, &bytesRead, NULL); // sizeof(buffer) - 1 保留终止符空间
if(bytesRead > 0) {
buffer[bytesRead] = '\0'; // 添加终止符(文本协议)
//...
}
ReadFile/WriteFile
可以校验返回值 + 实际读写字节数- 超时策略需根据场景选择
4)关闭端口
CloseHandle(hSerial);
总结
- 打开串口 :
CreateFile
- 获取配置 :
GetCommState
- 设置参数 :
SetCommState
- 数据发送 :
WriteFile
- 数据接收 :
ReadFile
- 关闭端口 :
CloseHandle