COM Port mit python und senden von Daten

Gast #3701303
Hallo Leute,
hab schwierigkeiten mit Python über dem COM-Port daten zu senden. Ich 
wollte einfach mal nach dem Enter einen reboot befehl senden, allerdings 
bekomme ich immer "error communications". Woran kann es liegen? Hier ein 
kleiner Code:

import serial
import sys
import threading
import re
import time

ser = serial.Serial( port=COM1,
         baudrate=115200,
         bytesize=serial.EIGHTBITS,
         parity=serial.PARITY_NONE,
         timeout=2)
try:

    print ("Serial port is open")
    ser.isOpen()

except Exception:

    print ("error open serial port: " + str(e))

    exit()

if ser.isOpen():
    try:
        ser.write('\r')
        ser.write('reboot')
        print("write data: reboot")

    except Exception:
        print ("error communicating...: " + str())
else:
    print ("cannot open serial port ")

Vielen Dank im Vorraus!

Gruß
Max
Gast #3701364
Andreas Schweigstill schrieb:
> ser = serial.Serial( port='COM1',
Wenn er wirklich COM1 haben will, muss er (glaube ich) 'COM0' angeben, 
da das bei M$ immer um eins verschoben ist.

ser = serial.Serial( port='COM0'

oder:

COM1 = 'COM0'
ser = serial.Serial( port=COM1,

Aber sonsten hast du natuerlich recht: der Portname muss als string 
angegeben werden, wie unter linux auch (port='/dev/ttyUSB0', z.B.)

Gruesse
(Firma: Schweigstill IT) Persönliche Seite #3701370
Kaj schrieb:
> Wenn er wirklich COM1 haben will, muss er (glaube ich) 'COM0' angeben,
> da das bei M$ immer um eins verschoben ist.

Das ist doch eher umgekehrt. Die Beschriftungen an Motherboards und 
Einsteckkarten beziehen sich meist auf die alte DOS-Konvention mit COM1 
als erstem Port. Unter unixoiden BS beginnt die Zählung jedoch mit 0, 
z.B. /dev/ttyS0 == COM1.
Gast #3701491
Hallo,
erstmal danke für die Feedbacks. Ich habe es nun korrigiert. Nun wenn 
ich es so ändere:
"ser = serial.Serial( port='COM1',..."
dann habe ich die gleiche Meldung wieder "error communicating..." . Wenn 
ich es nun auf 'COM0' ändere dann bekomme ich eine menge von 
Fehlermeldungen beim compilieren.

Gruß
Max
Moderator #3701510
Max schrieb:
>         ser.write('\r')
>         ser.write('reboot')

Du verwendest offensichtlich Python 3. Dort sind die Strings '\r' und
'reboot' Unicode-Strings, mit denen pySerial nichts anzufangen weiß.
Nimm stattdessen Byte-Strings:
1
         ser.write(b'\r')
2
         ser.write(b'reboot')
Moderator #3701554
Noch ein paar Anmerkungen:

port='COM1' läuft nur auf Windows, port='/dev/ttyS0' nur auf Linux,
port=0 hingegen auf beidem. Die 0 wird von pySerial automatisch in den
richtigen Pseudodateinamen umgesetzt.

Das erste try-except sollte das Öffnen der Schnittstelle umschließen,
sonst steigt das Programm im Fehlerfall dort schon aus, ohne die von dir
vorgesehene Fehlermeldung auszugeben. Die Abfrage ser.isOpen() kannst du
dir dann sparen.

Die prints in den except-Zweigen sind beide fehlerhaft: Im ersten Fall
ist die Variable e undefiniert, im zweiten Fall hat die str-Funktion
kein Argument und liefert somit immer den Leerstring zurück.

Hier ist eine korrigierte Fassung des PRogramms:
1
import serial
2
import sys
3
import threading
4
import re
5
import time
6

7
try:
8
    ser = serial.Serial( port=0,
9
                         baudrate=115200,
10
                         bytesize=serial.EIGHTBITS,
11
                         parity=serial.PARITY_NONE,
12
                         timeout=20000 )
13
    print ("Serial port is open")
14
except Exception as e:
15
    print ("error open serial port: " + str(e))
16
    exit()
17

18
try:
19
    ser.write(b'\r')
20
    ser.write(b'reboot')
21
    print("write data: reboot")
22
except Exception as e:
23
    print ("error communicating...: " + str(e))
Gast #3702667
Hallo Leute,
vieleicht noch eine kurze Frage:
Wie ist es in Python3 das lesen vom COM Port möglich?

ser.read('Waiting for connection','r')

anscheinend funktioniert es so nicht!

Gruß
Max
Moderator #3703244
Max schrieb:
> ser.read('Waiting for connection','r')
>
> anscheinend funktioniert es so nicht!

Wie kommst du darauf, dass das funktionieren könnte?

Die read-Methode erwartet 1 Integer-Argument, nämlich die Anzahl der zu
lesenden Bytes. Man darf dieses Argument auch weglassen, dann wird ein
Default von 1 genommen. Du übergibst stattdessen aber 2 Strings. Was
möchtest du damit überhaupt bezwecken?

Hier ist noch die Doku zu read:

1
Help on method read in module serial.serialposix:
2

3
read(self, size=1) method of serial.serialposix.Serial instance
4
    Read size bytes from the serial port. If a timeout is set it may
5
    return less characters as requested. With no timeout it will block
6
    until the requested number of bytes is read.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.