C语言串口程序-适用于Windows系统编译出错

       想要用c语言体验一下,怎样从0开始编写一个串口程序,在网上找到了一个(网上这样的例子很多,还用AI生成了一个可惜没有编译成功,修改太费时了,果断放弃),可是一直编译出错

82172b23c1334a60a0d7cf49ce583b69.png

      检查代码发现都没有逻辑错误, 到最后到网上查才发现这个timeouts声明不能放这里,把它放在函数开头最上面发现报错就少了很多。

      可是还有一些错误

dac9e0ac22fa4ba39e81562ec537c821.png

我简直蒙了,哪里缺少分号了不是都写上了吗,有了前车之鉴,我想会不会是字符串声明不能放这里,果然,放在“hello world”下面一行,编译成功。问题又是出在这里,visual c++ 6.0可能太老了,会出这种奇怪的问题

           编译成功以后,我就用两台电脑两个串口工具试了一下,结果只能发送“hello world”,不能接收到另一台电脑发送过来的数据,又是一个难题😅,没想到写一个简单的串口编程都这么困难丛丛,也怪自己水平不行😂,调试了多次,后面才发现是设置超时参数有问题

d964eb46b82f4c0795212938a702f3e8.png

没办法,谁叫自己懒,,,

后面改成 10  50  10  50

好!终于接收到发过来的数据了,有那么一点点激动

efa5ffacd3d2473a988afc215d611622.png

最后想说的是,我前面是用232串口工具连接的,其实改成485 串口工具也是可以的,结果是一样的,就是要注意232要接3根线

完整代码:

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

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


COMMTIMEOUTS timeouts;
//打开串口
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;
    }
  //设置超时参数
    
    timeouts.ReadIntervalTimeout = MAXDWORD;
    timeouts.ReadTotalTimeoutMultiplier =10;
    timeouts.ReadTotalTimeoutConstant =50;
    timeouts.WriteTotalTimeoutMultiplier =10;
    timeouts.WriteTotalTimeoutConstant =50;

    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!";
            char receiveBuffer[BUFFER_SIZE];
            WriteToSerialPort(hSerial, sendData);
           
            ReadFromSerialPort(hSerial, receiveBuffer, BUFFER_SIZE);
            printf("Received: %s\n", receiveBuffer);

            CloseHandle(hSerial);
        }
    }

    return 0;
}

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不如休去>_<嵌入式开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值