Pełne przykłady korzystania z pakietu pySerial [zamknięty]

96

Czy ktoś może mi pokazać pełny przykładowy kod Pythona, który używa pyserial , mam pakiet i zastanawiam się, jak wysłać polecenia AT i odczytać je z powrotem!

Gath
źródło

Odpowiedzi:

88

Wpis na blogu Szeregowe połączenia RS232 w Pythonie

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
źródło
8
Otrzymałem błąd serial.serialutil.SerialException: Port is already openpodczas uruchamiania tego kodu. Nie jestem tego pewien, ale uważam, że port szeregowy jest automatycznie otwierany, gdy jest wyraźnie zdefiniowany, tak jak to zrobiłeś ser. Po zakomentowaniu ser.open()linii zadziałało.
user3817250
Ten komentarz jest zbawcą.
saurabh agarwal
1
@ user3817250: Ewentualnie po prostu zrób przypadek if-case wokółser.open()
arc_lupus
1
btw, samo posiadanie usługi ser.isopen () nie ma żadnego znaczenia. Możesz użyć isopen (r) w warunku, aby sprawdzić, czy jest już otwarty, zanim spróbujesz go samodzielnie otworzyć. Jeśli tak, może to oznaczać, że Twój program jest już uruchomiony w innym miejscu. Następnie użyj Python Fu, aby zabić inny proces, a następnie ponów próbę otwarcia. stackoverflow.com/questions/6178705/…
SDsolar
1
Cześć, świetny kod! Mam pytanie, jak byś się zmienił, gdybyś zamiast tego używał Pythona 3?
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

używać https://pythonhosted.org/pyserial/ więcej przykładów

bayda
źródło
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
źródło
2

Nie używałem pyserial, ale na podstawie dokumentacji API na https://pyserial.readthedocs.io/en/latest/shortintro.html wydaje się, że jest to bardzo ładny interfejs. Warto dwukrotnie sprawdzić specyfikację poleceń AT urządzenia / radia / czegokolwiek, z czym masz do czynienia.

W szczególności niektóre wymagają pewnego okresu ciszy przed i / lub po poleceniu AT, aby wejść w tryb poleceń. Spotkałem niektórych, którzy nie lubią odczytywać odpowiedzi bez opóźnień.

Paul Osborne
źródło