У меня очень странная проблема, которая сводила меня с ума в течение последних двух дней.
У меня есть последовательное устройство (фотометр LS 100), которым я пытаюсь управлять. Используя терминал (термит), настроенный с правильными параметрами, я могу отправить команду («MES»), затем разделитель (CR LF) и получить некоторые данные измерений, как и ожидалось.
Проблема в том, что из Qt я не получаю никаких данных. Используя программу анализатора, я подтвердил, что отправляю те же 5 байтов (MES CR LF), что и терминал, и с той же настройкой порта.
Если я изменю управление потоком на «NoFlowControl», тогда я смогу вернуть некоторые данные, но они кажутся бессмысленными и представляют собой всего один случайный байт. В любом случае документация устройства говорит об использовании RTS / CTS, и это то, что терминал (термит) настроен для использования.
Также, если я использую пример терминала Qt serialport, у меня возникает та же проблема, когда я не могу заставить устройство возвращать данные. Я также пытался использовать C # и у меня точно такая же проблема. Единственное, что кажется способным общаться с прибором, это терминал Termite.
Qt Code:
port.setPortName(ui->cmbPort->currentText());
port.setBaudRate(QSerialPort::Baud4800);
port.setDataBits(QSerialPort::Data7);
port.setParity(QSerialPort::EvenParity);
port.setStopBits(QSerialPort::TwoStop);
port.setFlowControl(QSerialPort::HardwareControl);
if (!port.open(QIODevice::ReadWrite))
{
connected = false;
QMessageBox::information(this, "Failed To Open", "Failed to open the serial port");
ui->statusBar->showMessage("Connection to " + ui->cmbPort->currentText() + " failed...");
}
else
{
connected = true;
ui->statusBar->showMessage("Connected to " + ui->cmbPort->currentText() + "...");
}
QByteArray cmdB;
cmdB[0] = 0x4d;
cmdB[1] = 0x45;
cmdB[2] = 0x53;
cmdB[3] = 0x0d;
cmdB[4] = 0x0a;
qint64 r = port.write(cmdB.data(), cmdB.size());
qDebug() << "Written: " << r;
Затем функция ReadData, которая вызывается на ReadyRead или каждые 100 мс:
QByteArray data = port.readAll();
if (data.count() != 0)
{
qDebug() << "Read " << data.size() << " bytes";
QString str = QString(data);
ui->txtOutput->append(str);
}
Любая помощь будет высоко ценится, у меня кончаются волосы, чтобы вытащить …
Наконец-то все получилось.
Несмотря на то, что в документации говорится об использовании RTS / CTS, а программа терминала (термит) использует RTS / CTS, решением было отключить управление потоком в приложении Qt (т.е. NoFlowControl), а затем вручную включить линию RTS перед отправкой данные, как это:
port.setRequestToSend(true);
qint64 r = port.write(cmdB.data(), cmdB.size());
port.waitForBytesWritten(5000);
qDebug() << "Written: " << r;
Других решений пока нет …