Qt и с++ ломает ком порты в Ubuntu

Есть промышленный компьютер у которого на метеринке 6 компортов. Проверяю стандартными средствами линукса, то есть cat и echo. Так же у меня есть устройство где я могу посмотреть что мне пришло , т.е терминал на другом конце провода. При включении компьютера после установки драйвера cat и есho работают отлично, но стоит мне запустить приложение на c++ c использованием библиотеки qserialport не работает не приложение ни cat и echo. Драйвер просто умирает. Точнее драйвер остается жив но настройки почему то сбиваются. Вернуть к жизни получается только по средствам дополнительного по поставляемого с драйвером. Поведение мне совсем не понятно. Код приведенный ниже:

void comPort::connectPort() {
port.setPortName(settings.name);
if (port.open(QIODevice::ReadWrite)) {
port.setBaudRate(settings.baudRate);
port.setDataBits(settings.dataBits);
port.setParity(settings.parity);
port.setStopBits(settings.stopBits);
port.setFlowControl(settings.flowControl);
if (port.isOpen()) qDebug() << "Port is Open";
} else {
  port.close();
qDebug() << port.errorString().toLocal8Bit();
}
}

void comPort::writeData(QByteArray data) {
if (port.isOpen())
  port.write(data);
else
  qDebug() << "port is close";
}

unsigned char *comPort::read(int size) {
QByteArray data;
data.append(port.readAll());
qDebug() << data.toHex();  
}

Код настолько примитивен что в нем не возможно ошибиться , сразу отвечу на вопрос что в диструкторе я закрываю порт и очищаю всю память.Так же пробовал просто открывать порт без каких либо настроек, но не нашел если это сделать без настроек то какие возьмет компилятор или проигнорирует настройки и просто пульнет в порт. Может быть кто то встречался с данной проблемой , буду крайне признателен


Ответы (2 шт):

Автор решения: eri

Если cat работает и не нужно устанавливать скорость на порт, то можно QFile использовать.

Там есть сигнал readyRead которым можно читать данные по мере поступления.

→ Ссылка
Автор решения: Roman Ozhegov

Встречалась мне эта проблема. Суть в том, что сначала порт надо настроить, а потом его открывать. Попробуйте так:

port.setPortName(settings.name);
port.setBaudRate(settings.baudRate);
port.setDataBits(settings.dataBits);
port.setParity(settings.parity);
port.setStopBits(settings.stopBits);
port.setFlowControl(settings.flowControl);
if (port.open(QIODevice::ReadWrite)) {
    if (port.isOpen()) qDebug() << "Port is Open";
} else {
    port.close();
    qDebug() << port.errorString().toLocal8Bit();
}

Причем, что удивительно, в Windows Ваш код будет работать и не важно сначала Вы открываете порт, а потом его настраиваете или наоборот. А вот в Linux не так: строго сначала настроить, потом открыть. Вот тебе и кроссплатформенность Qt.

→ Ссылка