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

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

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Знакомство с последовательным портом  (Прочитано 18941 раз)
Bepec
Гость
« Ответ #15 : Май 27, 2014, 15:00 »

Видимо тебе Hrundel пытался довести до внимания само понятие сигнала.
Что сигнал передаётся в течении некоего времени которое равняется длина сообщения умноженная поделённая на скорость передачи.

И даже "программист" не может этого изменить Веселый Законы физики, увы.
« Последнее редактирование: Май 27, 2014, 16:54 от Bepec » Записан
OKTA
Гость
« Ответ #16 : Май 27, 2014, 15:17 »

Длину умножить на скорость?  Шокированный Может лучше делить?  Смеющийся
Записан
Bepec
Гость
« Ответ #17 : Май 27, 2014, 15:26 »

Таки да, делить Улыбающийся

Хорошо когда есть кому подправить ^^
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


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

Цитировать
На ноутбуке нет COM-портов, поэтому я скачал вот эту программу: ссылка

Эмм.. Как бы софтинка Virtual-Null-Modem не очень удачное решение, даже скажу больше - плохое.
Например, я не смог ее использовать на Win8x32 вообще. При попытке открытия порта любой терминальной прогой (будь то Putty, Termite и прочее), оно нещадно крешилось..
Даже пример Terminal из QtSerialPort крешился, т.к. принимал всякий треш, который по какой-то причине валил после открытия порта..

Поэтому выбрось эту хрень, и попробуй com0com (хотя, сегодня обнаружил, что и эта софтинка имеет касяк), а еще лучше, софт от Eltima Software (триал версию). Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Hrundel
Гость
« Ответ #19 : Май 27, 2014, 16:15 »

Видимо тебе Hrundel пытался довести до внимания само понятие сигнала.

И даже "программист" не может этого изменить Веселый Законы физики, увы.

Именно!
Спасибо Верес.
Записан
8Observer8
Гость
« Ответ #20 : Май 27, 2014, 16:30 »

Я не понял замуту с асинхронными сигналами. Ну да ладно...

kuzulis, спасибо! Очень полезная инфа. Virtual-Null-Modem - тоже триал, так как имеет ограничения на 65 КБ трафика. Буду юзать её, пока не закончится трафик Улыбающийся

А что за косяк с com0com?

Какое ограничение в триал версии это проги: http://www.eltima.com/products/vspdxp/ Если по времени, то сколько?
Записан
Bepec
Гость
« Ответ #21 : Май 27, 2014, 16:55 »

Установи и узнай. А то что-то прям каждое затруднение длиной в целую минуту заставляет тебя писать на форум Веселый
Записан
8Observer8
Гость
« Ответ #22 : Май 27, 2014, 17:46 »

Установи и узнай. А то что-то прям каждое затруднение длиной в целую минуту заставляет тебя писать на форум Веселый
По поводу установки - согласен.

Мне здесь советовали сделать класс Sender. Посмотрите, пожалуйста, всё ли нормально:

Обработчик кнопки:
Код
C++ (Qt)
void Dialog::on_SendPushButton_clicked()
{
   Sender sender( "COM3" );
   QByteArray data;
   data.append( 0x0f0 );
   try {
       sender.send( data );
   } catch( const PortError &e ) {
       QMessageBox::critical( this, "Error", QString( e.what( ) ) );
       return;
   } catch( ... ) {
       QMessageBox::critical( this, "Error", "Error: unknown exception" );
       return;
   }
}
 

Sender.h
Код
C++ (Qt)
#ifndef SENDER_H
#define SENDER_H
 
#include <QString>
#include <QSerialPort>
#include "PortError.h"
 
class Sender {
public:
 
