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

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

Страниц: 1 2 3 [4] 5 6 ... 88   Вниз
  Печать  
Автор Тема: Создаю библиотеку для работы с последовательными портами. [УШЕЛ ИЗ ПРОЕКТА].  (Прочитано 752345 раз)
Rcus
Гость
« Ответ #45 : Август 26, 2009, 19:02 »

Эм, говорит что подходящего конструктора нет, а его и правда нет Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #46 : Август 26, 2009, 19:15 »

как нет? а  это:
Код:
AbstractSerialEngine::AbstractSerialEngine(QObject *parent)
: QObject(parent), d_ptr(new AbstractSerialEnginePrivate)
{
}

Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #47 : Август 26, 2009, 19:21 »

Цитировать
nativeserialengine.cpp:13: ошибка: нет подходящей функции для вызова ‘AbstractSerialEngine::AbstractSerialEngine(NativeSerialEnginePrivate&, QObject*&)
Так прочитайте внимательней. В nativeserialengine.cpp:13 вы вызываете конструктор с двумя параметрами, а в AbstractSerialEngine только один конструктор и тот с одним параметром.

Эх, чувствую буду завтра оборачивать boost::asio::serial_port в cute интерфейс Улыбающийся
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #48 : Август 26, 2009, 19:32 »

все равно не понимаю:
Код:
AbstractSerialEngine::AbstractSerialEngine(QObject *parent)
: QObject(parent), d_ptr(new AbstractSerialEnginePrivate)
{
}

NativeSerialEngine::NativeSerialEngine(QObject *parent)
: AbstractSerialEngine(*new NativeSerialEnginePrivate(), parent)
{
}

вот напримет в примере из сайта КДЕ так было:
Код:
/*** KFooBase ***/
KFooBase::KFooBase(QObject *parent)
    : QObject(parent), d_ptr(new KFooBasePrivate)
{
}
 
/*** KFooDerived ***/
KFooDerived::KFooDerived(QObject *parent)
    : KFooBase(*new KFooDerivedPrivate, parent)
{
}

у меня ничем не отличается от примера (в принципе), тем более, что если следовать примеру и сделать простенькие тестовые классы - то они собираются  нормально, а мой проект не хочет! Я не пойму..
« Последнее редактирование: Август 26, 2009, 19:34 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #49 : Август 26, 2009, 19:39 »

