You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下C程序无法直接与Arduino串口通信 需先打开串口监视器

Windows下C语言串口程序首次连接Arduino通信异常解决

我开发了一款Windows平台的C语言串口工具,用于读取Arduino单片机输出的数据并打印到终端。实际使用时发现如下异常:首次将Arduino通过USB连接到电脑后,自研程序无法和Arduino正常通信,必须先打开一次Arduino IDE自带的串口监视器、或是PuTTY这类第三方串口工具,之后自研程序才能正常工作,一旦断开Arduino的USB连接再重新插入,就会再次出现相同故障。

原始代码

上位机C语言代码

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

int main(){
    float val;
    int jori;
    char buff[1];
    DWORD dwRead, dwWrite;
    DCB dcb = {sizeof dcb};
    HANDLE hComm;
    HANDLE screen = GetStdHandle(STD_OUTPUT_HANDLE);
    char port[8];
    printf("Give port (COM#):\n");
    gets(port);
    hComm = CreateFile (port,
                        GENERIC_READ | GENERIC_WRITE,
                        0,
                        0,
                        OPEN_EXISTING,
                        0,
                        0);
    if (hComm == INVALID_HANDLE_VALUE){
        printf("INVALID HANDLE VALUE\n");
        main();
    }
    //if (GetCommState(hComm, &dcb)){
    //    dcb.BaudRate = CBR_9600;
    //    dcb.ByteSize = 8;
    //    dcb.Parity = NOPARITY;
    //    dcb.StopBits = ONESTOPBIT;
    //    printf("DCB ON\n");
    //}
    dcb.fBinary = TRUE;
    dcb.BaudRate = 9600;
    dcb.ByteSize = 8;
    dcb.Parity = NOPARITY;
    dcb.StopBits = ONESTOPBIT;
    do {
        ReadFile(hComm, buff, sizeof(buff), &dwRead, NULL);
        if (dwRead){
            WriteFile(screen, buff, sizeof(buff), &dwWrite, NULL);
            //val = atof(buff);
            //printf("\r%f",val);
        }}
        while ( jori != 66);
        return 0;
}

Arduino端代码

int i = 0;

void setup() {
  Serial.begin(9600);

}

void loop() {
 Serial.println(i);
  i = i + 1;
  delay(1000);
}

问题原因与修复方案

原因说明

常见的Arduino开发板(如Uno、Nano等)的USB转串口电路默认配置为:当串口DTR信号产生下拉再上拉的电平变化时,会触发单片机复位,复位完成后才会启动串口输出数据。Arduino IDE串口监视器、PuTTY等成熟串口工具在打开端口时会默认触发DTR电平变化,因此先打开一次这类工具后,Arduino已经完成复位初始化,自研程序就能正常读取数据。

修复代码

在设置DCB串口参数前添加如下代码,主动触发DTR电平变化,即可解决首次连接无法通信的问题:

if (!EscapeCommFunction(hComm, CLRDTR)){
        LocalFree(NULL);
}
if (!EscapeCommFunction(hComm, SETDTR)){
        LocalFree(NULL);
}

内容的提问来源于stack exchange,提问作者EcstaticSedative

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 09:09:10