직렬 전송 전송 속도 불일치

직렬 전송 전송 속도 불일치

두 개의 직렬 포트가 있는데, 하나는 마더보드(/dev/ttyS0)를 통해 하나는 PCIE에서 옥스포드 칩(/dev/ttyS1)이 있는 RS232 카드(Startech 2S952)로 연결됩니다(/dev/ttyS2가 있지만 여기에는 들어가지 않습니다). 이야기) ). 내 경우에는 전송 속도를 어떻게 해석합니까?

[    1.111618] 00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
[    1.112543] 0000:08:00.0: ttyS1 at I/O 0xf010 (irq = 40, base_baud = 4000000) is a 16550A

로직 분석기를 직렬 포트의 Tx/Rx 라인에 연결했습니다. 내가 할 때 :

stty -F /dev/ttyS0 115200
echo "ABCDEFGH" > /dev/ttyS0

그런 다음 로직 분석기에서 "ABCDEFGH" 문자열과 0x0D 0x0A를 디코딩할 수 있지만 전송 속도는 115200이라고 말해야 합니다. 또한 USB 직렬 어댑터(널 모뎀 케이블을 통해)를 사용하여 노트북을 연결하고 직렬 포트를 읽을 때 수신기를 115200으로 설정했을 때만 의미 있는 출력을 얻습니다. 이것이 내가 이해하는 것입니다.

이제 /dev/ttyS1을 사용하십시오:

stty -F /dev/ttyS1 115200
echo "ABCDEFGH" > /dev/ttyS1

논리적 분석을 통해 내 메시지가 밀리초 단위로 훨씬 느리다는 것을 분명히 알 수 있습니다. 실제로 약 34.7(2)배 더 느립니다. 즉, 40000000/115200 = 34.7(2)입니다. 특히, 수신 랩톱은 여러 개의 0x00이 포함된 메시지를 받습니다. 3200보드로 설정하면 횡설수설이 보입니다. 분명히 메시지는 실제로 115200/34.6 = 3339.13...bps로 전송됩니다.

/dev/ttyS1의 경우:

stty -F /dev/ttyS1 4000000
echo "ABCDEFGH" > /dev/ttyS1

/dev/ttyS1과의 통신이 발생하면 비트 지속 시간은 예상되는 115200과 일치합니다.

그래서 나에게 이것은 다음을 의미합니다.

[    1.112543] 0000:08:00.0: ttyS1 at I/O 0xf010 (irq = 40, base_baud = 4000000) is a 16550A

"4000000"은 일부 내부 발진기의 주파수로 해석되어야 하며, 실제 전송 속도는 115200이 됩니다. 나는 이 값이 하드웨어 내부에 있고 드라이버 내부에 숨겨져 있기를 원합니다.

내가 무엇을 놓치고 있나요? 직렬 포트를 처음 사용해서 완전히 헤매었습니다.

커널 매개변수로 "console=ttyS1,4000000n8"을 전달하면 랩톱에서 직렬을 통해 통신하도록 115200을 설정할 수 있습니다.

답변1

따라서 추측에 따르면 어떤 이유로든 이 카드에서 실행되는 기본 클럭에 대한 커널의 이해가 잘못된 것 같습니다. 직렬 포트는 단순한 장치이므로 시스템에 카드에서 직렬 포트를 찾는 표준 방법이 없더라도 놀라지 않을 것입니다. 적어도 어떤 경우에는 구성 부분이제수기본 클럭에 적용되며 이를 얻으려면 실제 기본 클럭에 대한 지식이 필요합니다.

(카드에는 최대 속도를 설정하기 위한 점퍼가 있으므로 이를 지원하는 드라이버에 설정을 알려주는 방법이 있을 수 있습니다.)

어쨌든 옵션 setserial이 있는 것 같습니다 baud_base. 이 옵션을 사용하면 문제를 수동으로 해결하는 데 도움이 될 수 있을 것 같습니다.

setserial /dev/ttyS1 baud_base 115200

관련 정보