Vollständige Beispiele für die Verwendung des pySerial-Pakets [geschlossen]

94

Kann mir bitte jemand einen vollständigen Python-Beispielcode zeigen, der pyserial verwendet ? Ich habe das Paket und frage mich, wie ich die AT-Befehle senden und zurücklesen soll!

Gath
quelle

Antworten:

87

Blogbeitrag Serielle RS232-Verbindungen in Python

import time
import serial

# configure the serial connections (the parameters differs on the device you are connecting to)
ser = serial.Serial(
    port='/dev/ttyUSB1',
    baudrate=9600,
    parity=serial.PARITY_ODD,
    stopbits=serial.STOPBITS_TWO,
    bytesize=serial.SEVENBITS
)

ser.isOpen()

print 'Enter your commands below.\r\nInsert "exit" to leave the application.'

input=1
while 1 :
    # get keyboard input
    input = raw_input(">> ")
        # Python 3 users
        # input = input(">> ")
    if input == 'exit':
        ser.close()
        exit()
    else:
        # send the character to the device
        # (note that I happend a \r\n carriage return and line feed to the characters - this is requested by my device)
        ser.write(input + '\r\n')
        out = ''
        # let's wait one second before reading output (let's give device time to answer)
        time.sleep(1)
        while ser.inWaiting() > 0:
            out += ser.read(1)

        if out != '':
            print ">>" + out
Framester
quelle
8
Ich habe serial.serialutil.SerialException: Port is already openbeim Ausführen dieses Codes eine Fehlermeldung erhalten . Ich bin mir nicht sicher, aber ich glaube, dass die serielle Schnittstelle automatisch geöffnet wird, wenn sie explizit definiert wird, wie Sie es getan haben ser. Nach dem Auskommentieren der ser.open()Zeile hat es funktioniert.
user3817250
Dieser Kommentar ist der Retter.
Saurabh Agarwal
1
@ user3817250: Alternativ machen Sie einfach einen if-Fall um denser.open()
arc_lupus
1
Übrigens hat ein ser.isopen () für sich genommen keine Bedeutung. Sie können isopen (r) in einer Bedingung verwenden, um zu überprüfen, ob es bereits geöffnet ist, bevor Sie versuchen, es selbst zu öffnen. Wenn ja, kann dies darauf hinweisen, dass Ihr Programm bereits an anderer Stelle ausgeführt wird. Verwenden Sie dann Python Fu, um den anderen Prozess abzubrechen, und wiederholen Sie das Öffnen. stackoverflow.com/questions/6178705/…
SDsolar
1
Hallo, toller Code! Ich habe eine Frage, wie würden Sie sich ändern, wenn Sie stattdessen Python 3 verwenden?
Luis Jose
46
import serial
ser = serial.Serial(0)  # open first serial port
print ser.portstr       # check which port was really used
ser.write("hello")      # write a string
ser.close()             # close port

Verwenden Sie https://pythonhosted.org/pyserial/ für weitere Beispiele

Bayda
quelle
27

http://web.archive.org/web/20131107050923/http://www.roman10.net/serial-port-communication-in-python/comment-page-1/

#!/usr/bin/python

import serial, time
#initialization and open the port

#possible timeout values:
#    1. None: wait forever, block call
#    2. 0: non-blocking mode, return immediately
#    3. x, x is bigger than 0, float allowed, timeout block call

ser = serial.Serial()
#ser.port = "/dev/ttyUSB0"
ser.port = "/dev/ttyUSB7"
#ser.port = "/dev/ttyS2"
ser.baudrate = 9600
ser.bytesize = serial.EIGHTBITS #number of bits per bytes
ser.parity = serial.PARITY_NONE #set parity check: no parity
ser.stopbits = serial.STOPBITS_ONE #number of stop bits
#ser.timeout = None          #block read
ser.timeout = 1            #non-block read
#ser.timeout = 2              #timeout block read
ser.xonxoff = False     #disable software flow control
ser.rtscts = False     #disable hardware (RTS/CTS) flow control
ser.dsrdtr = False       #disable hardware (DSR/DTR) flow control
ser.writeTimeout = 2     #timeout for write

try: 
    ser.open()
except Exception, e:
    print "error open serial port: " + str(e)
    exit()

if ser.isOpen():

    try:
        ser.flushInput() #flush input buffer, discarding all its contents
        ser.flushOutput()#flush output buffer, aborting current output 
                 #and discard all that is in buffer

        #write data
        ser.write("AT+CSQ")
        print("write data: AT+CSQ")

       time.sleep(0.5)  #give the serial port sometime to receive the data

       numOfLines = 0

       while True:
          response = ser.readline()
          print("read data: " + response)

        numOfLines = numOfLines + 1

        if (numOfLines >= 5):
            break

        ser.close()
    except Exception, e1:
        print "error communicating...: " + str(e1)

else:
    print "cannot open serial port "
engaso
quelle
2

Ich habe pyserial nicht verwendet, aber basierend auf der API-Dokumentation unter https://pyserial.readthedocs.io/en/latest/shortintro.html scheint es eine sehr schöne Oberfläche zu sein. Es kann sich lohnen, die Spezifikation für AT-Befehle des Geräts / Radios / zu überprüfen, mit dem Sie es zu tun haben.

Insbesondere erfordern einige eine gewisse Ruhephase vor und / oder nach dem AT-Befehl, damit er in den Befehlsmodus wechselt. Ich bin auf einige gestoßen, die das Lesen der Antwort nicht ohne Verzögerung mögen.

Paul Osborne
quelle