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

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

Страниц: 1 ... 26 27 [28] 29 30 ... 88   Вниз
  Печать  
Автор Тема: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].  (Прочитано 752746 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #405 : Июнь 16, 2011, 11:50 »

Цитата: lit-uriy
всё таки "COM1", "ttyS0" - имена портов, а не устройств.

Порт - устройство, устройство - не порт! Чуишь разницу?
Что, /dev/hda не устройство, а ЖД ?
А в остальном, согласен с тобой! Улыбающийся
Нужно мух отделять от котлет.

Можно на крайняк так:

SerialDeviceInfo::deviceName() - только COM1, ttyS0
SerialDeviceInfo::deviceLocation() - только "\\\\\\\\.\\\\COM10", "/dev/ttyS0"

Чем не угодно то?

Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #406 : Июнь 16, 2011, 11:51 »

Ну зачем так усложнять то?

Можно сделать проще:

SerialDevice::setDeviceName() - только COM1, ttyS0
SerialDevice::setDevice() - только "\\\\\\\\.\\\\COM10", "/dev/ttyS0"

SerialDeviceInfo::deviceName() - только COM1, ttyS0
SerialDeviceInfo::setDevice() - только "\\\\\\\\.\\\\COM10", "/dev/ttyS0"

Каждый метод должен заниматься своим делом!
Не думаю, что это будет сильным упрощением разработчику библиотеки. А вот пользователь будет долго чесать репу, зачем тут два метода.
Итак, мое предложение:
Код
C++ (Qt)
class SerialDeviceInfo;
class SerialDevice
{
//...
public:
//...
  SerialDevice(const QString &device, QObject *parent = 0); //see setDevice(QString);
  SerialDevice(const SerialDeviceInfo &info, QObject *parent = 0);
  void setDevice(const SerialDeviceInfo &info);
  void setDevice(const QString &device); //device may be: "\\\\\\\\.\\\\COM1", "COM1", "/dev/ttyS0", "ttyS0"...
  QString device() const; //returns something like "\\\\\\\\.\\\\COM1", "/dev/ttyS0"...
//...
};
Цитировать
>>Т.к. имена  "COM1", "ttyS0" и есть имена устройств, если судить здраво.
всё таки "COM1", "ttyS0" - имена портов, а не устройств.
Устройства - мобильник, промконтроллер, преобразователь интерфейса, и "стандартный последовательный порт в конце концов"
Именно поэтому я предлагал назвать класс SerialPort... Но меня не поддержали.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #407 : Июнь 16, 2011, 11:51 »

вооще надо накидать пару примеров кода использования библиотеки.
Например два варианта - Консольное и Графическое приложения.
1) в консольном, информация о работе с портами может браться из:
 - а) аргументы командной строки
 - б) конфигурационного файла
 - в) БД
2) в гграфическом - из:
 - а) интерфейса пользователя (комбобоксы и прочее)
 - б) конфигурационного файла
 - в) БД
в комбобоксах она берётся из той же библиотеки.
Записан

Юра.
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #408 : Июнь 16, 2011, 11:52 »

Я бы так сильно не зацикливался на этом этапе.

description(), manufacturer(), pid(), etc большенству пользователей ненужны и я предлагаю пока их опустить.

Оставить лишь:

1) name() -> "COM1", "ttyS0"
2) fullName() -> "\\\\\\\\.\\\\COM10", "/dev/ttyS0"
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #409 : Июнь 16, 2011, 11:53 »

Цитировать
Именно поэтому я предлагал назвать класс SerialPort... Но меня не поддержали.

Я поддерживаю. ТОлько хотел написать по этому поводу, что SerialDevice как-то не то (не передает смысл назначения класса).
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #410 : Июнь 16, 2011, 11:54 »

>>Чем не угодно то?
мудрёностью и неоднозначностью.
Сравни с таким вариантом:
Код
C++ (Qt)
port->name = "COM24", "ttyS45"
port->fileName = "\\\\\\\\.\\\\COM24", "/dev/ttyS45"
port->deviceName = "FTDI serial USB converter", "Prolific USB-to-Serial Comm Port (COM4)"
Записан

