c # — последовательная связь не работает через QSerialPort (Qt), но работает через терминал (термит)

У меня очень странная проблема, которая сводила меня с ума в течение последних двух дней.

У меня есть последовательное устройство (фотометр 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);
}

Любая помощь будет высоко ценится, у меня кончаются волосы, чтобы вытащить …

0

Решение

Наконец-то все получилось.

Несмотря на то, что в документации говорится об использовании RTS / CTS, а программа терминала (термит) использует RTS / CTS, решением было отключить управление потоком в приложении Qt (т.е. NoFlowControl), а затем вручную включить линию RTS перед отправкой данные, как это:

port.setRequestToSend(true);
qint64 r = port.write(cmdB.data(), cmdB.size());
port.waitForBytesWritten(5000);
qDebug() << "Written: " << r;
0

Другие решения

Других решений пока нет …