Russian Qt Forum

Qt => Общие вопросы => Тема начата: 8Observer8 от Август 27, 2014, 10:16



Название: [Решено] QSerialPort. Runtime error
Отправлено: 8Observer8 от Август 27, 2014, 10:16
Привет!

Проблема в том, что приложение завершается ошибкой времени выполнения, когда я нажимаю кнопку "startTransmissionButton", при нажатии на которой байт должен отправиться в COM-порт

Порт почему-то не открывается. Хотя должен. Функция m_port.errorString().toStdString() выдаёт сообщение:
Цитировать
The filename, directory name, or volume label syntax is incorrect.

Но даже если он не открывается, то функция m_port.isOpen() должна вернуть false, но как раз в момент её выполнения случается ошибка:

(http://i6.pixs.ru/storage/8/5/4/298png_1573462_13584854.png)

Я сделал минимальный проект, который демонстрирует проблему: https://github.com/8Observer8/ComPort

Заранее спасибо за помощь!


Название: Re: QSerialPort. Runtime error
Отправлено: kuzulis от Август 27, 2014, 10:40
Что за тип сериал порта используется?


Название: Re: QSerialPort. Runtime error
Отправлено: 8Observer8 от Август 27, 2014, 10:45
Всмысле? У меня пара виртуальных портов COM1-COM2:
(http://i6.pixs.ru/storage/2/3/3/299png_4870990_13585233.png)


Название: Re: QSerialPort. Runtime error
Отправлено: Bepec от Август 27, 2014, 10:48
Код:
Sender::Sender( const QString &portName,
                QSerialPort::BaudRate baudRate,
                QSerialPort::DataBits dataBits,
                QSerialPort::Parity parity,
                QSerialPort::StopBits stopBits,
                QSerialPort::FlowControl flowControl ) :
    m_port( portName ),
    m_baudRate( baudRate ),
    m_dataBits( dataBits ),
    m_parity( parity ),
    m_stopBits( stopBits ),
    m_flowControl( flowControl )
{
    // Set the port name
    m_port.setPortName( m_portName );

Вас не смущает что m_portName у вас не инициализировано?


Название: Re: QSerialPort. Runtime error
Отправлено: Silver_swift от Август 27, 2014, 10:50
Цитировать
Вас не смущает что m_portName у вас не инициализировано?
m_port создается на стеке.

В Qt 5.2.1 в Linux была такая особенность: сперва надо задать все настройки, потом открыть порт иначе программа падала. Возможно причина в этом.


Название: Re: QSerialPort. Runtime error
Отправлено: 8Observer8 от Август 27, 2014, 11:01
Код:
Sender::Sender( const QString &portName,
                QSerialPort::BaudRate baudRate,
                QSerialPort::DataBits dataBits,
                QSerialPort::Parity parity,
                QSerialPort::StopBits stopBits,
                QSerialPort::FlowControl flowControl ) :
    m_port( portName ),
    m_baudRate( baudRate ),
    m_dataBits( dataBits ),
    m_parity( parity ),
    m_stopBits( stopBits ),
    m_flowControl( flowControl )
{
    // Set the port name
    m_port.setPortName( m_portName );

Вас не смущает что m_portName у вас не инициализировано?
Точно! Огромное спасибо! Тут ошибка: "m_port( portName )". Надо было так написать: m_portName( portName )

В Qt 5.2.1 в Linux была такая особенность: сперва надо задать все настройки, потом открыть порт иначе программа падала. Возможно причина в этом.
Я где-то слышал, что надо сначала открыть, а потом задать настройки. Как всё же правильно то?

А программа работает теперь :)


Название: Re: QSerialPort. Runtime error
Отправлено: Bepec от Август 27, 2014, 11:08
Чуть внимательнее надо быть Silver_swift. Тут дублирование переменных с разницами в названиях. А произошло это то ли из-за невнимательности программиста, или же из-за того, что не определился программист какому форматированию следовать.

PS И к тому же контроль ошибок никакой. Отловятся конечно эксепшены, но информацию надо проверять ДО запуска процесса.


Название: Re: QSerialPort. Runtime error
Отправлено: Silver_swift от Август 27, 2014, 11:10
Цитировать
Я где-то слышал, что надо сначала открыть, а потом задать настройки. Как всё же правильно то?

Да хз, я такое заметил когда рабочая программа под Qt 5.3.1 стала падать будучи собранной на Qt 5.2, вылечил вызовом open после настроек :)

port'ов и portName'ов в коде много, не сразу понял о чем говорит Верес, извиняюсь :)))

upd: Опередили :)


Название: Re: QSerialPort. Runtime error
Отправлено: kuzulis от Август 27, 2014, 11:19
Цитировать
Я где-то слышал, что надо сначала открыть, а потом задать настройки. Как всё же правильно то?

Начиная с 5.3.0 - без разницы как. Теперь можно задавать настройки перед открытием, но все-равно реально они примутся только после успешного open().

Но в любом случае нужно проверять коды возврата всех методов (ну, или ловить сигнал ошибки).

Цитировать
Надо было так написать: m_portName( portName )

Но проще вообще удалить эту запись (и удалить переменную m_portName) , т.к. порт уже инициализируется именем m_port( portName ),


Название: Re: QSerialPort. Runtime error
Отправлено: 8Observer8 от Август 27, 2014, 11:48
Да, вы правы! Слишком похожи имена m_port и m_portName, поэтому я заменил эту строку:
Код
C++ (Qt)
QSerialPort m_port;
 
на эту:
Код
C++ (Qt)
QSerialPort m_serialPort;
 

Но проще вообще удалить эту запись (и удалить переменную m_portName) , т.к. порт уже инициализируется именем m_port( portName )
Удалил и программ стала короче примерно на пять строк:
Код
C++ (Qt)
   // Set the port name
   m_serialPort.setPortName( m_portName );
 
В конструкторе теперь так написано: "m_serialPort( portName ),"

Я думаю, что порт надо открывать не в конструкторе Sender. Поэтому я сделал отдельную функцию open(): https://github.com/8Observer8/ComPort


Название: Re: QSerialPort. Runtime error
Отправлено: Bepec от Август 27, 2014, 12:22
мдамс. Такой бы энтузиазм да в правильное русло :)