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!

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

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


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

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ń.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.