2012-11-26 19 views
5

Ich habe ein Gerät mit einem eingebauten USB/Seriell-Adapter (zeigt als Prolific PL2303 nach oben). In der Gerätedokumentation finden Sie ausführliche Informationen zur Kommunikation mit dem Gerät und eine Beispielanwendung für Windows. Allerdings muss ich es unter Linux verwenden - idealerweise mit Python, aber ich bin nicht besonders wertvoll.Halbduplex serielle Kommunikation in Python

Die Geräte docs Zustand das Gerät 9600 läuft, 8N1 mit Halbduplex. Die Windows-App funktioniert einwandfrei - das Gerät funktioniert einwandfrei (daher weiß ich, dass es kein Geräteproblem ist). Ich kann jedoch nicht mit Python unter Linux kommunizieren. Ich benutze pySerial, und ich habe versucht, ein ähnliches (Vollduplex, auch PL2303) Gerät, das gut funktioniert.

Ich habe verschiedene Kombinationen von Xonxoff, Rtscts etc. ausprobiert. Ich habe auch versucht RTS Umschalten mit SetRTS (True) und die Prüfung für CTS und DSR usw. - erhält alle Rückkehr False. Ich kann das Gerät erfolgreich mit pySerial öffnen (ich kann sehen, dass die Aktivitätsanzeige blinkt - einfacher aber effektiver Test) und pySerial beschwert sich, wenn Sie es während Lese-/Schreibvorgängen trennen.

scheint nicht egal, was Fahnen/Linien I gesetzt oder welche Daten wir senden, immer das gleiche Ergebnis.

>>> 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). 

Ignorieren Sie die Daten im Schreibbefehl - das ist nur ein Statusüberprüfungsbefehl. Egal was dort abläuft, das Gerät sollte entweder mit einer Antwort oder einem Fehler antworten.

Ich habe sogar zu Schließung und Wiedereröffnung der Einrichtung zwischen Einstellen verschiedene ctsrts Fahnen usw. zurückgegriffen, und Ausstecken/Umstecken es setzt zu erzwingen. Wie oben funktioniert es weiterhin gut mit der Windows-Test-App. Ich kann Portmon usw. nicht verwenden, um den Windows-Port-Verkehr zu schnüffeln, da es sich um eine 64-Bit-Win7-Installation handelt und ich momentan keine Zeit habe, eine XP-Maschine zu bauen.

Irgendwelche Gedanken?

UPDATE: Ich habe auch alle oben mit Python auf dem gleichen Windows-Box, die die Demo-Anwendung funktioniert auf ausprobiert. Es öffnet sich auf jeden Fall der Port und kommuniziert, aber wieder keine Info zurück, egal was geschrieben ist.

UPDATE2: Es sieht aus wie es Gerätetreiber verwandt sein könnte. Einige zusätzliche Hintergrunduntersuchungen legen nahe, dass einige PL2303-Chips Funktionen zur Unterstützung von Halbduplex unterstützen, dies wird jedoch von den Linux-Treibern nicht unterstützt. Die Windows-Demo-App wird mit einem dedizierten Gerätetreiber ausgeliefert, und die App funktioniert nicht auf einem sauberen Testcomputer mit Standard-Windows-Treibern. Das lässt mich denken, dass ich, obwohl ich mich erfolgreich über Python mit ihm verbinden kann, die Duplex-Kommunikation nicht steuern kann (z. B. sogar auf eine STX/ETX-Weise), und deshalb könnte dies ein hoffnungsloser Fall sein. Seufzer.

UPDATE3: Danke für die Kommentare unten. Ich konnte jedoch keinen Weg finden. Ich habe einen USB-Protokollanalysator ausprobiert, und ich habe versucht, den Treiber zu demontieren, aber es wurde nur ziemlich zeitaufwendig, so dass ich am Ende das Gerät auseinander genommen habe und nach einigem Basteln den vorhandenen USB-Seriell-Adapter durch einen richtigen PL2303-Teil ersetzt habe - Auf der Geräteseite war es nur eine grundlegende 2-Draht-serielle Schnittstelle, so dass es egal war, was damit zu tun hatte. Ich kann diese Frage nicht schließen, also lasse ich sie so wie sie ist.

+0

Haben Sie versucht, eine serielle Kommunikation Programm, Minicom, zum Beispiel an das Gerät auf Ihrem Linux-Box zu sprechen? Dadurch können Sie überprüfen, ob das Gerät unter Linux funktioniert, bevor Sie in eine Python-Implementierung eintauchen. – sizzzzlerz

+0

Ja - Ich habe versucht, mit Minicom zu sprechen, aber ich bekomme keine Antwort - aber ich kann keine Möglichkeit finden, manuell auf RTS in minicom umschalten, weshalb ich Python ausprobiert. Ich weiß, dass pySerial sich mit dem Gerät verbindet und Daten sendet (siehe oben ref. Flashy lights :)). –

+0

Woher hast du den Fahrer? Ist es Teil Ihrer Distribution oder haben Sie es von Hand gebaut? Bist du root? – tMC

Antwort

1

Versuchen

s.flush() 

kurz nach Ihrem s.write Anruf