\0x0A를 에코할 때 추가 \x0D를 추가합니다.

\0x0A를 에코할 때 추가 \x0D를 추가합니다.

tty 포트로 16진수 값을 보내려고 합니다 /dev/ttyS2. 내가 사용할 때 echo또는 에서 printf \x0A작동합니다 .\x0D\x0A

i=1 
a=$(printf "\xAA\xEE\x0A\x%02x" $i)
echo -ne   "$a"  > /dev/ttyS2

나는 이것을 터미널/직렬 포트에서 얻습니다 - 추가 0D에 주목하십시오. 어떻게 삭제할 수 있나요?

여기에 이미지 설명을 입력하세요.

답변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%becho-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

답변2

개행 변환을 비활성화해야 합니다:

stty -F /dev/ttyS2 -onlcr

또는 엄격한 POSIX의 경우stty:

stty -onlcr < /dev/ttyS2

관련 정보