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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: Знакомство с последовательным портом  (Прочитано 19167 раз)
8Observer8
Гость
« : Май 27, 2014, 12:16 »

Привет!

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

Опишу ситуацию подробнее. На ноутбуке нет COM-портов, поэтому я скачал вот эту программу: ссылка  Она позволяет создать два виртуальных COM-порта и замкнуть их, то есть если одна программа пишет в один порт, например в COM7, то другая может прочитать, к примеру, из COM8.

Как я понимаю, что если я записал данные в порт, то они там будут лежать пока из не считают. Если просто писать в порт, то после переполнения буфера - первые данные будут исчезать.

Я создал два замкнутых виртуальных порта: COM7 и COML8. И написал две короткие программки.

Первая программа у меня настраивает порт COM7 и записывает в него данные по клику по кнопке:
Код
C++ (Qt)
void Dialog::on_SendPushButton_clicked()
{
   // Set serial port
   QSerialPort transmitter;
   transmitter.setPortName( ui->PortNumOfTransmitterComboBox->currentText( ) );
   transmitter.setBaudRate( QSerialPort::Baud9600 );
   transmitter.setDataBits( QSerialPort::Data8 );
   transmitter.setParity( QSerialPort::NoParity );
   transmitter.setStopBits( QSerialPort::OneStop );
   transmitter.setFlowControl( QSerialPort::NoFlowControl );
 
   // Open serial port
   if ( !transmitter.open( QIODevice::WriteOnly ) ) {
       QMessageBox::critical( this, "Error", transmitter.errorString() );
       return;
   }
 
   // Write data to the port
   QByteArray data;
   data.append( 0x0f0 );
   transmitter.write(data);
}


Вторая программа - настраивает порт COM8, считывает данные и выводит на экран:
Код
C++ (Qt)
void Dialog::on_GetPushButton_clicked( )
{
   // Set serial port
   QSerialPort receiver;
   receiver.setPortName( ui->PortNumOfReceiverComboBox->currentText( ) );
   receiver.setBaudRate( QSerialPort::Baud9600 );
   receiver.setDataBits( QSerialPort::Data8 );
   receiver.setFlowControl( QSerialPort::NoFlowControl );
   receiver.setStopBits( QSerialPort::OneStop );
   receiver.setParity( QSerialPort::NoParity );
 
   // Open serial port
   if ( !receiver.open( QIODevice::ReadOnly ) ) {
       QMessageBox::critical( this, "Error", receiver.errorString( ) );
       return;
   }
 
   // Read data from serial port
   QByteArray data;
   data = receiver.readAll( );
 
   qDebug() << data.toHex( );
}

Но данные не выводятся. Заранее спасибо за помощь!
« Последнее редактирование: Май 27, 2014, 12:28 от 8Observer8 » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #1 : Май 27, 2014, 12:21 »

Я так понимаю, что желания ознакомится с примерами из комплекта QSerialPort нет никакого?
Записан
8Observer8
Гость
« Ответ #2 : Май 27, 2014, 12:27 »

Я смотрел. Сложно там. Ничего не понял. Ещё посмотрю. Мне бы попроще. Почему данные в моём примере не читаются?
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #3 : Май 27, 2014, 12:29 »

И это пишет человек со статусом "Программист"? :FACEPALM:
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #4 : Май 27, 2014, 12:30 »

И это пишет человек со статусом "Программист"? :FACEPALM:

Эти статусы определяют количество написанных сообщений, а не знания и опыт Улыбающийся
Записан

Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #5 : Май 27, 2014, 12:30 »

Может, для начала, стоит понять, что COM-порт по природе своей асинхронное устройство и "вот так вот сразу" ничего не выдаст?
Записан
8Observer8
Гость
« Ответ #6 : Май 27, 2014, 12:39 »

Может надо как-то заставить вторую программу "слушать" порт? Как это сделать?

"асинхронное устройство" говорит о том, что есть буфер? То есть необязательно соединение "точка-точка"? К чему Вы клоните?
« Последнее редактирование: Май 27, 2014, 12:47 от 8Observer8 » Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


Просмотр профиля
« Ответ #7 : Май 27, 2014, 12:47 »

Ну понятно - для кого-то слова "асинхронный", "обработка событий" похоже ничего не говорят. Заканчиваю писать в тему - это просто бессмысленно.
Записан
8Observer8
Гость
« Ответ #8 : Май 27, 2014, 12:56 »

Ничего не понимаю. С помощью COMTester данные читаются. Добавил строку для ожидания данных в приёмнике:
Код
C++ (Qt)
   // Read data from serial port
   QByteArray data;
   data = receiver.readAll( );
 
   receiver.waitForReadyRead( -1 );
 
   qDebug() << data.toHex( );
 

Всё равно пусто.
« Последнее редактирование: Май 27, 2014, 13:01 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #9 : Май 27, 2014, 12:59 »

А понял, надо читать после ожидания Улыбающийся

Код
C++ (Qt)
   // Read data from serial port
   QByteArray data;
 
   receiver.waitForReadyRead( -1 );
 
   data = receiver.readAll( );
 
   qDebug() << data.toHex( );
 
« Последнее редактирование: Май 27, 2014, 13:02 от 8Observer8 » Записан
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #10 : Май 27, 2014, 13:02 »

Пипец. Кроме флуда ничего не умеем, что ли? Делаешь ресивер и сендер экземплярами класса, оба открываешь (Важно!!! Все настройки порта (чётность, скорость) только после открытия!!!), коннектишь сигнал ридера readyRead co слотом - и там уже читаешь данные. Пипец проблема. Шокированный
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
Kurles
Бывалый
*****
Offline Offline

Сообщений: 480



Просмотр профиля
« Ответ #11 : Май 27, 2014, 13:03 »

А понял, надо читать после ожидания Улыбающийся
Qt - асинаронный фреймворк, нефиг в гуишных потоках вообще чего то ждать. Сигналы и таймеры на это есть.
Записан

Код
C++ (Qt)
while(!asleep()) sheep++;
8Observer8
Гость
« Ответ #12 : Май 27, 2014, 13:05 »

Kurles, спасибо! Очень много полезной инфы и всё по делу Улыбающийся
Записан
Hrundel
Гость
« Ответ #13 : Май 27, 2014, 13:23 »

8Observer8, мне приснилось или ты радио-физику изучал? Вроде понятие о сигнале должно быть?!
Записан
8Observer8
Гость
« Ответ #14 : Май 27, 2014, 14:55 »

Как "понятия о сигнале" влияют на работу с COM-портом, как с программным объектом? Думаю, что знания схемотехники здесь не требуются. Только документация на Qt и принципы ООП. Я спрашивал, как работать с COM-портом с точки зрения программиста.
Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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