저는 직렬 포트를 처음 사용하며 Centos 7 컴퓨터에 직렬용 루프백 케이블이 있습니다. 포트를 테스트하는 Python 항목이 있지만 루프백이 연결되지 않은 경우에도 프로그램이 예상 값을 반환하는 것으로 나타났습니다. Linux의 포트에 이미 일종의 소프트웨어 루프백이 있습니까?
이것이 유용한 정보라면 저는 아래와 같이 pySerial을 사용하고 있습니다. (이 정보 중 일부를 메모리에서 입력해야 하므로 잘못 입력한 경우 사과드립니다. 하지만 제 질문은 코드에 관한 것이 아니라 이 포트가 실제로 어떻게 작동하는지에 관한 것입니다. 일하다)
import serial
BAUD_RATE = 9600
def main():
tx = b"A"
COM_PORT='/dev/ttyS0'
ser = serial.Serial(COM_PORT, BAUD_RATE, timeout=1, parity=serial.PARITY_NONE, rtscts=False, dsrdtr=False)
ser.setDTR(False)
ser.flush()
print("Port " + COM_PORT)
for y in range (0,10):
print("Sent: " + str(tx))
ser.write(tx)
rx = ser.read(1)
print("Received: " + str(rx))
if(len(rx) > 0):
print(COM_PORT + " - " + str(rx))
ser.close()
if __name__ == "__main__":
main()
아래와 같이 더 짧고 간단한 직렬 테스트를 사용할 때도 같은 일이 발생합니다.
터미널 1
cat /dev/ttyS0
터미널 2
echo "test" > /dev/ttyS0
말씀드린 대로 두 테스트 모두 예상한 출력을 얻었지만 케이블 연결 여부에 관계없이 동일한 출력이 나왔습니다.
테스트 출력
인터페이스가 실제로 문자 장치인지 확인하십시오.
ls -l /dev/ttyS0
산출:crw-rw----, 1 user group 4, Date /dev/ttyS0
다른 프로세스가 열려 있지 않은지 확인하십시오.
sudo lsof /dev/ttyS0
출력: 오류 나중에 복사해야 합니다. sudo 없이 실행하면 빈 줄이 반환됩니다.
UART 확인
sudo setserial -v /dev/ttyS0
산출:/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
신호가 적용될 때 CTS 및 유사한 핀이 변경됩니다.
sudo statserial /dev/ttyS0
산출:/dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4
케이블 연결 여부에 관계없이 포트에서 echo 명령을 실행할 때 이 출력은 변경되지 않습니다.
발신번호와 수신번호가 변경되었는지 확인하세요.
sudo cat /proc/tty/driver/serial
산출:
0: uart:16550A port:000003F8 irq:4 tx:8335 rx:8301
1: uart:16550A port:000002F8 irq:3 tx:0 rx:0
//There's a few more serial ports, but they all have 0 tx and rx, and on port 03F8, the tx and tx increase when I send to the serial port ttyS0
또 다른 관련 문제/증상은 Python 스크립트를 실행한 후 더 이상 cat /dev/ttys0을 실행할 수 없다는 것입니다.
따라서 python 스크립트를 실행하기 전에 원하는 만큼 파일을 cat할 수 있지만 python 스크립트를 실행한 직후에 파일을 cat할 수는 없으며 즉시 아무것도 반환하지 않습니다. 확인해 보니 파일이 아직 열리지 않았습니다. 왜 이런 일이 발생하는지 잘 모르겠습니다.
고쳐 쓰다
송신 및 수신 시 0으로 표시되는 다른 포트를 테스트한 결과 실제로 송신 값이 증가하는 것을 확인했지만 수신할 수 없는 것을 확인했습니다. 내가 시도하지 않은 어떤 것이 수신되지 못하게 할 수 있습니까? 다시 말하지만, 첫 번째 포트가 예상한 동작(예상하지 못한 자동 루프백 제외)을 갖기 때문에 일부 구성이 다르다고 가정합니다. 그러나 모든 포트에 적용되는 규칙을 찾지 못했습니다.