나는 CP2102 직렬 변환기 칩으로 전송/수신되는 내용의 16진수 덤프를 얻으려고 노력해 왔습니다. 사람들이 모니터링하는 사례를 찾을 수 있습니다.하드웨어직렬 포트 /dev/TTYS0 등
socat -d -d pty,link=/dev/ttyUSB0,raw,echo=0 pty,link=/dev/ttyUSB1,raw,echo=0
이와 같은 USB 포트를 모니터링하는 방법을 알려주는 리소스를 아는 사람이 있습니까? 지금까지 아무것도 효과가 없었습니다. 어쩌면 직렬 모니터링이나 다른 것의 재라우팅 측면을 이해하지 못하는 것일 수도 있습니다.
답변1
가장 쉬운 방법은 가능하다면 16진수를 방출하도록 소프트웨어를 조정하는 것입니다. 대부분의 소프트웨어에는 이미 sdio.h
해당 항목(또는 이에 상응하는 항목)이 있으며 16진수 직렬 데이터에는 printf
직렬 파일 설명자에 들어오고 나가는 데이터에 대한 호출(또는 이에 상응하는 항목)만 필요합니다. 데이터를 주고받는 복잡한 추가 프로세스가 없으며 사실상 추가 대기 시간도 없습니다.
급한 경우 strace
(또는 sysdig
SystemTap
등)과 같은 것을 사용하여 통신을 기록할 수 있지만 이로 인해 strace
프로세스 속도가 크게 느려지고 출력에 사후 처리가 필요할 수 있습니다. 적합하지 않습니다.
strace -xx -y -e trace=read,write -p $pid_of_your_program_here
하드웨어 수준에서는 버스 불법 복제나 이와 유사한 행위가 통신을 악용하는 또 다른 방법이 될 수 있습니다.
그동안 socat(1)
편리한 16진수 옵션이 있는 것 같습니다 -x
.
-x Writes the transferred data not only to their target streams,
but also to stderr. The output format is hexadecimal, prefixed
with "> " or "< " indicating flow directions. Can be combined
with -v .
몇 가지 실험 후에 다음을 통해 임의의 Arduino를 들을 수 있었습니다.
socat -x PTY,link=/dev/blah,raw,wait-slave /dev/serial/by-id/usb-Arduino...
그런 다음 소프트웨어를 열 수 있습니다 /dev/blah
(또는 소프트웨어를 실행하여 실행할 수 있습니까 EXEC
?). 경로를 구성하려고 하면 오류가 발생하므로 경로 raw
뒤에는 옵션이 지정되지 않습니다 . 출력에는 다음과 같은 사후 처리가 필요할 수도 있습니다./dev/serial/by-id/usb-Arduino...
tcgetattr(6, ...): Inappropriate ioctl for device
socat
socat
--
2017/10/09 16:32:20 socat[30806] I transferred 1 bytes from 6 to 5
< 2017/10/09 16:32:20.475916 length=31 from=2042 to=2072
52 65 71 75 65 73 74 69 6e 67 20 74 65 6d 70 65 Requesting tempe
72 61 74 75 72 65 73 2e 2e 2e 44 4f 4e 45 0a ratures...DONE.
--