LINUX.ORG.RU

История изменений

Исправление yax123, (текущая версия) :

Судя по ответам, спецов по асио тут нет.

А хочу я вот чего.

По сериалу валяться пачки байт, от 80 до 500 байт примерно. Период 60 мс. Мне нужно без потерь выгребать весь поток. При этом не лочится на чтении, чтобы во время отловить, что очередной пакет не пришел.

Действую так. Делаю буфер н байт. Таймаут на н байт плюс пару байт. Запускаю асинк_вайт с калбеком. Потом асинк_рид с калбеком и буфером. Потом в цикле кручу ран_уан (извините за мой мутковский) и слежу чего там калбеки получат и через член класса передадут в цикель с ран_уан.

Если данных нет, вскакивает таймер, ставит статус таймаут, а я потом в цикле это перехватываю и отменяю чтение. Тут есть два варианта, что-то успел прочитать или нет. Если нет - то выходим и опять вызываем функцию чтения со взводом таймера и т д. А вот если что-то успели прочитать, тут уже варианты.

  1. Есть 485-усб на базе ftdi232rl. Там, после частичного чтения, если обратно начать читать, то данные не теряются.
  2. Есть в паралель моха 1150 из которой можно прочитать пяток байт, выскочить по таймауту, а потом заскочить, а в буфере уже байт ~10 примерно потеряно.

И это все при одинаковом коде и одинаковом источнике данных. При этом аналогичный код на сишечке отлично работает уже год. Причем с обоих уартов и нативного ттуС0.

Вот я и хочу понять, что там такого в калбеке чтения и ране происходит, что для разных железок все по разному.

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

Драйвер на моху официальный.

Как-то так.

Исходная версия yax123, :

Судя по ответам, спецов по асио тут нет. А хочу я вот чего. По сериалу валяться пачки байт от 80 до 500 байт примерно. Период 60 мс. Мне нужно без потерь выгребать весь поток. При этом не лочится на чтении, чтобы во время отловить, что очередной пакет не пришел. Действую так. Делаю буфер н байт. Таймаут на н байт плюс пару байт. Запускаю асинк_вайт с калбеком. Потом асинк_рид с калбеком и буфером. Потом в цикле кручу ран_уан (извините за мой мутковский) и слежу чеготам калбеки получат и через член класса передадут в цикель с ран_уан. Тут есть два варианта, если данных нет, вскакивает таймер, ставит статус таймаут, а я потом в цикле это перехватываю и отменяю чтение. Тут есть два варианта, что-то успел прочитать или нет. Если нет то выходим и опять вызываем функцию чтения со взвовод таймера и т д. А вот если что-то успели прочитать, тут уже варианты.

  1. Есть 485-умб на базе фтдиай. Там после частичного чтения если обратно начать читать, то данные не теряются.
  2. Есть в паралель моха 1150 из которой можно прочитать пяток байт, выскочить по таймауту, а потом заскочить, а в буфере уже байт ~10 примерно потеряно.

И это все при одинаковом коде и одинаковом источнике данных. При этом аналогичный код на сишечке отлично работает уже год. Причем с обоиз уартов и нативного ттуС0.

Вот я и хочу понять, что ткм такого в калбеке чтения и ране происходит, что для разных железок все по разному.

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

Драйвер на моху официальный.

Как-то так.