C语言实现串口通讯(windows端)

工作环境

usb转ttl串口线,usb插电脑端、另一端连接开发板或其他串口通讯设备

代码思路

1.打开串口
2.配置串口参数
3.发送函数
4.接收函数
5.主函数

1.打开串口

// 打开串口
HANDLE OpenSerialPort(const char *portName) {
    HANDLE hSerial = CreateFileA(portName, GENERIC_READ | GENERIC_WRITE,
                               0, NULL, OPEN_EXISTING, 0, NULL);
    if (hSerial == INVALID_HANDLE_VALUE) {
        printf("Error opening serial port: %d\n", GetLastError());
        return INVALID_HANDLE_VALUE;
    }
    return hSerial;
}

2.配置串口参数

// 配置串口参数
BOOL SetupSerialPort(HANDLE hSerial) {
    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength = sizeof(DCB);

    // 获取当前串口设置并修改
    if (!GetCommState(hSerial, &dcbSerialParams)) {
        printf("Error getting current serial port settings: %d\n", GetLastError());
        CloseHandle(hSerial);
        return FALSE;
    }

    // 设置波特率和其他参数
    dcbSerialParams.BaudRate = BAUD_RATE;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;

    if (!SetCommState(hSerial, &dcbSerialParams)) {
        printf("Error setting serial port parameters: %d\n", GetLastError());
        CloseHandle(hSerial);
        return FALSE;
    }

    // 设置超时参数
    COMMTIMEOUTS timeouts;
    timeouts.ReadIntervalTimeout = MAXDWORD;
    timeouts.ReadTotalTimeoutMultiplier = 0;
    timeouts.ReadTotalTimeoutConstant = 0;
    timeouts.WriteTotalTimeoutMultiplier = 0;
    timeouts.WriteTotalTimeoutConstant = 0;

    if (!SetCommTimeouts(hSerial, &timeouts)) {
        printf("Error setting timeouts: %d\n", GetLastError());
        CloseHandle(hSerial);
        return FALSE;
    }

    return TRUE;
}

3.发送函数

// 发送数据到串口
BOOL WriteToSerialPort(HANDLE hSerial, const char *data) {
    DWORD bytesWritten;
    if (!WriteFile(hSerial, data, strlen(data), &bytesWritten, NULL)) {
        printf("Error writing to serial port: %d\n", GetLastError());
        return FALSE;
    }
    return TRUE;
}

4.接收函数

// 从串口读取数据
BOOL ReadFromSerialPort(HANDLE hSerial, char *buffer, DWORD size) {
    DWORD bytesRead;
    if (!ReadFile(hSerial, buffer, size, &bytesRead, NULL)) {
        printf("Error reading from serial port: %d\n", GetLastError());
        return FALSE;
    }
    buffer[bytesRead] = '\0'; // 添加结束符以形成字符串
    return TRUE;
}

5.主函数

int main() {
    HANDLE hSerial = OpenSerialPort(PORT_NAME);
    if (hSerial != INVALID_HANDLE_VALUE) {
        if (SetupSerialPort(hSerial)) {
            char sendData[] = "Hello, World!";
            WriteToSerialPort(hSerial, sendData);

            char receiveBuffer[BUFFER_SIZE];
            ReadFromSerialPort(hSerial, receiveBuffer, BUFFER_SIZE);
            printf("Received: %s\n", receiveBuffer);

            CloseHandle(hSerial);
        }
    }

    return 0;
}

完整代码段:

#include <windows.h>
#include <stdio.h>

#define BAUD_RATE CBR_9600
#define PORT_NAME "COM1"
#define BUFFER_SIZE 256

// 打开串口
HANDLE OpenSerialPort(const char *portName) {
    HANDLE hSerial = CreateFileA(portName, GENERIC_READ | GENERIC_WRITE,
                               0, NULL, OPEN_EXISTING, 0, NULL);
    if (hSerial == INVALID_HANDLE_VALUE) {
        printf("Error opening serial port: %d\n", GetLastError());
        return INVALID_HANDLE_VALUE;
    }
    return hSerial;
}

// 配置串口参数
BOOL SetupSerialPort(HANDLE hSerial) {
    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength = sizeof(DCB);

    // 获取当前串口设置并修改
    if (!GetCommState(hSerial, &dcbSerialParams)) {
        printf("Error getting current serial port settings: %d\n", GetLastError());
        CloseHandle(hSerial);
        return FALSE;
    }

    // 设置波特率和其他参数
    dcbSerialParams.BaudRate = BAUD_RATE;
    dcbSerialParams.ByteSize = 8;
    dcbSerialParams.StopBits = ONESTOPBIT;
    dcbSerialParams.Parity = NOPARITY;

    if (!SetCommState(hSerial, &dcbSerialParams)) {
        printf("Error setting serial port parameters: %d\n", GetLastError());
        CloseHandle(hSerial);
        return FALSE;
    }

    // 设置超时参数
    COMMTIMEOUTS timeouts;
    timeouts.ReadIntervalTimeout = MAXDWORD;
    timeouts.ReadTotalTimeoutMultiplier = 0;
    timeouts.ReadTotalTimeoutConstant = 0;
    timeouts.WriteTotalTimeoutMultiplier = 0;
    timeouts.WriteTotalTimeoutConstant = 0;

    if (!SetCommTimeouts(hSerial, &timeouts)) {
        printf("Error setting timeouts: %d\n", GetLastError());
        CloseHandle(hSerial);
        return FALSE;
    }

    return TRUE;
}

// 发送数据到串口
BOOL WriteToSerialPort(HANDLE hSerial, const char *data) {
    DWORD bytesWritten;
    if (!WriteFile(hSerial, data, strlen(data), &bytesWritten, NULL)) {
        printf("Error writing to serial port: %d\n", GetLastError());
        return FALSE;
    }
    return TRUE;
}

// 从串口读取数据
BOOL ReadFromSerialPort(HANDLE hSerial, char *buffer, DWORD size) {
    DWORD bytesRead;
    if (!ReadFile(hSerial, buffer, size, &bytesRead, NULL)) {
        printf("Error reading from serial port: %d\n", GetLastError());
        return FALSE;
    }
    buffer[bytesRead] = '\0'; // 添加结束符以形成字符串
    return TRUE;
}

int main() {
    HANDLE hSerial = OpenSerialPort(PORT_NAME);
    if (hSerial != INVALID_HANDLE_VALUE) {
        if (SetupSerialPort(hSerial)) {
            char sendData[] = "Hello, World!";
            WriteToSerialPort(hSerial, sendData);

            char receiveBuffer[BUFFER_SIZE];
            ReadFromSerialPort(hSerial, receiveBuffer, BUFFER_SIZE);
            printf("Received: %s\n", receiveBuffer);

            CloseHandle(hSerial);
        }
    }

    return 0;
}
  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值