Проблема подключения QextSerialPort к Arduino
Я пытаюсь установить последовательное соединение с платой Arduino Diecimila с помощью QextSerialPort. Мое приложение зависает, хотя каждый раз, когда я вызываю port->open(). Я думаю, что это происходит потому, что плата Arduino перезагружается каждый раз, когда к ней устанавливается последовательное соединение. Существует способ не выполнить сброс платы, описанный здесь, но я не могу понять, как заставить QextSerialPort сделать это. Я могу установить для DTR значение false только после того, как порт был открыт, что не сильно помогает, поскольку к тому времени плата уже перезапустилась.
Код для подключения выглядит так:
port = new QextSerialPort("/dev/tty.usbserial-A4001uwj");
port->open(QIODevice::ReadWrite);
port->setBaudRate(BAUD9600);
port->setFlowControl(FLOW_OFF);
port->setParity(PAR_NONE);
port->setDataBits(DATA_8);
port->setStopBits(STOP_1);
port->setDtr(false);
port->setRts(false);
Любые идеи о том, как это сделать. Мне не обязательно использовать QextSerialPort, если кто-то знает о другой библиотеке, которая добивается цели.
Я новичок в C++ и Qt.
ОБНОВЛЕНИЕ: я заметил, что если я запускаю скрипт python, который соединяется с тем же портом (используя pySerial) перед запуском вышеупомянутого кода, все работает просто отлично.
4 ответа
У меня была похожая проблема.
В моем случае QExtSerial открыл бы порт, я бы увидел индикаторы RX/TX на плате, но данные не были бы получены. Если бы я открыл порт другой терминальной программой, сначала QExtSerial работал бы так, как ожидалось.
Для меня это решило открыть порт, настроить параметры порта, а затем на короткое время установить высокие значения DTR и RTS.
Это было на Windows 7 с ATMega32u4 (SFE Pro Micro).
bool serialController::openPort(QString portName) {
QString selectPort = QString("\\\\.\\%1").arg(portName);
this->port = new QextSerialPort(selectPort,QextSerialPort::EventDriven);
if (port->open(QIODevice::ReadWrite | QIODevice::Unbuffered) == true) {
port->setBaudRate(BAUD38400);
port->setFlowControl(FLOW_OFF);
port->setParity(PAR_NONE);
port->setDataBits(DATA_8);
port->setStopBits(STOP_1);
port->setTimeout(500);
port->setDtr(true);
port->setRts(true);
Sleep(100);
port->setDtr(false);
port->setRts(false);
connect(port,SIGNAL(readyRead()), this, SLOT(onReadyRead()));
return true;
} else {
// Device failed to open: port->errorString();
}
return false;
}
libserial - невероятная библиотека, которую я использую для автономных последовательных приложений для моего Arduino Duemilanove.
Вы можете просто использовать последовательный кабель 3xire (tx/rx/gnd) без линий DTR,RTS?