Ejemplos completos de uso del paquete pySerial [cerrado]

96

¿Alguien puede mostrarme un código de muestra completo de Python que use pyserial , tengo el paquete y me pregunto cómo enviar los comandos AT y leerlos de nuevo!

Gath
fuente

Respuestas:

88

Publicación de blog Conexiones serie 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
Framester
fuente
8
Recibí un error serial.serialutil.SerialException: Port is already openal ejecutar este código. No estoy seguro de esto, pero creo que el puerto serie se abre automáticamente cuando se define explícitamente como lo ha hecho ser. Después de comentar la ser.open()línea funcionó.
user3817250
Este comentario es el salvador.
saurabh agarwal
1
@ user3817250: Alternativamente, simplemente haga un if-case alrededor delser.open()
arc_lupus
1
por cierto, tener un ser.isopen () por sí solo no tiene ningún significado. Puede usar isopen (r) en un condicional para verificar si ya está abierto, por supuesto, antes de intentar abrirlo usted mismo. Si es así, puede indicar que su programa ya se está ejecutando en otro lugar. Luego use Python Fu para matar el otro proceso y luego vuelva a intentar abrir. stackoverflow.com/questions/6178705/…
SDsolar
1
¡Hola, gran código! Tengo una pregunta, ¿cómo cambiarías si usas Python 3 en su lugar?
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

use https://pythonhosted.org/pyserial/ para obtener más ejemplos

Bayda
fuente
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 "
engaso
fuente
2

No he usado pyserial pero me baso en la documentación de la API en https://pyserial.readthedocs.io/en/latest/shortintro.html , parece una interfaz muy agradable. Podría valer la pena verificar dos veces la especificación de los comandos AT del dispositivo / radio / lo que sea que esté tratando.

Específicamente, algunos requieren un período de silencio antes y / o después del comando AT para que ingrese al modo de comando. Me he encontrado con algunos a los que no les gustan las lecturas de la respuesta sin demora primero.

Paul Osborne
fuente