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

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

Страниц: 1 2 [3]   Вниз
  Печать  
Автор Тема: Трудность с библиотекой QSerialDevice  (Прочитано 19065 раз)
Piknik
Гость
« Ответ #30 : Март 28, 2012, 08:04 »

Нет, странно не то, что по частям, а то, что полностью не доходит пакет, если добавить функцию чтения readAll().

Попробовал прогой guiapp. Тупо шлю ей посылки в 10байт. Если слать с интервалом в 4 сек, то приложение Гуиапп грузит проц на 99 % периодически, если слать быстрее с интервалом в 20мс, то максимум на 78 %. Это нормально?
« Последнее редактирование: Март 28, 2012, 09:33 от Piknik » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #31 : Март 28, 2012, 09:46 »

Цитировать
Это нормально?
А я и сам не знаю. Надо тестировать и т.п.
В QSerialDevice 2.0 не очень хорошо реализована подсистема I/O,
планирую ее подрихтовать в QtSerialPort.
Но сейчас на это пока нет времени.

На крайняк используй то что есть, или QextSerialPort от Debao (имя китайца,
который тоже немного подрихтовал QextSerialPort ). Там, на гуглокоде найдешь. Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Piknik
Гость
« Ответ #32 : Март 28, 2012, 10:18 »

Попробовал тестовую прогу "uartassistant"  на QextSerial... не более 10% грузит...
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #33 : Март 28, 2012, 16:48 »

Вроде разобрался в чем было дело.

Касяк появляется всегда просто после закрытия порта (например просто открыли, а потом закрыли).
После закрытия загрузка CPU растет до 33%.

Для временного решения необходимо в serialportengine_win.cpp в конструкторе
WinSerialPortEngine написать:
Код
C++ (Qt)
   , m_currentMask(0)
   , m_desiredMask(0)
 

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

После этого у меня все работает с загрузкой CPU = 0% Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Piknik
Гость
« Ответ #34 : Март 29, 2012, 08:44 »

У меня есть только файл "serialportengine_p_win.cpp" . Имелся ввиду он?
Вот конструктор, добавил. m_currentMask(0) там было до меня. А m_desiredMask(0), где объявлена? не находит...
Код:
WinSerialPortEngine::WinSerialPortEngine(SerialPortPrivate *parent)
    : m_descriptor(INVALID_HANDLE_VALUE)
    , m_flagErrorFromCommEvent(false)
    , m_currentMask(0)
    , m_desiredMask(0)
    , m_setMask(EV_ERR)
    #if defined (Q_OS_WINCE)
    , m_running(true)
    #endif
{
    Q_ASSERT(parent);
    m_parent = parent;

И еще, загрузка проца у меня происходит не только при закрытии...а и при приеме..
« Последнее редактирование: Март 29, 2012, 08:46 от Piknik » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #35 : Март 29, 2012, 09:53 »

Цитировать
Имелся ввиду он?
Да

Цитировать
А m_desiredMask(0), где объявлена?
Упс, я уже в QtSerialPort поменял названия переменных.

В QSerialDevice эта переменная называется m_setMask и нужно писать
Код
C++ (Qt)
m_setMask(0)

Цитировать
И еще, загрузка проца у меня происходит не только при закрытии...а и при приеме..
Ну, может быть все по той же причине. Попробуй исправь как я предлагаю, и посмотри что получится Улыбающийся

UPD: Хотя я проверял на Qt5 для QtSerialPort .
« Последнее редактирование: Март 29, 2012, 09:54 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Piknik
Гость
« Ответ #36 : Март 29, 2012, 10:01 »

Нашел какой момент грузит так сильно проц, у меня посылка не доходит целиком. То есть пришла часть, делаешь запрос второй посылки, приходит оставшаяся (от предыдущей) и новая... Попробовал сделать через QTimer. В таком случае все отлично, проц не грузится совсем, но подскажите, как убрать вот это:
Код:
void MyMainWindow::receiveLetter()
{
    uint8_t num = myPortCom->bytesAvailable();     
    qDebug() << "Bytes_Available:" << num;
    myPortCom->readAll();
}

void MyMainWindow::serialDataReady()
{       
        timer.singleShot(2000,this,SLOT(receiveLetter()));
}

В дебаге:
Код:
Bytes_Available: 10 
Bytes_Available: 0
Bytes_Available: 0
Bytes_Available: 0
Bytes_Available: 0
Bytes_Available: 0
Bytes_Available: 0
Bytes_Available: 0
Bytes_Available: 0
Bytes_Available: 0
те, чтобы заходил в :receiveLetter() один раз, а не 10. Пробовал флаг выставлять..не помогло что-то..

ПС. изменения в конструкторе похоже ни к чему не привели
« Последнее редактирование: Март 29, 2012, 10:12 от Piknik » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #37 : Март 29, 2012, 10:16 »

Цитировать
те, чтобы заходил в :receiveLetter() один раз, а не 10. Пробовал флаг выставлять..не помогло что-то..

Я тебе выше дал ссылку где показано как принимать данные.

Цитировать
ПС. изменения в конструкторе похоже ни к чему не привели
Ну неправда же Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Piknik
Гость
« Ответ #38 : Март 29, 2012, 10:29 »

Пример нашел кажись)  Кстати , пробовал менять readAll() на read(num), в таком случае все данные одной посылки приходят только в ней...но как и прежде в ждущем режиме(т.е. когда ничего не шлется-не принимается) загрузка почти 99% и прога из процессов только вручную удаляется.  Странно, хотелось с этим разобраться...но похоже придется через таймер делать..
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #39 : Март 29, 2012, 10:39 »

