Linux 직렬 포트 "/dev/ttySX"는 정상적으로 데이터를 전송하지만 수신된 데이터를 터미널에 인쇄할 수 없습니다.

Linux 직렬 포트 "/dev/ttySX"는 정상적으로 데이터를 전송하지만 수신된 데이터를 터미널에 인쇄할 수 없습니다.

두 장치(1: Red Hat Linux, 2: Windows) 간의 RS-232 통신을 테스트하고 있습니다.

보내고 받은 데이터를 확인할 수 있어요. Windows에서는 직렬통신 프로그램을 통해 확인할 수 있고, Linux에서는 터미널을 통해 쉽게 확인할 수 있습니다. RS-232 통신과 동일한 기본 설정을 한 후 데이터 송수신을 시도해 보았습니다.

Linux 장치에서 Windows 장치로 데이터가 전송되면 Windows 통신 프로그램에서 수신되었는지 확인할 수 있습니다. 반대로, Windows 장치에서 Linux 장치로 데이터를 보내면 실행은 되지만 터미널에는 나타나지 않습니다 cat /dev/ttySX.

RS232 데이터 송수신을 테스트하기 위해 입력한 명령은 다음과 같습니다.

dmesg | grep ttyS

#output:
ttyS0 at MMIO 0xdf301000 (irq = 126, base_baud = 7812500) is XR17V35X
ttyS1 at MMIO 0xdf301400 (irq = 126, base_baud = 7812500) is XR17V35X
ttyS2 at MMIO 0xdf301800 (irq = 126, base_baud = 7812500) is XR17V35X --> real usage
ttyS3 at MMIO 0xdf301c00 (irq = 126, base_baud = 7812500) is XR17V35X
setserial /dev/ttyS2 uart 8250

# Output
ttyS0 UART:undefined Port:0x0000
ttyS1 UART:undefined Port:0x0000
ttyS2 UART:8250 Port:0x0000 ---> Why port is 0x0000?
ttyS3 UART:undefined Port:0x0000
stty -F /dev/ttyS2 115200 cs8 -cstopb -parenb

두 개의 터미널을 열고 각각 다음 명령을 실행하십시오.

터미널 1:

cat /dev/ttyS2" (or "cat < /dev/ttyS2")

NO2. 터미널:

echo -e -n \x2\x3\x1\x0\x0\x0\x0\x3 > /dev/ttyS2

터미널 2에서 보낸 데이터는 Windows 장치의 직렬 통신 프로그램에서 제대로 수신되지만 Windows 장치에서 보낸 데이터는 터미널 1에 나타나지 않습니다. 그런데 프로그램을 말하지 않고 cat /dev/ttyS2그냥 윈도우 시리얼 포트에서 보냈는데 , 명령을 하면 cat /dev/ttyS2응답도 받았습니다.

질문: 수신된 데이터를 표시하려면 어떻게 해야 합니까 cat /dev/ttyS2? 포트 0x0000은 무엇을 의미합니까?

읽어주셔서 감사합니다.

답변1

수신된 데이터를 표시하고 싶다면 어떻게 해야 합니까 cat /dev/ttyS2?

귀하가 사용하는 도구가 귀하의 목적에 적합하지 않을 수 있습니다. 개념적으로는 매우 간단 하지만 cat구현은 전혀 간단하지 않을 수 있습니다.

cat아마도 블록 장치의 파일에서 주로 작동하도록 설계되어 입력 및 출력을 버퍼링할 수 있습니다. 처음에는 사용 가능한 소량의 데이터를 처리할 수 있으며(블록 지향 장치에서 나온 것으로 가정되는 입력 스트림과 "동기화"하기 위해) 해당 데이터가 처리되어 cat더 많은 데이터를 기다려야 할 때 , 더 큰 데이터 블록이 도착할 때까지 기다리고 모든 데이터가 다시 처리되어 효율적인 파일 시스템 입/출력을 제공합니다.

이 문제catGNU가 최소 128KiB의 버퍼 크기를 사용할 수 있음 을 나타냅니다 .

다른 구현의 (비?) 버퍼링 동작은 cat매우 다를 수 있습니다.

minicom두 개의 별도 터미널과 일반 명령을 사용하는 대신 직렬 포트만 처리하도록 설계된 단일 유틸리티(예: RHEL 표준 패키지 컬렉션에서 찾을 수 있음)를 사용할 수 있습니다 . 더 간단하고 미니멀한 것을 원한다면 EPEL 저장소에 picocom(Github 및 설명은 여기에 있습니다.).

이러한 프로그램은 블록 지향 가정을 하지 않으며 터미널의 PTY 장치가 다른 버퍼링 계층으로 인해 수신 데이터 지연을 일으키지 않도록 하는 방법도 "알고 있습니다".


포트 0x0000은 무엇을 의미합니까?

PC 아키텍처를 위한 원래 8250 UART 사용포트 매핑 I/O, 기본적으로 I/O 포트에 별도의 주소 공간을 사용하고 이를 사용하기 위해 전용 CPU 명령어를 사용합니다. 이것이 오랫동안 표준이었기 때문에 Linux 도구에서는 setserial모든 8250 호환 UART가 특정 포트 주소에 있다고 가정했습니다.

그러나 최신 XR17V35X UART 칩은 8250과 역호환되지만 다음을 사용하도록 설계되었습니다.메모리 매핑된 I/OPCIe 버스에는 실제로 더 이상 별도의 I/O 주소 공간이 없으며 최신 시스템에서는 메모리 매핑된 I/O가 더 효율적인 경향이 있습니다. I/O 주소 공간에 액세스하기 위해 레거시 inpout명령어를 사용하는 대신 UART의 레지스터는 메모리와 함께 사용되는 동일한 정상적이고 고도로 최적화된 CPU 명령어를 사용하여 액세스를 통해 액세스할 수 있습니다.

메시지가 ttyS2 at MMIO 0xdf301800 ...로그인 하면 dmesgXR17V35X UART가 매핑된 물리적/버스 주소를 나타냅니다. 메모리 매핑된 UART에는 포트 주소가 없으므로, setserial예를 들어 Port: n/a포트 주소의 개념이 특정 UART에 적용되지 않음을 나타내거나 이와 유사한 것을 표시하는 것이 더 적절할 것입니다 MMIO:0xdf301800.

관련 정보