Прежде всего, попробуйте подключить различные сигналы, которые испускаются, когда вы читаете / записываете это из своего порта.
Например, для проверки правильности отправки данных, в соответствии с документацией вы можете использовать сигнал QIODevice::bytesWritten
:
Сигнал испускается каждый раз, когда полезная нагрузка данных записывается в текущий канал записи устройства. Аргумент bytes устанавливается равным количеству байтов, записанных в этой полезной нагрузке.
connect(serialPort,&QSerialPort::bytesWritte, this, [](const qint64 bytes) {
qDebug() << "Sent data: " << bytes << " bytes.";
});
Чтобы прочитать данные, как вы уже это сделали, вам нужно проверить сигнал QIODevice::readyRead
:
Этот сигнал испускается один раз каждый раз, когда новые данные доступны для чтения из текущего канала чтения устройства. Он будет отправляться снова только после того, как станут доступны новые данные, например, когда новая полезная нагрузка сетевых данных поступит на сетевой сокет или когда новый блок данных будет добавлен на ваше устройство.
Что касается описанной вами проблемы, первый шаг, который необходимо сделать, - убедиться, что ваш дециив не был настроен на работу в эхо-режиме. Чтобы отключить его, вам необходимо проверить интерфейс вашего устройства.
Если это не проблема, проверьте доступные порты с помощью `QSerialPort :: availablePorts и убедитесь, что вы подключаетесь к правильному. Например, чтобы подключиться к первому порту, вы можете сделать что-то вроде этого и проверить, что конфигурация совместима с вашим устройством:
auto serialInfo = QSerialPortInfo::availablePorts();
serialPort->setPort(serialInfo[0])
auto ret = serialPort.open(QSerialPort::ReadWrite)
&& serialPort.setBaudRate(QSerialPort::Baud38400)
&& serialPort.setDataBits(QSerialPort::Data8)
&& serialPort.setStopBits(QSerialPort::OneStop)
&& serialPort.setParity(QSerialPort::NoParity);
qDebug() << "Port has been configured properly?: " << ret;
Если проблема не устранена, вы можете получить собственный обработчик и изменить его свойства, вызвав QSerailPort::handle()
.
Если платформа поддерживается и последовательный порт открыт, возвращает дескриптор собственного последовательного порта; в противном случае возвращает -1.
Последний вариант, он работает не на всех платформах. В худшем случае посмотрите официальные документы termios . Он обеспечивает низкоуровневый интерфейс, который позволяет включать / отключать режим эха.
struct termios options;
tcgetattr(file, &options);
cfmakeraw(&options);
options.c_lflag &= ~(ECHO | ECHOE); // Add or disable the flags
tcsetattr(file, TCSANOW, &options);