Russian Qt Forum
Ноябрь 24, 2024, 17:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [Решено] QSerialPort. Runtime error  (Прочитано 6604 раз)
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, но как раз в момент её выполнения случается ошибка:



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

Заранее спасибо за помощь!
« Последнее редактирование: Сентябрь 02, 2014, 12:05 от 8Observer8 » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1 : Август 27, 2014, 10:40 »

Что за тип сериал порта используется?
Записан

ArchLinux x86_64 / Win10 64 bit
8Observer8
Гость
« Ответ #2 : Август 27, 2014, 10:45 »

Всмысле? У меня пара виртуальных портов COM1-COM2:
Записан
Bepec
Гость
« Ответ #3 : Август 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 у вас не инициализировано?
Записан
Silver_swift
Гость
« Ответ #4 : Август 27, 2014, 10:50 »

Цитировать
Вас не смущает что m_portName у вас не инициализировано?
m_port создается на стеке.

В Qt 5.2.1 в Linux была такая особенность: сперва надо задать все настройки, потом открыть порт иначе программа падала. Возможно причина в этом.
Записан
8Observer8
Гость
« Ответ #5 : Август 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 была такая особенность: сперва надо задать все настройки, потом открыть порт иначе программа падала. Возможно причина в этом.
Я где-то слышал, что надо сначала открыть, а потом задать настройки. Как всё же правильно то?

А программа работает теперь Улыбающийся
Записан
Bepec
Гость
« Ответ #6 : Август 27, 2014, 11:08 »

Чуть внимательнее надо быть Silver_swift. Тут дублирование переменных с разницами в названиях. А произошло это то ли из-за невнимательности программиста, или же из-за того, что не определился программист какому форматированию следовать.

PS И к тому же контроль ошибок никакой. Отловятся конечно эксепшены, но информацию надо проверять ДО запуска процесса.
Записан
Silver_swift
Гость
« Ответ #7 : Август 27, 2014, 11:10 »

Цитировать
Я где-то слышал, что надо сначала открыть, а потом задать настройки. Как всё же правильно то?

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

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

upd: Опередили Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #8 : Август 27, 2014, 11:19 »

Цитировать
Я где-то слышал, что надо сначала открыть, а потом задать настройки. Как всё же правильно то?

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

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

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

Но проще вообще удалить эту запись (и удалить переменную m_portName) , т.к. порт уже инициализируется именем m_port( portName ),
« Последнее редактирование: Август 27, 2014, 11:22 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
8Observer8
Гость
« Ответ #9 : Август 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
« Последнее редактирование: Август 27, 2014, 11:52 от 8Observer8 » Записан
Bepec
Гость
« Ответ #10 : Август 27, 2014, 12:22 »

мдамс. Такой бы энтузиазм да в правильное русло Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.104 секунд. Запросов: 22.