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
相关产品推荐
相关产品推荐

