除非我首先使用 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 之前
您可以尝试两件事。
检查是否必须在控制台程序中启用 DTR(数据终端就绪)流控制。
检查在控制台程序中打开串口后是否需要等待(仅几毫秒)才能访问串口。
我用 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 之前
您可以尝试两件事。
检查是否必须在控制台程序中启用 DTR(数据终端就绪)流控制。
检查在控制台程序中打开串口后是否需要等待(仅几毫秒)才能访问串口。