gpt4 book ai didi

c++ - Arduino在重新连接到USB后不接收数据

转载 作者:搜寻专家 更新时间:2023-10-31 02:17:06 25 4
gpt4 key购买 nike

因此,我建立了一个基本的QT GUI,我想在其中通过USB与Arduino Nano建立通信。我通过GUI发送一个数字,然后Arduino接收到该数字并进行处理。

当我将代码上传到Arduino并随后打开GUI并开始该过程时,通讯正常进行。但是,当我从USB断开Arduino的连接(或重新启动我的PC -我已经尝试了两者)并重新连接它以使其与GUI一起使用时,Arduino的行为就像什么都没收到一样。

更具体地说,在第一种情况下,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();

Arduino线程代码(也是QT):
void myThread::run() {

QSerialPort serial;
serial.setPortName("COM3");
serial.setBaudRate(QSerialPort::Baud9600);
serial.setDataBits(QSerialPort::Data8);
serial.setParity(QSerialPort::NoParity);
serial.setStopBits(QSerialPort::OneStop);
serial.setFlowControl(QSerialPort::NoFlowControl);
serial.open(QIODevice::ReadWrite);

if (serial.isOpen() && serial.isWritable()) {

qDebug() << "Ready to write..." << endl;
QByteArray ba(QString::number(depth_).toStdString().c_str());
qDebug() << ba << endl;
serial.write(ba);

if (serial.bytesToWrite() > 0) {
serial.flush();
if (serial.waitForBytesWritten(1000)) {
qDebug() << "data has been sent" << endl;
}
}
if (serial.flush()) {
qDebug() << "ok" << endl;
}
}
else {
qDebug() << "Error";
}
if (serial.isOpen() && serial.isReadable()) {
qDebug() << "Ready to read..." <<endl;
while (serial.waitForReadyRead(5000)) {
QByteArray inByteArray = serial.readLine();
input_ = QString(inByteArray);
qDebug() << input_;
qDebug() << "ok" << endl;
emit valueRead(input_);
}
}
serial.close();
}

最后是Arduino代码:
int c = 0;
const int ledPin = 13;

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.print(Serial.available());
while (Serial.available() > 0) {
digitalWrite(ledPin, HIGH);
delay(5);
c = Serial.read() - '0';
Serial.flush();
}
delay(1000);
digitalWrite(ledPin, LOW);
delay(500);
}

当我将代码上传到Arduino时,无论我是否关闭GUI并重新启动它,它都能正常运行。仅当Arduino断电时才会发生问题,例如:当我从USB断开连接或重新启动PC时。

~~~~~~~~~~~~~~~~~~~~~~~~~ EDIT ~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~

重新连接后,COM端口保持不变,并且当我通过GUI发送数据时,Arduino Rx LED正常闪烁。

~~~~~~~~~~~~~~~~~~~~~~~~~编辑2 ~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~

OK,所以,我尝试使用Arduino串行文档中的代码,问题仍然存在。当我上传代码时,Arduino正确接收了字符并打开了LED,但是一旦断开连接然后再将其重新连接,它什么也没做,LED保持低电平,因为它永远不会输入“if”。

这是我使用的代码:
int incomingByte = 0;   

void setup() {
Serial.begin(9600);
}

void loop() {
if (Serial.available() > 0) {
digitalWrite(13, HIGH);
incomingByte = Serial.read();
}
}

~~~~~~~~~~~~~~~~~~~~~~编辑3 ~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~

因此,我有以下3种情况:

使用方案A:
  • 上传代码
  • 运行GUI
  • 发送数据-正确接收
  • 断开并重新连接
  • 再次运行GUI
  • 发送数据-RX闪烁但Serial.available返回0

  • 使用方案B:
  • 上传代码
  • Run Brays
  • 发送数据-正确接收
  • 断开并重新连接
  • 再次运行Brays
  • 发送数据-正确接收

  • 使用场景C(最有趣):
  • 上传代码
  • 运行GUI
  • 发送数据-正确接收
  • 断开并重新连接
  • 这次运行Brays
  • 发送数据-正确接收
  • 在Brays
  • 之后再次运行GUI
  • 发送数据-正确接收

  • 我还使QT GUI代码如此简单,但是问题仍然存在:
    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变为高亮,如代码所示。但是,重新连接后,问题仍然存在,但是我注意到,这次,单击“发送”发送字符后, 指示灯立即闪烁了几毫秒(可能指示一些错误?),然后在1秒钟后闪烁延迟Rx闪烁表示接收到数据,并且由于Serial.available保持为0,LED保持低电平。

    因此,我接下来尝试的是一次删除一行代码,以查看导致问题的原因。最后,我得到了 实际上是空的Arduino代码,只是空的设置和循环方法,以及以下QT GUI代码:
    void myThread::run()
    {
    QSerialPort *serial1 = new QSerialPort();
    serial1->setPortName("COM5");
    serial1->open(QIODevice::WriteOnly);
    serial1->close();
    }

    总而言之,现在发生的是:
  • 将代码上传到Arduino
  • 运行GUI
  • 发送数据
  • 没有任何反应(正常行为)
  • 断开Arduino并将其重新连接到USB
  • 运行GUI
  • 发送数据
  • Arduino LED短暂闪烁一次(可能指示某种错误)
  • 最佳答案

    好的,因此,在经过数小时的调试后,我发现了导致问题的原因。

    究其根源在于,在重新连接Arduino之后,每次我在QT中调用serial.open时,Arduino都会进行一次重置(由LED闪烁指示),并且在启动 bootstrap 阶段之后并运行代码,主程序已经通过了serial.write QT命令,而没有接收到数据。

    因此,我要解决的问题是在serial.open之后添加一个Sleep(uint(2000));,以便让Arduino完成启动,然后开始发送数据。

    谢谢大家的帮助和即时答复!

    关于c++ - Arduino在重新连接到USB后不接收数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36116398/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com