Проблема подключения 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.

qserialdevice использовать!

Пример:

http://robocraft.ru/blog/544.html

Вы можете просто использовать последовательный кабель 3xire (tx/rx/gnd) без линий DTR,RTS?

Другие вопросы по тегам