Юра.
b-s-a
Гость
« Ответ #411 : Июнь 16, 2011, 12:02 »

Код
C++ (Qt)
QList<SerialDeviceInfo> ports = SerialDeviceInfo::availableDevices();
//SerialDevice *port = new SerialDevice(ports[0], this);
//SerialDevice *port = new SerialDevice("COM1", this);
SerialDevice *port = new SerialDevice("/dev/ttyS0", this);
port->open();
port->setBaudRate(SerialDevice::Baud15200);
port->setParity(SerialDevice::NoParity);
port->setStopBits(SerialDevice::OneStop);
port->setDataErrorPolicy(SerialDevice::SkipPolicy);
//...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #412 : Июнь 16, 2011, 12:14 »

Цитата: b-s-a
Именно поэтому я предлагал назвать класс SerialPort... Но меня не поддержали.
Для этого нужно заводить новый репозитарий и т.п. Начинать всё с нуля.
И те пользователи, которые привыкли к QSerialDevice, QextSerialPort и т.п. будут в непонятках.
А тем более, будут в непонятках те, кто до этого использовали QSerialPort от Ибица Лабс!
И туева хуча зоопарков не есть хорошо.

Цитата: b-s-a
Код
C++ (Qt)
...
QString device() const; //returns something like "\\\\\\\\.\\\\COM1", "/dev/ttyS0"...
...
 
Ага, если мы установили "ttyS0", то оно нам покажет  "/dev/ttyS0" ? Как-то некошерно.
Установили одно, а показывает другое?

Для SerialDevice
Нужно жестко определится с форматом имени устройства для установки, я против такого разнообразия,
я только за установку имен типа:  COM1, ttyS0 ()
И метод для этого использовать только один: SerialDevice::setDeviceName(ttyS0) !
Также, естественно, приняв новые методы и новый конструктор от b-s-a.

Цитата: pastor
Я поддерживаю. ТОлько хотел написать по этому поводу, что SerialDevice как-то не то (не передает смысл назначения класса).
Блин, поймите, что открываем мы в конце то концов и работаем с устройством, как бы оно не называлось: serial port, game port, usb и т.п.
То, не то, но уже свободные имена забиты и позняк метаться (я б и сам бы назвал SerialPort, но уже до нас всё так поназывали и будет путаница).

>>Чем не угодно то?
мудрёностью и неоднозначностью.
Сравни с таким вариантом:
Код
C++ (Qt)
port->name = "COM24", "ttyS45"
port->fileName = "\\\\\\\\.\\\\COM24", "/dev/ttyS45"
port->deviceName = "FTDI serial USB converter", "Prolific USB-to-Serial Comm Port (COM4)"

для SerialDeviceInfo
А я к примеру так бы поменял:
Код
C++ (Qt)
SerialDeviceInfo::deviceName() = "COM24", "ttyS45"
SerialDeviceInfo::deviceLocation() = "\\\\\\\\.\\\\COM24", "/dev/ttyS45"
SerialDeviceInfo::description()= "FTDI serial USB converter", "Prolific USB-to-Serial Comm Port"
 
Ну или вместо deviceLocation() можно systemLocation()
« Последнее редактирование: Июнь 16, 2011, 12:20 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #413 : Июнь 16, 2011, 12:21 »

Набросок для графического приложения
Код
C++ (Qt)
QComboBox *combo = new QComboBox();
SerialPort *port = new SerialPort();
 
QStringList names = SerialPort::availablePortNames();
combo->addItems(names);
 
connect(combo, SIGNAL(currentIndexChanged(const QString&)),
           this, SLOT(setPortName(const QString&)));
 
This::setPortName(const QString& name)
{
   port->setName(name);
}

аналогично со скоростями и другими параметрами.

« Последнее редактирование: Июнь 16, 2011, 12:23 от lit-uriy » Записан

Юра.
b-s-a
Гость
« Ответ #414 : Июнь 16, 2011, 12:25 »

