0xA 데이터를 사용하여 원시 데이터를 직렬로 전송

0xA 데이터를 사용하여 원시 데이터를 직렬로 전송

누군가에게 문자열을 직렬 포트로 보내려고 하는데 echo -ne '\x55\x90\x17\x01\x00' > /dev/ttyACM0USB 모니터에 다음 데이터가 표시됩니다.

ffff8c957536f540 2932377867 S Bo:2:005:3 -115 5 = 55901701 00

이것은 잘 작동합니다. 모든 데이터는 문자열로 전송되고 장치는 명령을 받아들입니다. 그러나 데이터에 0xA가 포함되어 있으면 데이터가 항상 2줄로 분할됩니다. 예를 들어:

echo -ne '\x55\x90\xa\x01\xde' > /dev/ttyACM0

USB 모니터링은 다음을 보여줍니다.

ffff8c957536f540 3046024649 S Bo:2:005:3 -115 3 = 55900a
ffff8c957b719000 3046024661 S Bo:2:005:3 -115 2 = 01de

문자열은 2줄로 나뉘며, 물론 장치는 이 명령을 무시했습니다.

내 질문은 0xA가 포함된 데이터를 보내는 방법입니다. 이것은 stty에 문제가 있습니다. 많은 시간을 보냈지만 여전히 성공하지 못했습니다. 또는 Linux 콘솔에서 직렬 포트로 문자열 중간에 0xA를 보낼 수 없는지 확인하십시오.

답변1

이거 많이 닮은 것 같아Bash 메일링 리스트에서 논의된 문제지난 며칠 동안. Bash는 출력을 위해 라인 버퍼링을 사용하므로 중간에 개행 문자를 포함하거나 포함하면 printf각 "라인"에 대한 시스템 호출이 호출됩니다.echowrite()

$ strace -ewrite bash -c 'echo -ne "foobar"' >/dev/null 
write(1, "foobar", 6)                   = 6
+++ exited with 0 +++

$ strace -ewrite bash -c 'echo -ne "foo\nbar\n"' >/dev/null 
write(1, "foo\n", 4)                    = 4
write(1, "bar\n", 4)                    = 4
+++ exited with 0 +++

쓰고 있는 장치가 이에 민감한 경우 여러 개의 다른 패킷이 발생할 수 있습니다. 직렬 연결이나 TCP 스트림 (*)은 이에 대해 신경 쓰지 않아도 되지만 UDP 패킷과 유사한 것은 신경 쓸 것입니다.

Bash에서는 이 문제를 해결할 수 없는 것 같지만 출력 명령 중간에 출력을 개별 줄로 분할하지 않는 다른 유틸리티를 사용할 수 있습니다. 내가 테스트한 다른 모든 쉘은 write()GNU coreutils의 외부 유틸리티와 마찬가지로 단일 호출로 위의 내용을 인쇄합니다 . Linux에 printf있어야 하므로 작동해야 합니다./usr/bin/printf/usr/bin/printf '\x55\x90\xa\x01\xde'

$ strace -f -ewrite /usr/bin/printf '\x55\x90\xa\x01\xde' >/dev/null 
write(1, "U\220\n\1\336", 5)            = 5
+++ exited with 0 +++

또는 기본적으로 출력을 512개 청크(마지막 청크 제외)로 버퍼링하는 출력을 파이프할 수 있습니다 dd. 이는 귀하의 경우에 충분합니다. ( dd obs=512이 점을 분명히 하세요.)

(*TCP 연결은 문제가 되지 않지만 메일링 리스트의 질문은 이에 관한 것입니다 printf ... > /dev/tcp/.... 다른 쓰기는 TCP 스트림의 조각화에 영향을 미칠 수 있으며 일부 버그가 있는 호스트는 이에 대해 관심을 갖고 있는 것 같습니다.)

답변2

이는 데이터가 두 행으로 "분할"된다는 의미는 아닙니다.

즉, 데이터를 올바르게 쓰고 있습니다. 이것이 데이터를 표시하는 방법이며 "두 행"이 있는 것처럼 보입니다.

0xA는 Unix/Linux "줄바꿈" 문자('\n')인 ASCII "줄바꿈" 문자입니다.

USB 모니터에서 데이터를 볼 때 터미널(또는 Unix/Linux의 거의 모든 텍스트 표시 소프트웨어)은 디스플레이를 다음 "라인"으로 이동합니다. 대부분의 터미널에서 이는 디스플레이 드라이버가 캐리지 리턴과 라인 피드를 삽입한다는 것을 의미합니다.

od데이터를 확인하는 더 좋은 방법은 USB 모니터에서 데이터를 캡처하고 보기 옵션을 사용하여 명령에 파이프하는 것입니다.16진수 문자( od -t x1). 그러면 작성한 실제 데이터가 표시됩니다.

답변3

일부 tty 장치는 LF에서 CRLF로의 변환 출력을 켜진 상태로 유지합니다. 다음을 사용하여 비활성화할 수 있습니다.

stty -onlcr -F /dev/ttyACM0

또는 엄격한 POSIX 체류의 경우

stty -onlcr < -F /dev/ttyACM0

또는 순수 RAW 모드를 사용해 보세요.

stty raw -echo -F /dev/ttyACM0

그럼 시도해봐

echo -ne '\x55\x90\xa\x01\xde' > /dev/ttyACM0

관련 정보