serial communication /dev/ttyUSB0

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
xd2020
User
Beiträge: 4
Registriert: Donnerstag 12. Juni 2008, 17:05

Ich frage mich wie man auf einfache weise die serielle schnittstelle anspricht

zuerst muss ich die schnittstelle öffnen mit 9600 Baud und 8n1 SoftwareFlowControll

dann möchte ich einen Teststring ausgeben, und ihn danach wieder empfangen (zum test ist die serielle schnittstelle durchgeschleift)


bisher habe ich:

console = open('/dev/ttyUSB0', 'w')
console.write('blah')


nur wie lese ich jetzt, und wie stelle ich die schnittstellenparameter ein ?
xd2020
User
Beiträge: 4
Registriert: Donnerstag 12. Juni 2008, 17:05

naja das hab ich auch schon angeschaut, was ich ausgeben muss und empfangen sind jedoch nur kleine hexadezimalwerte, und ich habe auf dem device nicht viel speicherplatz, deshlab möchte ich das so shlank wie möglich haben. Irgendwie muss es doch funktionieren dass man diese werte einfach rein und rausschiebt, wenn man schon ein interface auf /dev/ttyXX hat
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

xd2020 hat geschrieben:Irgendwie muss es doch funktionieren dass man diese werte einfach rein und rausschiebt, wenn man schon ein interface auf /dev/ttyXX hat
Hallo xd2020!

Nimm trotzdem pyserial. Du kannst es dir ja auf deine Bedürfnisse abspecken. Wenn du nur die Module verwendest, die du unbedingt brauchst, dann bist du schon auf 30 kByte runter. Und aus den Modulen kannst du auch noch alles raus löschen was du nicht brauchst.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
lunar

xd2020 hat geschrieben:naja das hab ich auch schon angeschaut
Das bezweifele ich, sonst ...
Irgendwie muss es doch funktionieren dass man diese werte einfach rein und rausschiebt, wenn man schon ein interface auf /dev/ttyXX hat
... hättest du nicht nur gewusst, dass das möglich ist, sondern auch wie. Die Website erwähnt nämlich, dass pyserial für POSIX-Systeme ausschließlich die Python-Standardbibliothek nutzt. Es wäre also kein Problem gewesen, einfach in den Quellcode zu schauen ...

Natürlich ist es sinnvoller, dass Rad nicht neu zu erfinden, sondern pyserial selbst zu verwenden, und es um alles zu erleichtern, was man nicht benötigt ... aber das hat gerold ja schon gesagt.
xd2020
User
Beiträge: 4
Registriert: Donnerstag 12. Juni 2008, 17:05

gerold hat geschrieben: aus den Modulen kannst du auch noch alles raus löschen was du nicht brauchst.
Aus dem Grund dachte ich, dass ich dann ja gleich die Schnittstelle direkt ansteuern kann, wenn ich sowieso das meiste rauslösche. Ich bin ja auch imemr dafür das Rad nicht neu zu erfinden. Auf der anderen seite jedoch auch, wenn etwas sowieso schon vom System bereit gestellt wird möchte ich in machen fällen eben auch direkt zugreifen. Was bring mir denn pyserial wenn ich sowieso nur ein paar HEX zeichen raus schieben muss und dann wieder einen Status empfangen. (Relais Ansteuerung) Ich habe das gefühl, dass mir dann alles was dazwischen ist und auch noch etwas kontrollieren will manchmal mehr probleme macht , als es nutzen bringt.

Ich habe dort nur Teile gefunden wie

Code: Alles auswählen

ispeed = ospeed = getattr(TERMIOS,'B%s' % (self._baudrate))
buf = os.read(self.fd, size-len(read))
n = os.write(self.fd, d)
Ich dachte ursprünglich, dass die idee es mit einem einfachen
Baudrate irgendwo (wo weis ich ja nicht) definieren, Die Flusskontrolle setzen (...)

dann

Code: Alles auswählen

console = open('/dev/ttyUSB0', 'w') 
zu schreiben, und vielleicht auf ähnliche weise anstehende Daten abzuholen. Das währe eben schlank und einfach. (naja ich muss zugeben, dass ich bisher hauptsächlich PHP Programmiere und mit Python noch nicht so viel erfahrung habe, deshalb kann ich auch nicht abschätzen was mit pySerial bietet. Ich schaue mir jetzt seit einiger Zeit den Sourcecode an, und finde den Part nicht in dem der eigentlich zugriff stattfindet. )

Also wenn jemand der sich auskennt behauptet "Vergiss es, selbst das schreiben von ein paar Daten auf Seriell ist sooo komplex dass pyserial besser ist" dann nehme ich pyserial.Aber wenn es wirklich so einfach ist mit open (..,'w') direkt in /dev/ttyXX zu schrieben, dann sehe ich den Vorteil von pyserial nicht bei meiner anwendung. Etwas anderes währe, wenn ich komplette kommunikation machen müsste, und ganze files, oder Datenmengen drüber schaufeln müsste. Dann sehe ich den Vorteil von Pyserial. Aber gilt das auch für ein paar poplige zeichen ?
nur irgendwie , daich ja weis, dass die eigentliche Schnittstelle in Posix ist, und schon vorhanden, und das pyserial ja eigentlich nur ein Framework ist , was darauf aufsetzt... Ich brauche aber die ganzen Exeptions nicht und so...
lunar

