PySerial vorhandene Ports auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Tyll
User
Beiträge: 21
Registriert: Dienstag 6. August 2013, 12:52

Dienstag 6. August 2013, 13:29

Hallo Leute bin neu hier und hab auch direkt ein erstes Problem.
Ich bin derzeit eine Software am schreiben mit dem ich, von verschiedenen Geräten, Werte auslese und danach als Diagramm darstelle.

Jetzt zum Problem:
Die verbindung zu dem Gerät baue ich mit dieser Zeile auf:

Code: Alles auswählen

self.Socket = serial.Serial(self.schnitstelle, self.baudrate, timeout=5)
1. Möchte ich aber bevor die verbindung hergestellt wir überprüfen ob das Gerät überhaupt angeschlossen ist
2. Eine Liste aller an den Rechner angeschlossenen geräte haben damit ich diese in einem Menü auswählen kann.
3. Prüfen ob das Gerät eingeschaltet ist (werte sendet)

Ich diese Probleme schon im internet gesucht aber nicht brauchbares gefunden oder ich habe es übersehen ?
Wäre toll wenn mir jemand helfen kann.

MFG TYLL
BlackJack

Dienstag 6. August 2013, 14:00

@Tyll: Bei seriellen Ports sollte man das im Grunde selber wissen. Testen ist in sofern schlecht als das man a) nichts an den Einstellungen ändern darf, weil man dadurch etwas verstellen kann was dann falsch ist, und b) angeschlossene Geräte auch passiv sein können, das heisst man bemerkt sie erst wenn man Daten schickt.
Tyll
User
Beiträge: 21
Registriert: Dienstag 6. August 2013, 12:52

Mittwoch 7. August 2013, 08:45

a) Also habe ich keinen Möglichkeit als zu warten bis der Verbindungsaufbau fehlgeschlagen ist, ich die Exception abfange und dann erst dem benutzer eine Rückmeldung geben kann?

b) Das kann sein aber der Rechner erkennt doch trozdem ob an dem anschluss etwas eingesteckt ist. Und mehr muss ich garnicht wissen ! In dem Programm HTERM geht das halt auch !

Und ich hab noch eine frage :
Derzeit muss ich zu meinen Gerät immer kurz eine Verbindung auf bauen diese dann wieder schließen um sie dann wieder auf zu bauen.
Das muss ich machen weil ich sonst einmal einen unvollständiege Datensatz empfange. Daurch das ich immer 27 bit lese ich aber keine 27 empfange kommen zu den unvollständigen Daten der nächste Datensatz und das ist natürlich nicht richtig. Gibt es da eine möglichkeit das schöner und sicher zu lösen ?

Code: Alles auswählen

self.Socket = serial.Serial(self.schnitstelle, self.baudrate, timeout=5)
        self.Socket.close()
        time.sleep(2)

        #Verbindung wird aufgebaut
        self.Socket = serial.Serial(self.schnitstelle, self.baudrate, timeout=5)
BlackJack

Mittwoch 7. August 2013, 10:55

@Tyll: Erkennt der Rechner tatsächlich zuverlässig das etwas angeschlossen ist? Bei jedem beliebigen Gerät? Wenn das in HTERM geht, dann müsstest Du herausfinden wie HTERM das macht.

Ob ich die neue Frage richtig verstanden habe weiss ich nicht genau. Du sprichst mit dem Gerät nicht das Protokoll und dadurch sind Gerät und Programm nicht mehr „synchron”? Dann sprich das Protokoll halt vernünftig. Das wäre die sauberste Lösung.

Falls Du das schliessen und neu öffnen als Umgehungslösung für die Synchronisierung der Kommunikation verwendest, würde ich das eher umkehren. Also nicht ständig eine Verbindung offen halten und die dann zwischenzeitlich kurz unterbrechen, sondern nur dann aufbauen wenn Du kommunizieren willst und am Ende einer Teilkommunikation dann wieder schliessen.

Ich würde die Verbindung übrigens nicht `Socket` nennen, denn Sockets gibt es ja auch, die haben aber eine andere API. Das ist ein wenig verwirrend. Und Attribute werden per Konvention mit Kleinbuchstaben benannt. Allerhöchstens `mixedCase` aber in keinem mir bekannten Stil-Leitfaden mit einem führenden Grossbuchstaben. Das ist für Klassennamen, oder bei kompletter Grossschreibung für Konstanten vorbehalten.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Mittwoch 7. August 2013, 11:12

Hi,

schau dir das mal an: https://gist.github.com/crmccreary/3491834
Funktioniert zumindest unter Windows. Ich benutze es auch in einer etwas angepassten Version
Das zeigt alle vorhandenen Com Ports an. Wenn du dann versuchst den Port einmal zu öffnen, egal mit welcher Baudrate etc, siehst du ob dort auch ein Gerät hinter ist
Zuletzt geändert von JonasR am Mittwoch 7. August 2013, 11:14, insgesamt 1-mal geändert.
BlackJack

Mittwoch 7. August 2013, 11:14

@JonasR: Das Problem was ich bei dem Ansatz sehe ist, dass ein Öffnen mit einer Baudrate die Baudrateneinstellung für diesen Port verändert. Das ist blöd wenn das ein anderes Programm bereits gemacht hat, und nun nicht damit rechnet, dass ein anderes Programm daherkommt und das einfach so ändert.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Mittwoch 7. August 2013, 11:19

@BlackJack, ich glaube wir hatten das Thema schonmal... Kann mich aber nicht mehr an das Ergebnis erinnern.

Serielle Ports kann man doch nur exklusiv öffnen oder nicht? Sprich ich kann niemandem die Session klauen. Und beim neuen Verbindungsaufbau sollte doch jedes Programm solche Einstellungen machen.

Edit: Ich habe in dem Thema übrigens nur Windows Erfahrungen.
Antworten