дополнительный \x0D добавляется, когда эхо \0x0A

Да; см.

https://stackoverflow.com/questions/1106098/parse-annotations-from-a-pdf

и, возможно,

https://github.com/measuresforjustice/textricator

(подумал, что мы должны убрать этот вопрос из очереди без ответа)

12
30.08.2020, 02:37
2 ответа

Вам нужно отключить преобразование новой строки:

stty -F /dev/ttyS2 -onlcr

или, для строгого POSIXstty:

stty -onlcr < /dev/ttyS2
12
18.03.2021, 23:10

Если вы хотите, чтобы байты передавались, так как -по последовательному соединению в обоих направлениях, вам нужно указать системе, что это не должно использоваться в качестве терминального устройства, либо путем отключения от него дисциплины линии tty, либо путем выдачи:

stty raw -echo < /dev/ttyS2

В вашем случае это был атрибут onlcr, включенный по умолчанию на устройстве tty, который вызывал преобразование LF в CRLF на выходе. Вы можете отключить всю обработку вывода, включая ocrnlс stty -opost, но при этом останется вся обработка ввода для данных, передаваемых в другом направлении.

Вы не указываете, какую оболочку, echoили printfреализацию вы используете, но обратите внимание, что параметры -n, -eне являются стандартными, а поведение printfили echoкогда аргумент содержит \x, не указывается.

Некоторые реализации printfв аргументе формата расширяют \xHHдо байта со значением 0xHH.

В тех

printf "\xAA\xEE\x0A\x%02x" $i

Расширил бы \xAAдо байта 0xAA, а для \xлибо расширил бы его до байта 0 или до \xбуквально, либо пожаловался бы на отсутствие шестнадцатеричных цифр. Таким образом, вы получите, например, <0xaa><0xee><LF>\x01в $a.

Некоторые echoреализации также интерпретируют \xHHпоследовательности (, некоторые только при передаче -eопции ).

Здесь, если вы хотите быть портативным, вы бы сделали:

a=$(printf '\\252\\356\\012\\%03o' "$i")
printf "$a" > /dev/ttyS2

Или:

a=$(printf '\\0252\\0356\\0012\\0%03o' "$i")
printf %b "$a" > /dev/ttyS2
Стандарт

(printfподдерживает восьмеричные последовательности \oooв формате и формат %b, предназначенный для имитации расширений, которые некоторые реализации echoделают с -eили без него, и где восьмеричные последовательности выражаются как\0ooo).

Вы также хотите убедиться, что первый printfне выводит байт NUL, поскольку, за исключением zsh, оболочки не могут хранить байты NUL в своей переменной (не делайте a=$(printf '\0 or \x00 or \u0000'), например ).

Сzsh:

bytes=(0xaa 0xee 0x0a $i)
set +o multibyte
printf %s ${(#)bytes} > /dev/ttyS2

Эти данные могут быть сохранены в переменной либо:

printf -v data %s ${(#)bytes}

или

data=${(#j[])bytes}

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

Другим подходом может быть использование таких инструментов, как xxd, которые могут конвертировать туда и обратно между двоичной формой и текстовым шестнадцатеричным дампом.

printf aaee0a%02d "$i" | xxd -p -r > /dev/ttyS1
13
18.03.2021, 23:10

Теги

Похожие вопросы