때로는 직렬 장치에서 데이터를 읽어야 하므로 minicom
or 및 just screen
의 복잡성을 건너뜁니다 cat
. 그러나 stty <baud>
이것은 파일을 열려고 하기 전에 먼저 터미널의 전송 속도를 설정한 경우에만 작동합니다.
이 데이터는 이미 커널에 버퍼링되어 있을 수 있습니다. 이 경우에는 다음을 사용합니다.UART-USB 브리지. USB 전송 속도는 특정 표준에 따라 고정되어 있으므로 전송 속도 설정은 데이터 해석에만 영향을 미칩니다. USB 패킷의 데이터가 어떻게 생겼는지에 대한 이해가 부족하기 때문에 고정된 읽기 속도(전송 속도)에서 USB 패킷 데이터의 "해석"을 시각화하는 방법을 잘 모르겠습니다.
$ stty 115200
$ cat /dev/ttyACM0
여기서 무슨 일이 일어나고 있는 걸까요? 이 설정이 하드웨어에서 무엇을 의미하는지 이해하지만사용자 공간소프트웨어?
답변1
모든 것이 어떻게 작동하는지에 대해 약간 혼란스러울 수도 있습니다.
우선, /dev/ttyACM0
이는 USB 링크나 연결된 직렬 어댑터의 USB 끝점을 나타내지 않으며 직렬 통신을 처리하는 어댑터 내부의 UART를 나타냅니다. 여기서 읽는 데이터에는 USB 헤더나 프레임이 포함되지 않습니다. 마찬가지로 여기서 읽는 데이터에는 /dev/ttyS0
PCI Express 헤더나 프레임이 포함되지 않습니다. 이러한 전송 속도를 설정하면 연결된 버스가 아닌 해당 하드웨어에 영향을 미치므로 USB 연결에는 아무런 영향을 미치지 않습니다.
둘째, 전송 속도는 소프트웨어 설정이 아닌 하드웨어 설정입니다. 직렬 포트에서 이 설정을 호출하면 stty
하드웨어가 데이터 수신을 시도하는 전송 속도를 변경하도록 커널에 지시하는 것입니다. 이는 특히 이 변경 이전에 수신된 모든 데이터가 허위(하드웨어가 이를 올바르게 해석하지 않았기 때문에, 전송 속도가 서로 가깝거나 정확한 고조파인 경우 발생함)이거나 완전히 손실되었음을 의미합니다(하드웨어가 이는 최신 하드웨어에서 발생할 가능성이 더 높기 때문에 이를 허용하지 않습니다.
직렬 회선에서 데이터를 읽으려는 경우 다른 쪽 끝에서 데이터를 전송하기 전에 전송 속도를 올바르게 설정해야 합니다. 이는 또한 전송 속도를 변경해도 커널이 데이터를 해석하는 방식이 변경되지 않음을 의미합니다. 데이터가 이미 커널에 버퍼링되어 있는 경우 전송 속도를 변경한다고 해서 변경되지는 않습니다(단, 향후 데이터가 좋은지 알 수 있도록 전송 속도를 변경한 후 커널 버퍼를 비우는 것이 좋습니다).
따라서 명확히 말하면 특수 소프트웨어를 사용하지 않고 USB에서 직렬 어댑터로 데이터를 가져오는 올바른 방법은 다음과 같습니다.
- 시스템 시작 시 전송 속도를 설정합니다. USB-직렬 어댑터의 경우 이는 장치가 연결될 때에도 설정되도록 udev 규칙이어야 합니다.
cat
데이터를 읽으려면 (또는od
텍스트 대신 바이트 값이 필요한 경우)을 사용하십시오 . 그러면 USB-직렬 어댑터에서 수신한 정확한 데이터가 반환됩니다(어댑터에서 특별하게 처리하지 않는다고 가정).