Цитировать
Для этого нужно заводить новый репозитарий и т.п. Начинать всё с нуля.
Но ты почему-то не стал заводить новый перозиторий для AbstractSerialDevice. Подмигивающий
Цитировать
И те пользователи, которые привыкли к QSerialDevice, QextSerialPort и т.п. будут в непонятках.
От этого класса в любом случаю старые пользователи будут в непонятках. Но никто же не отменяет старые классы!
Цитировать
А тем более, будут в непонятках те, кто до этого использовали QSerialPort от Ибица Лабс!
Я им искренне сочувствую. Видел я интерфейс этого класса, там даже четность установить нельзя, не говоря уж о стопах.
Цитировать
И туева хуча зоопарков не есть хорошо.
В OpenSource это нормально. Пусть библиотека называется QSerialDevice, а класс будет SerialPort.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #415 : Июнь 16, 2011, 12:26 »

>>Пусть библиотека называется QSerialDevice, а класс будет SerialPort.
А к стати, ДА!
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #416 : Июнь 16, 2011, 12:33 »

Цитировать
В OpenSource это нормально. Пусть библиотека называется QSerialDevice, а класс будет SerialPort.
Смеющийся
Во, точно! Это выход. Согласен! Всё дружно переименовываем!

Код
C++ (Qt)
class SerialPort;
class SerialPortInfoPrivate;
 
class SerialPortInfo
{
public:
  SerialPortInfo(); //produces NULL info
  SerialPortInfo(const SerialPortInfo&other); //copy constructor
  explicit SerialPortInfo(const SerialPort &port);
  SerialPortInfo& operator=(const SerialPortInfo&other);
  void swap(SerialPortInfo&other);
 
  QString name() const;  //COM1, ttyS0...
  QString systemLocation() const; //"\\\\\\\\.\\\\COM24", "/dev/ttyS45"
  QString description() const; //"Последовательный порт", "Prolific USB-to-Serial Comm Port", "Motorola Phone (E1 iTunes)"
  QString manufacturer() const; //"(Стандартные порты)", "Prolific Technology Inc."
 
  bool isNull() const;
  bool isBusy() const;
  QList<int> standardBauds() const;
  static QList<SerialPortInfo> availablePorts();
private:
   Q_DECLARE_PRIVATE(SerialPortInfo)
   SerialPortInfoPrivate *d_ptr;
};
 

Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #417 : Июнь 16, 2011, 12:39 »

kuzulis в с 4 именами в SerialPortInfo согласен:
name()
systemLocation()
description()
manufacturer()

А остальные что значат?

И нужны методы предоставляющие информацию для ГУИ (человеко-читаемые списки)
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #418 : Июнь 16, 2011, 12:40 »

>>А остальные что значат?
ХЗ, это к b-s-a  Улыбающийся

Ну типо:
bool isBusy() const - это если порт занят/открыт
bool isNull() const; - это к b-s-a
QList<int> standardBauds() const - это возвращает список скоростей поддерживаемых портом (для каждой ос, и может быть, каждого порта он разный)
т.е. скорее всего этот метод standardBauds() лучше перенести в SerialPortInfo из SerialPort, т.к. SerialPort не должен ничего по идее знать
о других портах. Он должен выполнять только свои функции.

>>И нужны методы предоставляющие информацию для ГУИ (человеко-читаемые списки)
Ну, это врядли одобрят.  Подмигивающий

« Последнее редактирование: Июнь 16, 2011, 12:45 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
b-s-a
Гость
« Ответ #419 : Июнь 16, 2011, 12:47 »

А остальные что значат?
Ты про служебные методы (конструкторы/операторы)? Или про availablePorts() и standardBauds()? Если про последнее, то:
availablePorts() - возвращает список зарегистрированных в системе портов (может переименовать в registeredPorts?)
standardBauds() - возвращает список стандартных для порта скоростей (зависит в первую очередь от ОС).

И нужны методы предоставляющие информацию для ГУИ (человеко-читаемые списки)
Списки чего? Все это можно будет сделать внешними функциями.
Записан
Страниц: 1 ... 26 27 [28] 29 30 ... 88   Вверх
  Печать  
 
Перейти в:  


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