Exemples complets d'utilisation du package pySerial [fermé]


96

Quelqu'un peut-il s'il vous plaît me montrer un exemple de code Python complet qui utilise pyserial , j'ai le paquet et je me demande comment envoyer les commandes AT et les relire!

Réponses:


88

Billet de blog Connexions série RS232 en 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

8
J'ai reçu une erreur serial.serialutil.SerialException: Port is already openlors de l'exécution de ce code. Je ne suis pas certain à ce sujet, mais je pense que le port série est automatiquement ouvert lorsqu'il est explicitement défini comme vous l'avez fait ser. Après avoir commenté la ser.open()ligne, cela a fonctionné.
user3817250

Ce commentaire est le sauveur.
saurabh agarwal

1
@ user3817250: Sinon, créez simplement un if-case autour duser.open()
arc_lupus

1
btw, avoir un ser.isopen () en lui-même n'a aucune signification. Vous pouvez utiliser isopen (r) dans un conditionnel pour vérifier s'il est déjà ouvert, bien sûr, avant d'essayer de l'ouvrir vous-même. Si c'est le cas, cela peut indiquer que votre programme est déjà en cours d'exécution ailleurs. Ensuite, utilisez du Python Fu pour tuer l'autre processus, puis réessayez l'ouverture. stackoverflow.com/questions/6178705/…
SDsolar

1
Salut, super code! J'ai une question, comment changeriez-vous si vous utilisiez python 3 à la place?
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

utilisez https://pythonhosted.org/pyserial/ pour plus d'exemples


28

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 "

2

Je n'ai pas utilisé pyserial mais basé sur la documentation de l'API à https://pyserial.readthedocs.io/en/latest/shortintro.html, cela semble être une très belle interface. Cela peut valoir la peine de vérifier la spécification des commandes AT de l'appareil / de la radio / de tout ce dont vous avez affaire.

Plus précisément, certains nécessitent une certaine période de silence avant et / ou après la commande AT pour qu'elle passe en mode commande. J'en ai rencontré certains qui n'aiment pas les lectures de la réponse sans un certain délai.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.