Код
C++ (Qt)
while (!isEnlightened()) {
 read(http://techbase.kde.org/Policies/Library_Code_Policy/Shared_D-Pointer_Example);
}
Простите, я не верю в подобную невнимательность. В примере для KFooBase определяются два конструктора.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #50 : Август 26, 2009, 19:46 »

так Вы ж говорили (или не вы) - что конструктор из секции protected можно не писать Улыбающийся
я и не писал
Записан

ArchLinux x86_64 / Win10 64 bit
Rcus
Гость
« Ответ #51 : Август 26, 2009, 19:49 »

d'oh если мой русский настолько запутан, то, чувствую мой код невозможно читать /* и некому, но это уже факт Грустный */
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #52 : Август 31, 2009, 21:18 »

Итак, вроде-бы готова (я её добил) тестовая версия библиотеки для Windows!!! Улыбающийся

При её тестировании необходимо иметь из девайсов:
1. Если нет в компе СОМ портов - то нужен конвертер USB<->RS-232
2. Нужен "кросс" кабель у которого контакты так должны быть (по минимуму):
   Разъем №1   Разъем №2
        2                  3
        3                  2
        5                  5
(если не ошибаюсь)

Также для тестирования можно пользоваться тестовыми утилитками : /examples/writer   /examples/reader (или /examples/sreader)

утилитка /examples/sreader использует цикл сообщений (т.е. сигналы) Улыбающийся

Что реализовано:
1. Теперь РЕАЛЬНО поддерживается ЦИКЛ ОБРАБОТКИ СООБЩЕНИЙ!!! ( работает пока только для сигнала readyRead() )

Что непонятно еще:
1. Проверьте кто-нибудь, правильно ли емиттится сигнал readyRead при использовании /examples/sreader
Имею ввиду, что например при приеме пакета данных в порт - сигнал эмиттится несколько раз., причем количество емитов каждый раз разное. А как реально должно быть? Подскажите на примере сокетов плз.. как там с этим дело обстоит, чтобы я мог исправить если что...

Пример использования:
1. Запускаю /examples/writer
2. Указываю имя порта который нужно открыть на запись
3. Далее ввожу какое кол-во байт нужно отправить в порт
4. Жмакаю энтер и данные уходят!

5. Запускаю /examples/sreader
6. Открывается ПО УМОЛЧАНИЮ ПОРТ СОМ1 !!!! Внимание !! Улыбающийся

7. Теперь соединаю шнурком оба порта
8. в /examples/writer жмакаю отправить 10 байт (к примеру)

9. утилита /examples/sreader реагирует и выдает сигналы readyRead!!! Но в моем случае количество этих сигналов варьируется. И я не знаю как ДОЛЖНО быть по НОРМАЛЬНОМУ!!! Подскажите плз!

Жду комментов Улыбающийся

ЗЫ: еще пилить и пилить
« Последнее редактирование: Июнь 28, 2011, 14:38 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
yesrus
Гость
« Ответ #53 : Сентябрь 07, 2009, 21:38 »

Здравствуйте! Очень интересна Ваша библиотека, подскажите пожалуйста начинающему как установить Parity и остальные параметры вручную ? т.е. есть Mydevice объект, как с помощью setParity установить парити в parity_even к  примеру ? Так же интересно как считывать данные из порта по сигналу readyRead()-набросайте пожалуйста маленький примерчик, если не сложно.(я так понимаю в слоте редирид нужно запрашивать bytesAvailable и потом вызывать read с размером полученным из bytesAvailable так ? ) Как вообще можно считывать все данные находящиеся в буфере порта при каждом вызове readyRead ?
Заранее спасибо!
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #54 : Сентябрь 07, 2009, 22:41 »

Цитировать
Очень интересна Ваша библиотека, подскажите пожалуйста начинающему как установить Parity и остальные параметры вручную ?
1. Необходимо сначала устройство открыть (оно откроется с параметрами 9600 8N1 по умолчанию) Так задумано Улыбающийся
Код:
...
MyDevice->open(QIODevice::ReadOnly | QIODevice::Unbuffered);
...
2. Потом установить паритет (к примеру even)
Код:
...
MyDevice->setParity(AbstractSerial::ParityEven);
...

Цитировать
Так же интересно как считывать данные из порта по сигналу readyRead()-набросайте пожалуйста маленький примерчик, если не сложно.

Примерчик
Код:
class Reader : public QObject
{
Q_OBJECT

public:
Reader(QObject *parent = 0) {
MyDevice = new AbstractSerial();
connect(MyDevice, SIGNAL(readyRead()), this, SLOT(slotReadData()));
if (!MyDevice->open(QIODevice::ReadOnly | QIODevice::Unbuffered)) {
qDebug() << "Open fail";
return;
}
                if (!MyDevice->setParity(AbstractSerial::ParityEven)) {
qDebug() << "Set parity fail";
return;
                }

qDebug() << "= Parameters =";
qDebug() << "Device name            : " << MyDevice->deviceName();
qDebug() << "Baud rate              : " << MyDevice->baudRate();
qDebug() << "Data bits              : " << MyDevice->dataBits();
qDebug() << "Parity                 : " << MyDevice->parity();
qDebug() << "Stop bits              : " << MyDevice->stopBits();
qDebug() << "Flow                   : " << MyDevice->flowControl();
qDebug() << "Char timeout, msec     : " << MyDevice->charIntervalTimeout();
}
~Reader() {
MyDevice->close();
delete MyDevice;
MyDevice = 0;
}
private slots:
void slotReadData() {
                QByteArray ba = MyDevice->read(10);
                qDebug() << "Readed " << ba.size() << "bytes";
        }
private:
AbstractSerial *MyDevice;
};
вот как то так. (в теории должно работать)

Цитировать
(я так понимаю в слоте редирид нужно запрашивать bytesAvailable и потом вызывать read с размером полученным из bytesAvailable так ? )
нет, в данной библиотеке не нужно! Идея в том, функция readData реализована таким образом, что она сама все вычитает что нужно (т.е внутри неё уже все реализовано)
т.е сам процесс чтения зависит от того что вам нужно... к примеру у Вас имеется некий протокол обмена через RS-232/485/422 (а может и не имеется - не важно),
и Вы точно знаете , что Вам в порт должен придти пакет размером ну скажем 250 байт - тогда по сигналу readyRead() Вы просто читаете все 250 байт...
если же вы не знаете сколько вам байт должно придти - то читаете или по одному или еще как нибудь - не важно Улыбающийся
главное выставить правильно параметр charIntervalTimeout (опытным путем - но вообще он зависит от скорости)

Хотя, если обрисуете ситуацию, что вы хотите - то я более точнее отвечу...

Цитировать
Как вообще можно считывать все данные находящиеся в буфере порта при каждом вызове readyRead ?
ну вызывать метод read()  по сигналу readyRead().
суть здесь такова, что :
1. сигнал будет излучаться один раз при приходе первого байта и молчать при приходе остальных
2. если пришли  например в буфер 100 байт , мы вызвали метод чтения и прочитали 90 байт (осталось 10) - то сигнал вызовется еще раз, т.к. в порту еще есть 10 байт..
в общем вот такая вкратце логика работы

Я сейчас допиливаю "новую " версию библиотеки, я ее прикрепил в аттач... она вро-де как уже удовлетворительно работает и под *.nix и windows, осталось кое что подправить и т.п.  Возьмите её, желательно, т.к. она самая свежая на сегодня Улыбающийся

ЗЫ: хотя нужно тестить.. времени нету.. и кстати, потестите заодно Улыбающийся
« Последнее редактирование: Июнь 28, 2011, 14:39 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
yesrus
Гость
« Ответ #55 : Сентябрь 07, 2009, 23:07 »

Вообщем описание моей проблемы- есть устройство которое общается с машиной по шине ibus, параметры - 9600, 8 бит данных, parity even, 1 stop bit.
Все устройства машины постоянно читают\пишут в нее...мне нужно соответственно отслеживать некоторые сообщения и посылать ответы на них. Пробовал использовать qt_comport который является дополнением проекта qext... в результате столкнулся с проблемой-бесследно пропадает часть информации и из-за этого часть выжных команд не обрабатывается...даже примерно не могу предположить в чем может быть проблема. Поэтому решил попробовать Вашу библиотеку.
Не могли бы Вы более подробно рассказать про charIntervalTimeout  ? Что это и для чего...
Так же интересно про ready read- Вы написали
Цитировать
если же вы не знаете сколько вам байт должно придти - то читаете или по одному или еще как нибудь
- как можно прочитать всю информацию находящуюся в данный момент в буфере ? Попробую завтра новую версию (впринципе если будет так же информация пропадать-это будет сразу видно)
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #56 : Сентябрь 07, 2009, 23:49 »

>>даже примерно не могу предположить в чем может быть проблема.
Скорее всего из-за неакуратной работы с данными типа QByteArray, большенство функций считает, что код 0x00 - конец данных (нуль-терминированная строка)
Записан

Юра.
yesrus
Гость
« Ответ #57 : Сентябрь 07, 2009, 23:53 »

В qt_comport все данные как массив char передаются, QByteArray вообще не используется.
Вот кусок кода - это происходит с данными сразу после получения:

Код
C++ (Qt)
QString MainWindow::transformInpData(const unsigned char *data, int size)
{
const QString tab = "  ";
QString res;
for (int i = 0;i < size;i++)
res = res+QString("%1").arg((int)data[i],0,16)+tab;
return res;
}
Код нужен для перевода данных в hex формат.

Кстати забыл добавить...данные пропадают не всегда т.е. к примеру получаем две команды какие-либо...потом еще кучу команд...и потом опять такие же как первые 2 должны быть....первый раз я вижу первые 2 команды..а в конце их нет, то что они были посланы это 100% - другой программой я могу увидеть их...не видно только из программы написаной на qt.
« Последнее редактирование: Сентябрь 07, 2009, 23:57 от yesrus » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #58 : Сентябрь 08, 2009, 00:41 »

Цитировать
Вообщем описание моей проблемы- есть устройство которое общается с машиной по шине ibus, параметры - 9600, 8 бит данных, parity even, 1 stop bit.
Все устройства машины постоянно читают\пишут в нее...мне нужно соответственно отслеживать некоторые сообщения и посылать ответы на них.

ну так наверное используется же какой-то протокол обмена... т.е в заголовке запроса/ответа в принципе должна содержаться информация о длине пакета (хотя хз - я с ibus не знаком). тут Вам виднее.

Цитировать
Не могли бы Вы более подробно рассказать про charIntervalTimeout  ? Что это и для чего...
тут это "хитрый ход", суть которого в том что после например отлова сигнала readyRead() и вызове метода read(10) происходит в методе следующий алгоритм:
1. делается bytesAvailable
2. если есть байты готовые для чтения - то читается их количество, которое в данный момент есть в приемном буфере
3. это прочитанное кол-во байт сравнивается с изначально запрошенным
4. если равно - то метод возвращает массив и т.п.
5. если прочитали меньше чем запросили - то ожидаем в течении времени charIntervalTimeout следующих символов
6. при истечении времени - возвращает прочитанные до этого байты
7. если время еще не истекло и пришли байты - то переходим к п. 1

Нюанс работы с портом у этой библиотеки в том - что он открывается с асинхронными параметрами - таким образом - что операции чтения возвращаются немедленно!!! Этим мы облегчаем нам жизнь, т.к. отпадает необходимость в настройке множителей, времени ожидания окончания посылки и т.п... , а используем только лишь один "исскуственный" параметр charIntervalTimeout ! (т.к. так проще и меньше "геммороя" при расчете всех этих таймаутов, тем более, что они толком то и не работают реально) - а так - убиваем сразу всех зайцев. При этом - параметр charIntervalTimeout  - НЕ является параметром из COMMTIMEOUTS (win) или termios (*.nix)!!!

Цитировать
как можно прочитать всю информацию находящуюся в данный момент в буфере ?

чтобы прочитать именно ВСЁ то, что в ДАННЫЙ/ТЕКУЩИЙ момент находится в буфере - необходимо сначала вызвать bav = bytesAvailable, а потом уже read(bav)  Улыбающийся

но опять же не факт, что прочитается всё из буфера, т.к. в интервале времени после вызова bytesAvailable,  и до вызова read - в буфер могут придти еще данные - и получится, что вычитается только то что ранее пришло





« Последнее редактирование: Сентябрь 08, 2009, 00:47 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
yesrus
Гость
« Ответ #59 : Сентябрь 08, 2009, 18:35 »

Проверил сегодня последнюю версию-по порядку о проблемах:
1) В примере sreader Вы забыли поправить pro файл- пути старые, в результате пример не комплится без их правки вручную.
2) Пример reader работает, но через скаждую строчку ругается на
Цитировать
Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258
3) Написал маленькую тестовую програмку для проверки редирид-
.h Файл:
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QtGui>
#include <QtCore>
#include <abstractserial.h>
#include "ui_mainwindow.h"
#include <iostream>
 