   Sender( QString portName,
           int baudRate = QSerialPort::Baud9600,
           int dataBits = QSerialPort::Data8,
           int parity = QSerialPort::NoParity,
           int stopBits = QSerialPort::OneStop,
           int flowControl = QSerialPort::NoFlowControl ) :
       m_portName( portName ), m_baudRate( baudRate ), m_dataBits( dataBits ),
       m_parity( parity ), m_stopBits( stopBits ), m_flowControl( flowControl )
   {
 
   }
 
   void send( const QByteArray &data ) throw( PortError ) {
       m_serialPort.setPortName( m_portName );
 
       if ( !m_serialPort.open( QIODevice::WriteOnly ) ) {
           throw PortError( m_serialPort.errorString( ).toStdString( ) );
       }
 
       m_serialPort.setBaudRate( QSerialPort::Baud9600 );
       m_serialPort.setDataBits( QSerialPort::Data8 );
       m_serialPort.setParity( QSerialPort::NoParity );
       m_serialPort.setStopBits( QSerialPort::OneStop );
       m_serialPort.setFlowControl( QSerialPort::NoFlowControl );
 
       if ( m_serialPort.write( data ) == -1 ) {
           throw PortError( m_serialPort.errorString( ).toStdString( ) );
       }
   }
 
private:
   QSerialPort m_serialPort;
   QString m_portName;
   int m_baudRate;
   int m_dataBits;
   int m_parity;
   int m_stopBits;
   int m_flowControl;
};
 
#endif // SENDER_H
 

PortError.h
Код
C++ (Qt)
#ifndef PORTERROR_H
#define PORTERROR_H
 
#include <string>
#include <stdexcept>
 
class PortError : public std::runtime_error {
public:
 
   PortError( const std::string &errorText ) : std::runtime_error( "" ) {
       m_message = "Error: " + errorText;
   }
 
   virtual ~PortError( ) throw( ) {
 
   }
 
   virtual const char *what( ) const throw( ) {
       return m_message.c_str( );
   }
 
private:
   std::string m_message;
};
 
#endif // PORTERROR_H
 
Записан
Nidxogg
Гость
« Ответ #23 : Май 27, 2014, 18:00 »

Не удержался
Записан
Bepec
Гость
« Ответ #24 : Май 27, 2014, 18:06 »

Я тебя поддерживаю  Смеющийся
Записан
8Observer8
Гость
« Ответ #25 : Май 27, 2014, 18:17 »

Где я накосячил? Может что забыл? Вроде для отправки ничего больше не нужно. Надо только Receiver ещё написать. Вот там интереснее будет.

P.S. Ну, да, согласен, что это всё примитивно. И настоящий программист делает всё это за пару минут. Но мне приходится учиться на кошках Улыбающийся Пожалуйста, пишите по теме, что именно я забыл в Sender'е?
Записан
Hellraiser
Бывалый
*****
Offline Offline

Сообщений: 451


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

Крайне советую изучить вот эту книгу. А иначе можно еще 100500 постов набить "ниачём", а понимание работы основного механизма Qt - сигналов и слотов (а иначе говоря, обработки событий) не придет. И изучить надо вдумчиво, с разбором как все это работает, а не пролистав всю книгу за денёк-другой. Как-то так...
Записан
8Observer8
Гость
« Ответ #27 : Май 27, 2014, 20:30 »

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

Я сделал Receiver:


Исходники:
Receiver: https://github.com/8Observer8/Receiver
Sender: https://github.com/8Observer8/Sender

P.S. Пожалуйста, посмотрите код. Есть ли в коде какие-нибудь недочёты?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


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

На данный момент ты имеешь "удачу" что твой Sender что-то передает (кстати, благодаря багу, который исправлен в Qt 5.3.1). После обновления на  Qt 5.3.1 у тебя ничо работать не будет (как и в *.nix). Да и что ты все выдумываешь то? Посмотри уже примеры от QtSerialPort... Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
8Observer8
Гость
« Ответ #29 : Май 27, 2014, 21:23 »

А почему не будет? Можно чуть подробнее?
Записан
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


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