Чтение из порта при помощи QSerialPort |
Здравствуйте, гость ( Вход | Регистрация )
Чтение из порта при помощи QSerialPort |
borune |
20.11.2015, 16:04
Сообщение
#1
|
Участник Группа: Участник Сообщений: 152 Регистрация: 1.1.2011 Пользователь №: 2314 Спасибо сказали: 0 раз(а) Репутация: 0 |
День добрый, господа.
Вопрос такой. Есть порт с перемычкой между TxD и RxD. Пишу в порт данные и читаю их же. Использую QtSerialPort в полной аналогии с примером (terminal example). Проблема заключается в чтении данных. Есть слот, приконнекченный к сигналу readyRead() объекта. Когда в порте появляются данные, этот слот вызывается всякий раз, когда размер этих данных равен 8 Байтам. Например, если размер считываемых данных составляет 14 Байт, слот вызывается 2 раза, если 27 Байт - 4 раза, 248 Байт - 31 раз. Т.е. порт ведет себя так, как будто бы размер буфера равен 8. Суть проблемы в том, что из-за вышеперечисленного невозможно отследить момент, когда все доступные данные считаны из порта: Раскрывающийся текст
UPD Если добавить небольшой лок перед чтением, т.е. Раскрывающийся текст
Я ничего не понимаю. Сообщение отредактировал borune - 20.11.2015, 16:42 |
|
|
Litkevich Yuriy |
20.11.2015, 18:28
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
условие if(serial->bytesAvailable()==0) по непонятной для меня причине оказывается верно Всё верно, ты их строкой выше все вычитал (а остальное ещё не пришло, если вообще должно было).т.е. метод QtSerialPort ::bytesAvailable() обязан вернуть столько же сколько вернёт QtSerialPort ::readAll().size() Обычно используют либо таймаут по приёму, либо управление потоком (неважно каким, например, передавая сигнальные/флаговые байты в начале и конце посылки) |
|
|
borune |
21.11.2015, 23:52
Сообщение
#3
|
Участник Группа: Участник Сообщений: 152 Регистрация: 1.1.2011 Пользователь №: 2314 Спасибо сказали: 0 раз(а) Репутация: 0 |
Ну все равно непонятно. Я же данные посылаю за раз. Логично предположить, что и приходить они должны разом, а не кусками. Насчёт условия да, вы правы, но вопросы все равно остаются. Главный из них это как заставить порт читать не кусками по 8 байт, а сразу все? WaitForReadyRead() не помогает..
Сообщение отредактировал borune - 21.11.2015, 23:54 |
|
|
Iron Bug |
22.11.2015, 10:43
Сообщение
#4
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
8 байт - FIFO буффер COM порта. когда он заполняется, вызывается аппаратное прерывание, которое получает система и система уже дёргает юзерские коллбэки.
в принципе, размер буффера бывает 1,4,8 или 14 байт. видимо, в данном случае их 8. это совершенно нормально. в железе данные всегда режутся на куски и потом на другой стороне склеиваются. определение конца пакета - это уже более верхний уровень, о котором COM-порт ничего не знает. он передаёт байты. накручивай хэдер и длину пакета (можно ещё CRC для контроля целостности) в свои пакеты и разгребай поток с порта. |
|
|
Текстовая версия | Сейчас: 26.11.2024, 0:25 |