namespace Ui
{
   class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   MainWindow(QWidget *parent = 0);
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
   AbstractSerial *MyDevice;
   QTextEdit *log;
 
private slots:
   void readmsg();
};
 
#endif // MAINWINDOW_H
.cpp файл:
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>
#include <QtDebug>
 
 
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent), ui(new Ui::MainWindow)
{
   ui->setupUi(this);
   log = new QTextEdit(this);
   log->setReadOnly(true);
   log->setGeometry(10,10,800,500);
   log->setStyleSheet( "font-size: 12px;" );
   log->show();
       MyDevice = new AbstractSerial();
               connect(MyDevice, SIGNAL(readyRead()), this, SLOT(readmsg()));
                   MyDevice->setDeviceName("com4");
 
if (!MyDevice->open(QIODevice::ReadOnly | QIODevice::Unbuffered)) {
                       qDebug() << "Open fail";
                       return;
               }
if (!MyDevice->setParity(AbstractSerial::ParityEven)) {
                       qDebug() << "Set parity fail";
                       return;
               }
               qDebug() << "= Defaults parameters =";
               qDebug() << "Device name            : " << MyDevice->deviceName();
               qDebug() << "Baud rate              : " << MyDevice->baudRate();
               qDebug() << "Data bits              : " << MyDevice->dataBits();
               qDebug() << "Parity                 : " << MyDevice->parity();
               qDebug() << "Stop bits              : " << MyDevice->stopBits();
               qDebug() << "Flow                   : " << MyDevice->flowControl();
               qDebug() << "Char timeout, msec     : " << MyDevice->charIntervalTimeout();
 
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::readmsg() {
   qDebug() << "test1";
   QString test;
QByteArray ba = MyDevice->read(10);
 
               qDebug() << "Readed: " << test;
               log->append("test");
}
Вывод:
Цитировать
Запускается E:\QSerialDevice_07092009_bugs_version_23001\examples\creader\debug\creader.exe...
Windows: NativeSerialEnginePrivate::nativeOpen->Trying to open device:  "com4"
Windows: NativeSerialEnginePrivate::nativeOpen->Opened device succesfully. Ok!
= Defaults parameters =
Device name            :  "com4"
Baud rate              :  "9600 baud"
Data bits              :  "8 bit"
Parity                 :  "Even"
Stop bits              :  "1"
Flow                   :  "Disable"
Char timeout, msec     :  50
test1
Windows: NativeSerialEnginePrivate::nativeSelect->function WaitForSingleObject returned WAIT_TIMEOUT :  258 . Warning!
Readed:  ""

Программа была запущена примерно 30 сек...после первого редирида больше ничего не делала...хотя данные идут по 2-5 сообщений в секунду.
« Последнее редактирование: Сентябрь 08, 2009, 19:08 от yesrus » Записан
Страниц: 1 2 3 [4] 5 6 ... 88   Вверх
  Печать  
 
Перейти в:  


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