LINUX.ORG.RU

Огромный косяк от POSIX или ... ?


0

0

Дано: имеем RS-232 и termios.
Так же есть железка, которая гонит данные в 9-битном режиме, причём этот дополнительный бит используется для сигнализации начала пакета.

Жопа в следующем:
Никакими установками последовательного порта нельзя добиться приёма этого 9-го бита. Есть режимы, где проверяется чётность (если этот бит трактовать как чётность), и при ошибке принятый байт предваряется кодом 0xFF, - это единственный режим, который хоть как-то затрагивает приём 9-го бита. Естественно, он не подходит, поскольку чётность байта может совпасть (в 50%) с этим битом, и мы никак не отловим в таком случае начало пакета.

Хотелось бы что-нибудь типа 16-битного режима ( read() читает по 16-битным словам), в которых старший байт показывает состояние 9-го бита (и даже чего-нибудь еще!).

Я прав, что жопа неразрешима, или я чего-то недопонял?


>неразрешима, или я чего-то недопонял

IMO легко вычислить значение 9го бита XOR-ом "факта" чётности принятного байта и факта наличия(отсутствия) перед ним индикации ошибки.

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

неправильно. FF появляется только при ошибке. а если FF был передан в пакете? Тогда его четность=0, ошибки не будет. termios не вставит дополнительный FF, но мы расценим принятый FF как ошибку, и с вероятностью 1/2 "просрём" целый байт как бит. А ещё с какой-то вероятностью порвём пакет.

Была тут ещё идея написать модуль для ядра, но софт будет запускаться на изделии с совершенно другим железом (т.е., неизвестно, какие будут номера портов и какая микруха UART будет).

scyld
() автор топика
Ответ на: комментарий от scyld

>расценим принятый FF как ошибку, и с вероятностью 1/2 "просрём" целый байт как бит

>prefix a character with a parity error or framing error with \377 \0.

Итого - да, но с вероятностью меньше 1/512. Зато сразу 2 байта :).

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

ну, примерно так. только это должно быть как часы. военное, блин, применение. придётся, видимо, ещё железку клепать, - в 7 бит заворачивать, или ту как-то переделывать.

можно было бы выехать на том, что какое-то время между пакетами есть.
попробую select().

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