У меня ничего не грузится на 90% без таймеров и пр...
везде 0%

Win7 x64, Qt5, QtSerialPort  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
bekor
Гость
« Ответ #40 : Март 29, 2012, 10:57 »

У меня такая проблема с этой библиотекой
программа посылает запрос на устройство через RS232 а устройство
отвечает пакетом данный 15-20 байт.
Устройство это принимает все пакеты нормально но port1.read(port1.bytesAvailable());
иногда (точнее очень часто, скажем 35 пакетов из 100 не принимаются) не читает ответный пакет и данные часто теряются
(устройство 100 процентно отвечает проверено)

Код:
dn=ui->PortSelect->currentText();
        port1.setDeviceName(dn);
        if(!port1.open(AbstractSerial::ReadWrite | AbstractSerial::Unbuffered))
            ui->portmsglabel->setText("Error opening port !");
        else
        {
            port1.setBaudRate(AbstractSerial::BaudRate115200);
            port1.setDataBits(AbstractSerial::DataBits8);
            port1.setParity(AbstractSerial::ParityNone);
            port1.setStopBits(AbstractSerial::StopBits1);
            port1.setFlowControl(AbstractSerial::FlowControlOff);
            //port1.setTotalReadConstantTimeout(500);
            //port1.setCharIntervalTimeout(50000);
            ui->portmsglabel->setText("Port successfully opened");
        }

Код:
if(port1.waitForReadyRead(25))
          {
              buff_q=port1.read(port1.bytesAvailable());
              receivedBytesCount=buff_q.size();
          }
          else
{
    ....
}
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #41 : Март 29, 2012, 11:12 »

2 bekor,

1. используй версию 2.0. http://qt-apps.org/content/show.php/QSerialDevice?content=112039
2. не используй waitForReadyRead(), используй сигналы.
3. как принимать данные я дал ссылку выше!  Злой
Записан

ArchLinux x86_64 / Win10 64 bit
bekor
Гость
« Ответ #42 : Март 29, 2012, 15:16 »

перешел на версию 2.0
в место waitForReadyRead() сделал так
Код:
connect(&port1,SIGNAL(readyRead()),this,SLOT(checkAvailable()));
ситуация не изменилась
порт просто напросто не принимает пакеты иногда,
вот сканировал комуникацию прогой Advanced Serial Port Monitor
желтые поля запрос от qt приложения а белые поля ответ от ведомого устройства.
там хорошо видно что после 7-мого запроса не принят ответный пакет и дак далее
« Последнее редактирование: Март 29, 2012, 15:19 от bekor » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #43 : Март 29, 2012, 15:56 »

Вообще-то это твое у-во после 7-го запроса не ответило, а не библиотека не приняла ответ!

Если бы у-во ответило, то оно отправило бы по-любому пакет данных в приемный буфер
драйвера порта и по-любому Advanced Serial Port Monitor показал бы тебе эти данные.

Но раз данных от у-ва нет - то их и не было!
Записан

ArchLinux x86_64 / Win10 64 bit
bekor
Гость
« Ответ #44 : Март 29, 2012, 18:30 »

Проблема решена Улыбающийся
причина была в переходнике USB->RS232, китайский дешевый кабель косячил,
поменял на более качественный переходник и теперь ни один запрос не остается без ответа.
Библиотека версии 2.0 однозначно работает лучше чем прежние версии !

Спасибо !!!!!
Записан
Страниц: 1 2 [3]   Вверх
  Печать  
 
Перейти в:  


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