LINUX.ORG.RU

[QSerialPort] чтение блоками


0

2

Есть QSerialPort, подключил это чудо и оно получает правильные данные из порта. Но одна проблема - приходят то 1 байт, то 3 байта, то 7 и т.п., иными словами вразнобой, хотя между посылками по идее у меня паузы 15 мс.

Вопрос: можно ли получать данные берстами? Как называется такой режим?

А что, ничего лучше чем QSerialPort найти не удалось?

Например QSerialDevice (ну или на крайняк QextSerialPort)

И да, берсты (или шо это за хрень такая) - НЕ НУЖНЫ.

kuzulis ★★
()

Йузай буст, ASIO хорошенечко дружит с компортами, по крайней мере у меня подобных проблем не возникало

yoghurt ★★★★★
()

Только POSIX, только хардкор.

можно ли получать данные берстами?

Только так и можно. Ты их так и получаешь.

tailgunner ★★★★★
()
Ответ на: комментарий от mi_estas

я собственно как раз его и использую - как одна и та же бибилотека может быть лучше самой себя? =)

в смысле, у меня уже QSerialPort от inbiza-labs, эта тема как раз о нем

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

вот так я получаю данные из порта - по сигналу, на другой стороне - устройство на базу FPGA, там самодельный UART, в принципе работает не плохо и данные правильные получаются из порта, но я просто хочу поинтересоваться - ведь там есть пауза между посылками, но оно не видит этого, на стороне ПК - pl2303 (USB-COM) - нормально ли это что байты приходят в разнобой?

uart = new TNX::QSerialPort("/dev/ttyUSB0", uart_settings, this);
uart->setCommTimeouts(TNX::QSerialPort::CtScheme_NonBlockingRead);
if(uart->open(QIODevice::ReadOnly))
{
	qDebug() << "port opened";
	connect(uart, SIGNAL(readyRead()), this, SLOT(read()));
}
I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Проблема со всеми этими самопальными^Wнавороченными классами - хрен разберешь, что на самом деле происходит. Если у тебя действительно 15мс между посылками, то обычный poll + read должен успевать вычитывать по одному байту.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

у меня USB-serial преобразователь в этой цепочке, на передающей стороне раз в 20 мс (50 раз в секунду) передается ровно 8 байт из FPGA Spartan-6, приходят байты в с правильными значениями и в правильном порядке, но либо 1 байт за раз, либо 3 либо 7 либо 2 и т.п.

вопрос: нормальное ли это поведение, или я что-то не настроил? по идее данные должны прилетать большим пакетом когда в течение какого-то времени стало понятно что данные больше не идут

пытаюсь понять, это проблема моего usb-serial-а, или qserialport непраивльно настроил, или можно вообще взять другое решение в котором есть нужный мне режим...

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Для начала, сделай чтение на чистом Си, через tcsetattr/poll/read. Если и оно будет давать посылки разной длины, ищ проблему в прошивке.

tailgunner ★★★★★
()
Ответ на: комментарий от yoghurt

> ASIO хорошенечко дружит с компортами

А ещё он весь лежит в заголовочных файлах, никаких -lother_library.

one_more_hokum ★★★
()

А что там с настройками VMIN,VTIME у com-порта?

pathfinder ★★★★
()

И вообще ИМХО правильной программе должно быть по барабану какими кусками приходят данные.

pathfinder ★★★★
()
Ответ на: комментарий от I-Love-Microsoft

> либо 1 байт за раз, либо 3 либо 7 либо 2 и т.п.

по идее данные должны прилетать большим пакетом

Что ты называешь «большим пакетом»? По умолчанию буфер UART16550 - 8 байт, так что ты должен получать от 1 до 8 октетов за раз.

LamerOk ★★★★★
()
Ответ на: комментарий от trex6

> Вот что за мода пошла свои классы мимикрировать под классы библиотеки!

Это священный вендузовый обычай именовать свои классы с той же буквы, с которой именуются библиотечные.

LamerOk ★★★★★
()
Ответ на: комментарий от LamerOk

Что ты называешь «большим пакетом»? По умолчанию буфер UART16550 - 8 байт

Это если у него UART16550, а если у него USB-НЁХ, то там может быть что угодно. Но в целом твоя мысль верна. :)

pathfinder ★★★★
()
Ответ на: комментарий от I-Love-Microsoft

нормально ли это что байты приходят в разнобой

да.

mi_estas
()
Ответ на: комментарий от pathfinder

> если у него USB-НЁХ, то там может быть что угодно.

USB-нёхи эмулируют UART 16550(A). Часто криво и не полно.

16550A - 16-byte buffers

По умолчанию он работает тоже с 8-ми байтным буфером, емнип. Его надо переключать на 16-байтный буфер.

Посмотрел http://en.wikipedia.org

16650

16750

16850

Hayes ESP

Это всё - экзотика, которую можно встретить только в античном телекоме и промышленной автоматике.

LamerOk ★★★★★
()
Ответ на: комментарий от pathfinder

И вообще ИМХО правильной программе должно быть по барабану какими кусками приходят данные.

в общем, я так и сделал - чтобы программе было все равно по сколько байт за раз приходит, большое спасибо всем за информацию и советы!

I-Love-Microsoft ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.