问题描述
我正在尝试在Windows上使用C ++与Arduino通信。
Arduino正在等待一个数字,并且将点亮接收到的数字指定的一定数量的LED。我可以成功打开端口并将数据发送到Arduino,但是有一些奇怪的行为。
当我在Arduino IDE中使用内置串行控制台并发送例如“ 8”时,Arduino会做出正确反应。 (根据串行嗅探器发送的数据为38 0A
。
当我运行C ++代码时,发送的数据也是38 0A
,但是Arduino对此没有反应。
我的PC端C ++代码:
#include <Windows.h>
#include <iostream>
bool write(void* data,int len)
{
HANDLE hPort;
hPort = CreateFile("\\\\.\\COM4",GENERIC_WRITE,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_norMAL,NULL);
DCB dcb = { 0 };
dcb.DCBlength = sizeof(dcb);
DWORD byteswritten;
if (!GetCommState(hPort,&dcb)) return false;
dcb.Baudrate = CBR_115200;
dcb.ByteSize = 8;
dcb.Parity = nopARITY;
dcb.StopBits = OnesTOPBIT;
if (!SetCommState(hPort,&dcb)) return false;
bool retVal = WriteFile(hPort,data,len,&byteswritten,NULL);
CloseHandle(hPort);
return retVal;
}
int main()
{
char lpBuffer[] = "8\n";
if (write(lpBuffer,strlen(lpBuffer))) {
std::cout << "Success" << std::endl;
}
else {
std::cout << "Error" << std::endl;
}
return 0;
}
这是Arduino代码,尽管我认为问题出在PC端...
#define BAUD 115200
int pins[] = {A5,A4,A3,2,4,3,5,6,7,8,9,10,11,12,13};
int count = 0;
void setup() {
Serial.begin(BAUD);
for(int pin : pins) {
pinMode(pin,OUTPUT);
}
}
void updateLeds(int cnt) {
if(cnt > sizeof(pins)) cnt = sizeof(pins);
for(int pin : pins) {
digitalWrite(pin,LOW);
}
for(int i = 0; i < cnt; i++) {
digitalWrite(pins[i],HIGH);
}
}
void loop() {
if(Serial.available() > 0) {
Serial.println("[RECV]");
count = Serial.parseInt();
Serial.read();
}
updateLeds(count);
delay(50);
}
解决方法
正如朱利安(Julian)在评论中提到的那样,启用DTR可以达到目的。
...
dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
...