c 串口通信实例视频
- 行业动态
- 2025-02-24
- 2
C语言串口通信实例视频可助你掌握相关开发技巧。
在C语言中实现串口通信是一项基础但至关重要的技能,尤其在嵌入式系统和工业自动化领域,以下是一个详细的实例,展示如何在Windows环境下使用C语言进行串口通信,包括初始化、数据发送与接收等关键步骤。
一、串口通信基础
串口通信
串口通信是一种点对点的通信方式,常用于低速数据传输,RS-232是最常见的串口标准,定义了电气特性、连接器和信号线,UART(通用异步收发传输器)是实现串口通信的硬件模块。
串口参数
波特率:每秒传输的位数,常见波特率有9600、19200、38400、57600、115200等。
数据位:每个字符的位数,常见值为5、6、7、8位。
停止位:每个字符传输结束时的空闲位数,常见值为1、1.5、2位。
校验位:用于检测传输错误,常见校验方式有无校验(None)、奇校验(Odd)、偶校验(Even)、标记校验(Mark)和空间校验(Space)。
流控制:用于管理数据流,防止发送设备的速度超过接收设备的处理能力,常见流控制方式有硬件流控制(RTS/CTS)和软件流控制(XON/XOFF)。
二、Windows下的串口编程
打开串口
使用CreateFile
函数打开串口设备。
HANDLE hSerial = CreateFile( "COM3", // 串口号 GENERIC_READ | GENERIC_WRITE, // 访问模式 0, // 共享模式 NULL, // 安全属性 OPEN_EXISTING, // 创建类型 FILE_ATTRIBUTE_NORMAL, // 属性 NULL // 模板文件 ); if (hSerial == INVALID_HANDLE_VALUE) { printf("无法打开串口 "); return 1; }
配置串口
使用DCB
结构体配置串口参数。
DCB dcbSerialParams = {0}; dcbSerialParams.DCBlength = sizeof(dcbSerialParams); if (!GetCommState(hSerial, &dcbSerialParams)) { printf("获取串口状态失败 "); CloseHandle(hSerial); return 1; } dcbSerialParams.BaudRate = CBR_9600; // 波特率 dcbSerialParams.ByteSize = 8; // 数据位 dcbSerialParams.StopBits = ONESTOPBIT; // 停止位 dcbSerialParams.Parity = NOPARITY; // 无校验位 if (!SetCommState(hSerial, &dcbSerialParams)) { printf("设置串口状态失败 "); CloseHandle(hSerial); return 1; }
配置超时
使用COMMTIMEOUTS
结构体配置读取和写入超时。
COMMTIMEOUTS timeouts = {0}; timeouts.ReadIntervalTimeout = 50; // 读取间隔超时 timeouts.ReadTotalTimeoutConstant = 50; // 总读取超时 timeouts.ReadTotalTimeoutMultiplier = 10; // 读取超时乘数 timeouts.WriteTotalTimeoutConstant = 50; // 总写入超时 timeouts.WriteTotalTimeoutMultiplier = 10; // 写入超时乘数 if (!SetCommTimeouts(hSerial, &timeouts)) { printf("设置超时失败 "); CloseHandle(hSerial); return 1; }
读取数据
使用ReadFile
函数从串口读取数据。
char buffer[256]; DWORD bytesRead; while (1) { if (ReadFile(hSerial, buffer, sizeof(buffer) 1, &bytesRead, NULL)) { if (bytesRead > 0) { buffer[bytesRead] = '