저는 Linux 전문가가 아니므로 안심하시기 바랍니다. ;)
좋아요, 상황은 Debian Wheezy를 실행하는 단일 보드 컴퓨터가 있다는 것입니다. 나는 그것이 오래되고 위험하다는 것을 알고 있지만 실제로는 "내" 장치가 아니므로 제어할 수 없습니다.
C#으로 작성되고 Mono를 통해 실행되는 일부 소프트웨어가 실행되고 있습니다. 다시 말하지만, 이것은 내 소프트웨어가 아니며 나는 이에 대한 통제권이 없으며 코드를 변경할 능력도 없습니다.
소프트웨어는 /dev/ttyS1
물리적 직렬 포트( )를 통해 모뎀에 AT 명령을 보내고, 모뎀은 명령에 대한 적절한 응답을 반환합니다.
모뎀을 더 이상 사용할 수 없으므로 다른 대안을 개발해야 합니다. 그래서 AT 명령을 "가로채서" 적절한 응답을 C# 소프트웨어로 다시 보내는 간단한 Python 스크립트를 SBC에서 실행할 수 있다고 생각했습니다. 그런 다음 Python 스크립트를 사용하여 다른 장치와 통신할 수 있었지만 이 방법.
이를 위해서는 좋은 "Google"을 사용하는 socat
것이 최선의 선택인 것 같습니다. 그러나 시도해 보았지만 얼마나 많은 조합이 필요한지 모르고 원하는 방식으로 작동하도록 할 수 없습니다.
물리적 설정은 현재 내 노트북에 직렬 포트가 연결되어 있어 파이프(ttyS1)에서 오는 AT 명령을 볼 수 있다는 것입니다. 그런 다음 SBC에 ssh로 연결하고 minicom을 시작하여 socat
.
기존 설정
C# <-> ttyS1 <-> 기존 모뎀
필수 설정
C# <-> socat <-> python -> 새 모뎀
제가 시도한 두 가지 변형은 다음과 같습니다.
socat -x /dev/ttyS1,raw,echo=0,crnl PTY,link=/dev/ttyV1,raw,echo=0,crnl
...또한 내가 오해한 경우를 대비해 반대 방향으로도 시도했습니다...
socat -x PTY,link=/dev/ttyV1,raw,echo=0,crnl /dev/ttyS1,raw,echo=0,crnl
나도 시도했다많은다양한 변형, 파일로 푸시, 파일로 "티잉", 다양한 명령 스위치, stty를 사용하여 포트 구성 등
같은 문제가 발생할 때마다 실제로 AT 명령이 전송되는 것을 볼 수 없습니다~에서C# 소프트웨어? !
SBC에 minicom을 입력하면 랩톱의 직렬 포트 리더기에 나타나는 출력을 볼 수 있습니다. 마찬가지로 랩톱에 직렬 포트 리더기를 입력하면 SBC의 minicom에 나타나는 입력을 볼 수 있지만 무엇이 아닌지 알 수 있습니다. 소프트웨어가 ttyS1을 사용하도록 구성되어 있더라도 C# 소프트웨어에서 보낸 실제 AT 명령이 차단됩니다.
소프트웨어에 대해 내가 제어할 수 있는 유일한 것은 모뎀과 통신하는 데 사용하는 포트입니다. 그래서 예를 들어 가상 포트로 변경하고 /dev/ttyV1
시작 중 및 C# 프로그램이 시작되기 전에 socat
Create Virtual Port를 실행하여 가상 포트를 실제로 사용할 수 있도록 했습니다. 또 똑같은 문제가 발생합니다. 여전히 C# 소프트웨어에서 보낸 AT 명령을 볼 수 없습니다.
이틀 동안 이 작업을 수행했는데 제대로 작동하지 못하니 누군가 도움을 줄 수 있기를 바랍니다. 나는 socat이 작동하는 도구라고 확신합니다. 나는 그것이 어떻게 작동하는지 근본적으로 오해했기를 바랍니다.
답변1
필수 부분 중 하나가 누락되었을 수 있습니다: 직렬 포트 속도.
socat
옵션에서 직렬 포트 속도를 설정하면 비슷한 실험을 시도해 볼 수 있습니다.
socat -x PTY,link=/dev/ttyV1,raw,echo=0,crnl /dev/ttyS1,b115200,raw,echo=0,crnl
여기서는 115200 전송 속도를 사용했습니다 b115200
.socat
남성가능한 모든 옵션을 보려면 다음 명령을 사용하십시오 b...
.
socat -hh |grep 'b[1-9]'
(그리고:
참고: 일부 운영 체제에서는 이러한 옵션을 사용하지 못할 수도 있습니다. 대신 ispeed나 ospeed를 사용하세요.
)
테스트 애플리케이션으로 사용됨(예, screen
직렬 포트를 처리할 수 있음):
screen /dev/ttyV1 115200
바꾸다
screen /dev/ttyS1 115200
직렬 포트를 통해 콘솔을 갖도록 구성된 다른 시스템에 평소처럼 로그인할 수 있습니다( screen
115200 매개변수는 쓸모가 없지만 이로 인해 응용 프로그램이 중단되어서는 안 된다는 것을 의미합니다).
보내거나 받은 모든 내용은 16진수로 표시됩니다 -x
.
귀하의 질문에 답변한 것 같습니다. 귀하의 목표는 더 큰 작업인 트래픽을 변경하는 것 같지만 직렬 포트를 통해 이동하는 트래픽을 읽는 방법을 묻습니다.
특히 문자가 버퍼링되지 않은 경우 흐름을 변경하려면 전용 도구가 필요합니다( sed
파이프 중간에서 사용하기가 더 어려울 수 있습니다).
socat
일반적으로 전반부(PTY)에는 흐름을 변경하기 위해 실행 파일을 호출하는 첫 번째 명령이 있습니다(셸 스크립트나 Python 등일 수 있으며 최대 4개의 다른 FD를 사용하여 양쪽을 관리해야 함). EXEC:
후반부의 두 번째 명령(ttyS1)을 호출합니다 .socat
답변2
HardwareW - /dev/ttyUSB0 <---> socat/logging <---> ~/myserial <---> Python 직렬 스크립트
장치를 연결
ttyUSB0
하고ttyUSB0
사용자가 사용할 수 있도록 합니다.sudo chown youruser.youruser -R /dev/ttyUSB0
소캣 시작
socat -d -d -x /dev/ttyUSB0,b9600,rawer PTY,link=$HOME/myserial,rawer,echo=0 2>log3
RS232 장치로 데이터/요청을 보냅니다.
python myserial-client.py '*IDN?'
장치에는 특정 문자 시퀀스가 필요한 경우가 많습니다. , , , ,
*IDN?
문자 단위로 데이터를 보내는 미니콤 터미널에는 응답하지 않습니다 .*
I
D
N
?
예
myserial-client.py
:import sys import serial DEFAULT_ADDR = '/home/krzys/myserial' DEFAULT_CMD = 'R5' args = len(sys.argv) - 1 if args == 0: addr, cmd = DEFAULT_ADDR, DEFAULT_CMD elif args == 1: addr, cmd = DEFAULT_ADDR, sys.argv[1] else: addr, cmd = sys.argv[1:3] cmd += '\r\n' s = serial.Serial("/home/krzys/myserial",9600,timeout=0.5) s.write(cmd.encode()) print(s.readline())
myserver.py
프레임 전송 및 수신을 테스트하고 확인할 수 있는 더미 스크립트를 작성하여 스크립트를 확인하는 것이 좋습니다 .
확인하시기 바랍니다이 점, Linux 가상 Python 에뮬레이터에서 설정하는 방법 및 직렬 통신을 테스트하는 클라이언트에 대해 설명합니다.