Здравствуйте, гость ( Вход | Регистрация )
Iron Bug | Дата 22.11.2015, 10:43 |
8 байт - FIFO буффер COM порта. когда он заполняется, вызывается аппаратное прерывание, которое получает система и система уже дёргает юзерские коллбэки. в принципе, размер буффера бывает 1,4,8 или 14 байт. видимо, в данном случае их 8. это совершенно нормально. в железе данные всегда режутся на куски и потом на другой стороне склеиваются. определение конца пакета - это уже более верхний уровень, о котором COM-порт ничего не знает. он передаёт байты. накручивай хэдер и длину пакета (можно ещё CRC для контроля целостности) в свои пакеты и разгребай поток с порта. |
|
borune | Дата 21.11.2015, 23:52 |
Ну все равно непонятно. Я же данные посылаю за раз. Логично предположить, что и приходить они должны разом, а не кусками. Насчёт условия да, вы правы, но вопросы все равно остаются. Главный из них это как заставить порт читать не кусками по 8 байт, а сразу все? WaitForReadyRead() не помогает.. | |
Litkevich Yuriy | Дата 20.11.2015, 18:28 |
условие if(serial->bytesAvailable()==0) по непонятной для меня причине оказывается верно Всё верно, ты их строкой выше все вычитал (а остальное ещё не пришло, если вообще должно было).т.е. метод QtSerialPort ::bytesAvailable() обязан вернуть столько же сколько вернёт QtSerialPort ::readAll().size() Обычно используют либо таймаут по приёму, либо управление потоком (неважно каким, например, передавая сигнальные/флаговые байты в начале и конце посылки) |
|
borune | Дата 20.11.2015, 16:04 |
День добрый, господа. Вопрос такой. Есть порт с перемычкой между TxD и RxD. Пишу в порт данные и читаю их же. Использую QtSerialPort в полной аналогии с примером (terminal example). Проблема заключается в чтении данных. Есть слот, приконнекченный к сигналу readyRead() объекта. Когда в порте появляются данные, этот слот вызывается всякий раз, когда размер этих данных равен 8 Байтам. Например, если размер считываемых данных составляет 14 Байт, слот вызывается 2 раза, если 27 Байт - 4 раза, 248 Байт - 31 раз. Т.е. порт ведет себя так, как будто бы размер буфера равен 8. Суть проблемы в том, что из-за вышеперечисленного невозможно отследить момент, когда все доступные данные считаны из порта: Раскрывающийся текст
UPD Если добавить небольшой лок перед чтением, т.е. Раскрывающийся текст
Я ничего не понимаю. |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 18.4.2024, 14:29 |