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

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

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

Сообщений: 2812


Просмотр профиля
« Ответ #1170 : Июнь 02, 2014, 11:15 »

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

ArchLinux x86_64 / Win10 64 bit
Alex_K
Гость
« Ответ #1171 : Июнь 06, 2014, 12:06 »

В общем, Qt и QSerialPort работают везде отлично. Вопрос был в прошивке прибора.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1172 : Июнь 21, 2014, 21:48 »

kuzulis, наткнулся на такую вещь: https://github.com/connectedtable/qeventdispatcher_epoll
Не пробовали тестировать работу QSerialPort через epoll?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1173 : Июнь 29, 2014, 19:10 »

2 Old,

Хм, интересненькая штукенция. Но нет, не пробовал, нет пока времени.

Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1174 : Июль 11, 2014, 06:00 »

Я так и пользуюсь библиотекой от 29.03.2014. Пару дней назад захотел обновить библиотеку в своем проекте. Обновил, работает, но как-то медленно.
Начал разбираться, выяснил что в принимаемых данных содержатся посторонние данные.
Соединил два компьютера перекрестным com кабелем (на одном компьютере linux, на другом windows), запустил blockingmaster, blockingslave, получил на windows посторонние символы в сообщении.
Менял местами blockingmaster и blockingslave, результат тот-же. Проблема в библиотеке именно на windows и только в принимаемых данных.
« Последнее редактирование: Июль 11, 2014, 06:13 от Phoenix » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1175 : Июль 11, 2014, 10:24 »

Не, нет никаких "левых" данных, просто нужно увеичить таймаут в коде BlockingSlave для waitForReadyRead():
Код
C++ (Qt)
//! [7] //! [8]
           // read request
           QByteArray requestData = serial.readAll();
           while (serial.waitForReadyRead(10))
               requestData += serial.readAll();
//! [8] //! [10]
 

где вместо 10 мсек, нарисовать например 50 мсек.

Просто виндовый шедулер некорректно справляется с обработкой событий, т.е. вместо этих 10 мсек он в реальности может возвратить управление через 1 мсек и пр.
Нужно время побольше установить, т.к. реальное разрешение таймера в винде +/- 20-50 мсек. Поэтому делать таймауты менее 50 msec смысле нет вообще.
Конечно, все зависит от многих факторов, не все так просто. Улыбающийся

UPD: Упс, хм.. странно.. все-таки надо проверить.

UPD2: Только что проверил на com0com - все нормально. Скорее всего проблема в маленьком таймауте как написано выше.
« Последнее редактирование: Июль 11, 2014, 13:37 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1176 : Июль 11, 2014, 13:59 »

В моей программе так:
Код:
while (!time.hasExpired(200))
{
   if ( serialPort->waitForReadyRead(30) )
   {
      QByteArray tempbuff = serialPort->readAll();
      ...
      buff.append(tempbuff);
      ...
      //  проверка CRC
      // если все данные получены, то выход из цикла
   }  
}

Данные от устройства библиотека дробит на 2-3 куска, поэтому так сделано. Раньше все работало, а теперь иногда приходят данные с мусором.

Добавлю: в данных от устройства две контрольные суммы CRC, мусор иногда появляется в середине данных. Если мусор в начале, то программа легко от него избавляется, а вот если в середине, то можно только отбросить пакет.
« Последнее редактирование: Июль 11, 2014, 14:08 от Phoenix » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1177 : Июль 11, 2014, 14:05 »

Не может там быть никакого мусора. Неоткуда ему взяться. Проверяйте у себя откуда они берутся и пр..
Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1178 : Июль 11, 2014, 14:09 »

Хорошо, попробую еще поразбираться. Но простая замена библиотеки кардинально меняет работу программы.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1179 : Июль 11, 2014, 15:47 »

Попробуй представить какой-нибудь простой проект который воспроизводит проблему, или какой-нибудь тест.

Например, по этой проблеме я набросал быстрый тест который проверяет корректность переданых и принятых данных.
Можешь попытаться проверить с ним. Или модифицировать его под свои нужды.

Иначе мы не найдем проблему.

UPD: Можно дополнить этот тест тестом производительности. Например, за основу взять тест от QTcpServer. И замерить производительность и прочее.
« Последнее редактирование: Июль 11, 2014, 15:52 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1180 : Июль 12, 2014, 05:53 »

kuzulis, а как этот тест запустить в linux? Делаю так:
Код:
export QTEST_SERIALPORT_RECEIVER=ttyS0 
export QTEST_SERIALPORT_SENDER=ttyS0
./tst_qserialport
Выдает такое:
Код:
********* Start testing of tst_QSerialPort *********
Config: Using QTest library 4.8.5, Qt 4.8.5
PASS   : tst_QSerialPort::initTestCase()
FAIL!  : tst_QSerialPort::synchronousLoopbackDataVerificationTest() 'receiverPort.open(QSerialPort::ReadOnly)' returned FALSE. ()
   Loc: [../../../../qt-qtserialport/tests/benchmarks/qserialport/tst_qserialport.cpp(127)]
PASS   : tst_QSerialPort::cleanupTestCase()
Totals: 2 passed, 1 failed, 0 skipped
********* Finished testing of tst_QSerialPort *********

Кажется понял в чем проблема. Нужно использовать два разных порта?
« Последнее редактирование: Июль 12, 2014, 05:59 от Phoenix » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1181 : Июль 12, 2014, 11:09 »

Цитировать
Нужно использовать два разных порта?
Да.
Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1182 : Июль 12, 2014, 11:49 »

Нет у меня два разных порта. Переделал этот тест для одного порта (во вложении), заодно и выяснил в чем у меня проблема.
Я делаю так: while ( serialPort.waitForReadyRead(50) ) {...}
А нужно так: while ( serialPort.bytesAvailable() || serialPort.waitForReadyRead(50) ) {...}

Я думал что если в буфере есть данные, то waitForReadyRead возвращает true, а он возвращает true, если данные пришли во время ожидания.

Добавлено:
Если обе программы (которые на разных компьютерах) одновременно отправляют данные, то тест не проходит. Я это учел в тесте, сделал задержку.
Получается какая-то коллизия. Так и должно быть? Может как-то доработать библиотеку, чтобы работало и в таком режиме?
« Последнее редактирование: Июль 12, 2014, 12:16 от Phoenix » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #1183 : Июль 12, 2014, 12:25 »

Цитировать
Я думал что если в буфере есть данные, то waitForReadyRead возвращает true, а он возвращает true, если данные пришли во время ожидания.

waitForReadyRead() возвратит true только если пришли новые данные, иначе он возвратит false.

Так в документации сказано:
Цитировать
Blocks until new data is available for reading and the readyRead() signal has been emitted, or until msecs milliseconds have passed. If msecs is -1, this function will not time out.
.

Записан

ArchLinux x86_64 / Win10 64 bit
Phoenix
Гость
« Ответ #1184 : Июль 12, 2014, 12:32 »

Так не очень понятно. Вот если бы еще в примерах так было (я про bytesAvailable || waitForReadyRead вместо waitForReadyRead).
Записан
Страниц: 1 ... 77 78 [79] 80 81 ... 88   Вверх
  Печать  
 
Перейти в:  


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