Да; см.
https://stackoverflow.com/questions/1106098/parse-annotations-from-a-pdf
и, возможно,
https://github.com/measuresforjustice/textricator
(подумал, что мы должны убрать этот вопрос из очереди без ответа)
Если вы хотите, чтобы байты передавались, так как -по последовательному соединению в обоих направлениях, вам нужно указать системе, что это не должно использоваться в качестве терминального устройства, либо путем отключения от него дисциплины линии 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