Contoh lengkap penggunaan paket pySerial [ditutup]

96

Dapatkah seseorang menunjukkan kepada saya kode sampel python lengkap yang menggunakan pyserial , saya memiliki paketnya dan saya bertanya-tanya bagaimana cara mengirim perintah AT dan membacanya kembali!

Gath
sumber

Jawaban:

88

Posting blog Koneksi serial RS232 dengan 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
sumber
8
Saya menerima kesalahan serial.serialutil.SerialException: Port is already opensaat menjalankan kode ini. Saya tidak yakin akan hal ini, tetapi saya yakin port serial secara otomatis dibuka ketika secara eksplisit didefinisikan seperti yang telah Anda lakukan ser. Setelah mengomentari ser.open()baris itu berhasil.
pengguna3817250
Komentar ini adalah penyelamat.
saurabh agarwal
1
@ user3817250: Atau cukup buat kasus-kasus di sekitarser.open()
arc_lupus
1
btw, memiliki ser.isopen () dengan sendirinya tidak ada artinya. Anda dapat menggunakan isopen (r) dalam kondisi bersyarat untuk memeriksa apakah sudah terbuka, tentu saja, sebelum Anda mencoba membukanya sendiri .. Jika demikian, ini mungkin menunjukkan program Anda sudah berjalan di tempat lain. Kemudian gunakan beberapa Python Fu untuk menghentikan proses lainnya dan kemudian coba buka lagi. stackoverflow.com/questions/6178705/…
SDsolar
1
Hai, kode yang bagus! Saya punya pertanyaan, bagaimana Anda akan berubah jika Anda menggunakan python 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

gunakan https://pythonhosted.org/pyserial/ untuk contoh lainnya

bayda
sumber
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
sumber
2

Saya belum pernah menggunakan pyserial tetapi berdasarkan dokumentasi API di https://pyserial.readthedocs.io/en/latest/shortintro.html sepertinya antarmuka yang sangat bagus. Mungkin ada baiknya memeriksa ulang spesifikasi untuk perintah AT dari perangkat / radio / apa pun yang Anda hadapi.

Secara khusus, beberapa memerlukan beberapa periode diam sebelum dan / atau setelah perintah AT untuk masuk ke mode perintah. Saya telah menemukan beberapa yang tidak suka membaca respon tanpa penundaan terlebih dahulu.

Paul Osborne
sumber