Du selbst hast offenbar keine Ahnung von seriellen Schnittstellen (nichts für ungut). Du bist also eh auf eine Abstraktionsschicht angewiesen. Wo liegt dann der Unterschied zwischen etwas eigenem oder eben einem fertigen und getesteten Modul wie pyserial?

Natürlich kannst du die serielle Schnittstelle auch direkt ansteuern, allerdings eben nicht über ``open``. Dafür musst du afaik auf Terminal-Settings und IO-Controls zurückgreifen. Diese API ist bedeutend komplexer, und verlangt nun mal eine gewisse Einarbeitung.

Ich persönlich bezweifele stark, dass 10 Kb Größenersparnis mehrere Stunden Mehraufwand rechtfertigen?

Imho willst du an der falschen Stelle optimieren. Wenn du dir 10 Kb mehr nicht leisten kannst, dann ist Python nun mal nicht die richtige Sprache. That's it ...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

xd2020 hat geschrieben:Was bring mir denn pyserial wenn ich sowieso nur ein paar HEX zeichen raus schieben muss und dann wieder einen Status empfangen.
Hallo xd2020!

Das **Schreiben** ist kein Problem. Das funktioniert wirklich so einfach, wie du dir das gedacht hast. Nur das Lesen wird schwieriger. Denn du kannst nie erwarten, dass du auch wirklich eine Rückmeldung bekommst. Und wenn du einfach nur wie aus einer Datei lesend darauf zu greifst, dann wird dein ganzes Programm blockiert. Du müsstest dich selber darum kümmern, dass irgendwann der Lesezugriff unterbrochen wird (was gar nicht mal so einfach ist). Außerdem müsstest du dich auch selber um die Einstellung der COM-Parameter kümmern. Und diese Punkte genügen schon um dir einen langen Programmiertag mit viel Frust zu bescheren.

Da ist es doch viel einfacher, ein fertiges Paket zu verwenden, welches nicht nur diese beiden Punkte, sondern noch viel mehr von dir abhält. Und ganz im Ernst. Wenn ich die Wahl zwischen 10 Minuten Arbeit und einem Nachmittag oder gar einem ganzen Tag Arbeit habe, dann nehme ich doch wohl eher die fertige Lösung dafür, oder?

Aber es hält dich niemand davon ab. Du kannst dich über den COM-Port informieren und dich selber um das Auslesen des COM-Ports kümmern. Das ist Python! Du darfst tun was du möchtest.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
xd2020
User
Beiträge: 4
Registriert: Donnerstag 12. Juni 2008, 17:05

Guten morgen, und danke für die Antworten...
gerold hat geschrieben: Das **Schreiben** ist kein Problem. Das funktioniert wirklich so einfach, wie du dir das gedacht hast. Nur das Lesen wird schwieriger.
naja , irgendwie dachte ich python ist eben so geeignet, weil man eben alles mögliche machen kann. Danke, dass du mir das wenigstens bestätigst...

Hmm nur das lesen...
Denn du kannst nie erwarten, dass du auch wirklich eine Rückmeldung bekommst.
Ich dachte dass das Buffering das Posix system übernimmt. Wenn Daten anliegen können die Abgeholt werden. Bei den Daten handelt es sich eben nur um drei oder vier Bytes, die dann da geholt werden müssten, der rest ist alles schreibzugriff. So würde das Locking, das du erwähnst eventuell gar nicht Stattfinden. Ich würde es ja einsehen, wenn das viele Daten währen. Es sind aber wirklich nur 4 Bytes.
Und wenn du einfach nur wie aus einer Datei lesend darauf zu greifst, dann wird dein ganzes Programm blockiert. Du müsstest dich selber darum kümmern, dass irgendwann der Lesezugriff unterbrochen wird (was gar nicht mal so einfach ist).
Das ist ein Argument, was durchaus Sinn ergibt. Doch gilt das auch, wenn es wirklich nur 4 Bytes sind ?

Außerdem müsstest du dich auch selber um die Einstellung der COM-Parameter kümmern.
Naja das hatte ich mir gedacht, dass man einfach einige Config Daten irgendwohin schreiben muss, und gut ist. Irgendwelche Register sind doch bestimmt für die Einstellung zuständig, die man direkt ansprechen kann.
Und diese Punkte genügen schon um dir einen langen Programmiertag mit viel Frust zu bescheren.

Da ist es doch viel einfacher, ein fertiges Paket zu verwenden, welches nicht nur diese beiden Punkte, sondern noch viel mehr von dir abhält.
Das ist schon Korrekt, mir geht es auch nicht um die 10K mehr im Programm. Viel mehr darum dass ich so wenig wie möglich zwischenschichten haben möchte. Doch wenn das wirklich so ein grosses Problem ist mit dem Empfangen von 4 Bytes. Dann ist es wohl besser ich nehme pyserial.

Danke dir für deine Antwort
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Egal welche Sprache:
Wenn es ein Modul gibt, das dir dein Leben vereinfacht, dann nutze es. Die Testen alles ordentlich und wollen das ja außerdem nicht umsonstn geschrieben haben ;)

Die Erfahrung zeigt, das man ohne nen Framework in der Regel erstmal selbst ein kleines Framework baut...und dann hat man erst recht nichts gewonnen :D
Antworten