除非我首先使用 Arduino 串行监视器或 PuTTY,否则 C 程序不会与 Arduino 通信

C program won't communicate with Arduino unless I first use Arduino serial monitor or PuTTY

我用 C 编写了一个程序,可以将数据从我的 Arduino micro 打印到终端。我的问题是,当我第一次将 Arduino 连接到我的 Windows PC 时,在我第一次使用像 Arduino IDE 串行监视器或 PuTTY 这样的程序之前,它不会与我的程序一起工作。之后一切正常,直到我断开并重新连接 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);
}

编辑:我已经解决了这个问题。

我必须添加

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

在设置我的 dcb 之前

您可以尝试两件事。

  1. 检查是否必须在控制台程序中启用 DTR(数据终端就绪)流控制。

  2. 检查在控制台程序中打开串口后是否需要等待(仅几毫秒)才能访问串口。