Итак, я создал базовый графический интерфейс QT, где я хочу установить связь с Arduino Nano через USB. Я посылаю номер через GUI, и Arduino получает номер и обрабатывает его.Arduino не получает данные после повторного подключения к USB
Связь прекрасно работает, когда я загружаю код в Arduino и сразу же открываю GUI и запускаю процесс. Однако, когда я отсоединяю Arduino от USB (или перезагружаю свой компьютер - я уже пробовал оба) и снова подключаю его к 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 или перезагрузите компьютер.
~~~~~~~~~~~~~~~~~~~~~~~~~~ РЕДАКТИРОВАТЬ ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~
COM-порт остается неизменным после повторного подключения, и светодиод Arduino Rx нормально мигает, когда я отправляю данные через графический интерфейс.
~~~~~~~~~~~~~~~~~ РЕДАКТИРОВАТЬ 2 ~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~
Итак, я попытался использовать код из документации Arduino Serial, и проблема остается. Когда я загружаю код, Arduino правильно принимает символ и включает светодиод, но как только я его отсоединяю, а затем подключаю обратно, он ничего не делает, светодиод остается низким, так как он никогда не входит в «если».
Вот код, который я использовал:
int incomingByte = 0;
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
digitalWrite(13, HIGH);
incomingByte = Serial.read();
}
}
~~~~~~~~~~~~~~~~~~~~~~ EDIT 3 ~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Так что у меня следующие 3 сценария:
Использование Сценарий A:
- Код загрузки
- Запуск GUI
- Отправить данные - Он получает правильно
- отключить и вновь подключить
- Run GUI снова
- Отправить данных - мигает RX, но последовательный.доступные возвращает 0
Использовать обычные Сценарий B:
- Загрузить код
- Run Brays
- Отправить данные - Он получает правильно
- отключить и вновь подключить
- Run Brays снова
- Отправить данные - он правильно получает
Использование Сценарий C (самое интересное):
- Загрузить код
- Run GUI
- Отправить данные - Он получает правильно
- отключить и вновь подключить
- Run Brays этот раз
- Отправить данные - Он правильно принимает
- Запустите GUI снова после Brays
- Отправить данные - Он получает правильно
Я также сделал код 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;
}
~~~~~~~~~~~ ~~~~~~~~~~~ EDIT 4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~
Итак, после многих усилий и любопытства я понял, что источником проблемы является не код Arduino, а нечто, связанное с QT или Windows. Я добавил задержки, которые Джефф рекомендовал и заметил, что каждый раз, когда он функционировал должным образом, Rx моргнул, а светодиод стал высоким, как указано в коде. Однако после повторного подключения проблема осталась, но я заметил, что на этот раз сразу после нажатия «Отправить» для отправки символов светодиод моргнул на несколько миллисекунд (возможно, указав некоторую ошибку ??), а затем после 1 секунды задержка Rx мигает, указывающая на получение данных, и светодиод остался низким, поскольку Serial.available остался 0.
Итак, что я пробовал дальше, нужно было удалить одну строку кода за раз, чтобы узнать, что вызывает проблему.И я закончил с буквально пустым кодом Arduino, только пустые настройки и петлевые методы и следующий QT GUI код:
void myThread::run()
{
QSerialPort *serial1 = new QSerialPort();
serial1->setPortName("COM5");
serial1->open(QIODevice::WriteOnly);
serial1->close();
}
Чтобы резюмировать, что происходит сейчас:
- Загрузить код Arduino
- Run GUI
- Отправить данные
- Ничего не происходит (нормальное поведение)
- Отключите и снова подключите Arduino к USB
- Run GUI
- Отправить данные привели
- Arduino кратковременно мигает один раз (возможно, указывает на какую-то ошибку)
Светодиодный индикатор Arduino, указывающий, что он принимает данные? – Jeff
Да, он нормально мигает, даже после переподключения. Это только serial.available(), который возвращает 0. – r21
Какой вывод вы получаете от Arduino? – Jeff