답변1
직렬 연결을 통해 양방향으로 바이트를 있는 그대로 전송하려면 시스템에서 tty 라인 규칙을 분리하거나 다음을 실행하여 터미널 장치로 사용되지 않는다는 것을 시스템에 알려야 합니다.
stty raw -echo < /dev/ttyS2
귀하의 경우 onlcr
출력에서 LF를 CRLF로 변환하는 것은 tty 장치에서 기본적으로 활성화된 속성입니다. 비활성화할 수 있습니다.모두출력 처리 ocrnl
에는 가 포함되지만 stty -opost
이로 인해 데이터에 대한 모든 입력 처리가 다른 방향으로 전송됩니다.
echo
어떤 셸 이나 구현을 사용하고 있는지는 표시하지 printf
않지만 -n
옵션은 -e
표준이 아니며 printf
인수에 포함된 항목이나 시기에 대한 동작이 지정되지 않았습니다.echo
\x
printf
형식 매개변수의 여러 구현은 \xHH
값이 0xHH인 바이트로 확장됩니다.
그중에서
printf "\xAA\xEE\x0A\x%02x" $i
\xAA
는 바이트 0xAA로 확장되고 , for는 문자 그대로 또는 누락된 16진수에 대해 불평하여 \x
바이트 0으로 확장됩니다 . \x
예를 들어, 당신은 in 으로 끝납니다 <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
(표준은 형식의 8진수 시퀀스뿐만 아니라 일부 구현에서 사용하거나 사용하지 않을 수도 있는 확장 유형을 에뮬레이션하도록 설계된 형식을 printf
지원하며 8진수 시퀀스는 로 표시됩니다 .)\ooo
%b
echo
-e
\0ooo
또한 첫 번째 항목이 NUL 바이트를 인쇄하지 않는지 확인하려고 합니다 printf
. 왜냐하면 쉘은 그 이외의 변수에 NUL 바이트를 저장할 수 없기 때문입니다(예: zsh
그렇게 하지 마십시오).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
또 다른 방법은 바이너리 형식과 텍스트 16진수 덤프 사이를 앞뒤로 변환할 수 있는 유사한 도구를 사용하는 것입니다 .
printf aaee0a%02d "$i" | xxd -p -r > /dev/ttyS1