当前位置:首页 > 行业动态 > 正文

c 串口通信实例视频

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] = '
0