C++ Arduino没有';重新连接到USB后无法接收数据
所以,我已经构建了一个基本的QtGUI,在这里我想通过USB与Arduino Nano建立通信。我通过GUI发送一个数字,Arduino接收并处理该数字 当我将代码上传到Arduino并随后打开GUI并启动流程时,通信工作正常。但是,当我断开Arduino与USB的连接(或者重启我的电脑-我已经尝试了这两种方法)并将其重新连接以与GUI一起使用时,Arduino的行为就像什么都没有收到一样 更具体地说,在第一种情况下,C++ Arduino没有';重新连接到USB后无法接收数据,c++,qt,arduino,serial-port,C++,Qt,Arduino,Serial Port,所以,我已经构建了一个基本的QtGUI,在这里我想通过USB与Arduino Nano建立通信。我通过GUI发送一个数字,Arduino接收并处理该数字 当我将代码上传到Arduino并随后打开GUI并启动流程时,通信工作正常。但是,当我断开Arduino与USB的连接(或者重启我的电脑-我已经尝试了这两种方法)并将其重新连接以与GUI一起使用时,Arduino的行为就像什么都没有收到一样 更具体地说,在第一种情况下,Serial.available()在正确接收数字时返回“1”,但在后一种情况
Serial.available()
在正确接收数字时返回“1”,但在后一种情况下返回“0”,因此不做任何操作
我尽可能地简化了代码,试图找出问题所在,但问题仍在继续
下面是主要的QT GUI代码:
depth_ = insertDepthEdit->text().toInt(); // user input from GUI
myThread *mThread;
mThread = new myThread(this, depth_);
connect(mThread, SIGNAL(valueRead(QString)), this, SLOT(onTextChange(QString)));
//valueRead is the signal emitted from Arduino
//onTextChange the function that processes the received string
mThread->start();
mThread->wait(100);
mThread->quit();
void myThread::run()
{
QSerialPort *serial1 = new QSerialPort();
serial1->setPortName("COM5");
serial1->open(QIODevice::WriteOnly);
serial1->close();
}
Arduino线程代码(也是QT):
当我将代码上传到Arduino时,无论我是否关闭GUI并重新启动它,它都能正常工作。只有在Arduino断电时才会出现问题,例如:当我断开它与USB的连接或重新启动电脑时
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~编辑~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
重新连接后COM端口保持不变,当我通过GUI发送数据时,Arduino Rx LED正常闪烁
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~编辑2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
好的,我试着使用Arduino系列文档中的代码,但问题仍然存在。当我上传代码时,Arduino会正确接收字符并打开LED,但一旦我断开连接,然后再将其连接回来,它什么也不做,LED保持低位,因为它从未进入“如果”
以下是我使用的代码:
int incomingByte = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
digitalWrite(13, HIGH);
incomingByte = Serial.read();
}
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~编辑3~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
因此,我有以下3种情况:
使用场景A:
void myThread::run()
{
QSerialPort *serial = new QSerialPort();
serial->setPortName("COM3");
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->open(QIODevice::WriteOnly);
if (serial->isOpen() && serial->isWritable())
{
QByteArray ba(QString::number(depth_).toStdString().c_str());
serial->write(ba);
serial->flush();
serial->close();
}
delete serial;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~编辑4~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
因此,经过大量的努力和好奇,我意识到问题的根源不是Arduino代码,而是与QT或Windows相关的东西。我添加了Jeff建议的延迟,并注意到每次它正常工作时,Rx闪烁,LED变高,如代码所示。然而,在重新连接后,问题仍然存在,但我注意到,这一次,在单击“发送”发送字符后,LED闪烁了几毫秒(可能指示某些错误??)然后,在1秒延迟后,Rx闪烁,表示接收到数据,LED保持低位,为串行。可用状态保持为0
所以,我接下来尝试的是一次删除一行代码,看看是什么导致了问题。我最终得到了完全空白的Arduino代码,只有空的设置和循环方法,以及以下QT GUI代码:
depth_ = insertDepthEdit->text().toInt(); // user input from GUI
myThread *mThread;
mThread = new myThread(this, depth_);
connect(mThread, SIGNAL(valueRead(QString)), this, SLOT(onTextChange(QString)));
//valueRead is the signal emitted from Arduino
//onTextChange the function that processes the received string
mThread->start();
mThread->wait(100);
mThread->quit();
void myThread::run()
{
QSerialPort *serial1 = new QSerialPort();
serial1->setPortName("COM5");
serial1->open(QIODevice::WriteOnly);
serial1->close();
}
总而言之,现在发生的是:
根据我的经验,问题不在于Arduino中的代码。这是因为串行端口在重新插入时获得了不同的名称 例如,在Linux中,最初的端口是
/dev/ARD0
,但当它断开连接并重新插入ARD0上的连接时,新插件名为/dev/ARD1
。(在Windows中,可能是COM17
然后是COM18
)
我知道的使其成为原始端口名的唯一方法是在再次插入之前关闭所有连接到它的设备:关闭Arduino IDE,关闭所有打开端口的程序,等等。如果您将此示例用于Arduino串行文档,您是否收到发送的字符
int incomingByte = 0; // for incoming serial data
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incomingByte = Serial.read();
// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
抓住这里的救命稻草,将我的评论延迟一秒钟。在iPhone上编辑的格式有点混乱,但我相信你们可以看到我的意图 编辑:另外,我认为你不应该在循环中做序列->关闭。我也会尝试反复发送一个字符,直到我们有一个工作
void myThread::run()
{
QSerialPort *serial = new QSerialPort();
serial->setPortName("COM3");
serial->setBaudRate(QSerialPort::Baud9600);
serial->setDataBits(QSerialPort::Data8);
serial->open(QIODevice::WriteOnly);
if (serial->isOpen() && serial->isWritable())
{
QByteArray ba(QString::number(depth_).toStdString().c_str());
serial->write("x");
delay 1 second here
serial->flush();
delay 1 second here
}
serial->close();
delay 1 second here
delete serial;
}
好的,经过几个小时的调试,我找到了问题的原因 根本原因是,在重新连接Arduino之后,每次我在QT中调用serial.open时,Arduino都会进行重置(由LED闪烁指示),当它在引导加载程序阶段之后运行代码时,主程序已经通过serial.write QT命令而没有接收数据 所以,我所做的就是添加一个
Sleep(uint(2000))代码>在serial.open之后,以便让Arduino完成引导,然后开始发送数据
感谢大家的帮助和即时回复 我已经检查过了,只要USB端口相同,每次连接Arduino时端口都保持不变。在我的代码中,我将端口声明为“COM3”,每次连接Arduino时,我都会检查设备管理器,它会连接到那里。正如我所说的,即使我重新启动电脑,问题仍然存在,这意味着所有程序都是一个问题