2012-11-26 4 views
5

USB/직렬 어댑터가 내장 된 장치가 있습니다 (Prolific PL2303으로 표시됨). 장치 설명서에는 통신 방법에 대한 자세한 내용이 나와 있으며 샘플 Windows 응용 프로그램을 제공합니다. 그러나 Linux에서 사용해야합니다. 이상적으로는 Python과 함께 사용하는 것이 좋지만 그렇게 소중한 것은 아닙니다.파이썬에서의 반이중 직렬 통신

장치는 장치가 9600, 8N1 및 반이중으로 실행되는 상태를 문서화합니다. Windows 응용 프로그램이 정상적으로 작동합니다. 장치가 정상적으로 작동하므로 장치 문제가 아닙니다. 그러나, 나는 리눅스에서 파이썬을 사용하여 그것과 통신 할 수 없다. 나는 pySerial을 사용하고 있으며 비슷한 (전이중, 또한 PL2303) 장치를 사용해 보았습니다.

xonxoff, rtscts 등 여러 가지 조합을 시도했습니다. setRTS (True)를 사용하여 RTS 토글을 시도하고 CTS 및 DSR 등을 검사하여 모두 False를 반환합니다. 필자는 pySerial을 사용하여 장치를 성공적으로 열 수 있습니다 (작업 표시등이 깜박임 - 간단하지만 효과적인 테스트를 볼 수 있음). pySerial은 읽기/쓰기 중에 플러그를 뽑으면 불평합니다.

내가 설정 한 플래그/행이나 전송하는 데이터와 상관없이 항상 동일한 결과를 얻습니다.

>>> s=serial.Serial() 
>>> s.port('/dev/ttyUSB1') 
>>> s.open() 
>>> s 
Serial<id=0x7fe94b533b50, open=True>(port='/dev/ttyUSB1', baudrate=9600, bytesize=8, parity='N', stopbits=1, timeout=3, xonxoff=0, rtscts=0, dsrdtr=0) 
>>> s.write('\2CMD2292\r') 
>>> s.inWaiting() 
0 
>>> s.setRTS(True) 
>>> s.getCTS() 
False 
(several iterations of above with different flags). 

쓰기 명령의 데이터를 무시하십시오. 이는 상태 확인 명령 일뿐입니다. 어떤 일이 있어도 문제가되지 않습니다. 장치는 응답이나 오류로 응답해야합니다.

나는 다양한 ctsrts 플래그 등을 설정하고 다시 연결하기 위해 장치를 닫았다가 다시 열어야했다. 위와 같이 Windows 테스트 앱을 사용하여 계속 잘 작동합니다. 포트란 (Portmon) 등을 사용하여 64 비트 Win7을 설치할 때 Windows 포트 트래픽을 감지 할 수는 없으며 현재 XP 시스템을 구축 할 시간이 없습니다.

의견이 있으십니까?

업데이트 : 또한 데모 응용 프로그램이 작동하는 동일한 Windows 상자에서 파이썬을 사용하여 위의 모든 것을 시도했습니다. 확실히 포트를 열고 통신하지만, 작성된 내용과 상관없이 다시 정보를 반환하지 않습니다.

UPDATE2 : 장치 드라이버와 관련이있는 것으로 보입니다. 일부 추가 배경 조사에 따르면 일부 PL2303 칩은 반이중을 지원하는 기능이 있지만 Linux 드라이버에서는 지원하지 않습니다. Windows 데모 응용 프로그램에는 전용 장치 드라이버가 함께 제공되며 기본 Windows 드라이버를 사용하는 깨끗한 테스트 컴퓨터에서는 응용 프로그램이 작동하지 않습니다. 따라서 파이썬을 통해 성공적으로 연결할 수는 있지만 (예 : STX/ETX 방식에서도) 양방향 통신을 제어 할 수 없기 때문에 절망적 일 수 있습니다. 한숨.

업데이트 3 : 아래 주셔서 감사합니다. 그러나, 나는 이것을 어떤 식 으로든 찾을 수 없었다. USB 프로토콜 분석기를 사용해 보았지만 드라이버를 해체하려고 시도했지만 방금 시간이 많이 걸렸습니다. 결국에는 장치를 분해하고 일부 수정 한 후에 기존 USB 직렬 어댑터를 적절한 PL2303 부품으로 교체했습니다. - 장치 측면에서 보면 기본적인 2-wire 직렬 인터페이스 였기 때문에 어떤 이야기를 하던지 상관하지 않았습니다. 나는이 질문을 마칠 수 없어서 그대로 두겠습니다.

+0

는 인스턴스가 리눅스 박스에 장치에 얘기를 들어 시리얼 통신 프로그램, 미니 콤을 사용하여 시도 적이 직후? 그러면 Python 구현을 시작하기 전에 Linux에서 작동하는 장치를 확인할 수 있습니다. – sizzzzlerz

+0

예 - minicom을 사용하여 대화를 시도했지만 어떤 응답도 얻지 못했습니다. 그러나 수동으로 RTS로 전환하여 minicom에서 전환 할 수 없으므로 Python을 사용해 보았습니다. pySerial이 장치에 연결되어 있고 데이터를 전송하고 있음을 알고 있습니다 (위의 심플한 조명 참조). –

+0

어디에서 드라이버를 얻었습니까? 그것은 당신의 배포판의 일부입니까, 아니면 직접 만들었습니까? 너 루트 야? – tMC

답변

1

시도

s.flush() 

당신의 s.write 전화