Các ví dụ đầy đủ về việc sử dụng gói pySerial [đã đóng]


96

Ai đó có thể vui lòng cho tôi xem mã mẫu python đầy đủ sử dụng pyserial không , tôi có gói và đang tự hỏi làm thế nào để gửi các lệnh AT và đọc lại chúng!

Câu trả lời:


88

Bài đăng trên blog Các kết nối RS232 nối tiếp bằng 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
Tôi đã gặp lỗi serial.serialutil.SerialException: Port is already openkhi chạy mã này. Tôi không chắc chắn về điều này nhưng tôi tin rằng cổng nối tiếp được tự động mở khi nó được xác định rõ ràng như bạn đã làm với ser. Sau khi nhận xét ra ser.open()dòng nó đã hoạt động.
user3817250

Bình luận này là vị cứu tinh.
saurabh agarwal

1
@ user3817250: Ngoài ra, chỉ cần tạo if-case xung quanhser.open()
arc_lupus,

1
btw, tự nó có ser.isopen () không có bất kỳ ý nghĩa nào. Bạn có thể sử dụng isopen (r) trong một điều kiện để kiểm tra xem nó đã được mở chưa, tất nhiên trước khi bạn cố gắng tự mở nó .. Nếu vậy, nó có thể cho biết chương trình của bạn đã chạy ở nơi khác. Sau đó, sử dụng một số Python Fu để giết quá trình khác và sau đó thử mở lại. stackoverflow.com/questions/6178705/…
SDsolar,

1
Xin chào, mã tuyệt vời! Tôi có một câu hỏi, bạn sẽ thay đổi như thế nào nếu bạn sử dụng 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

sử dụng https://pythonhosted.org/pyserial/ để biết thêm ví dụ


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

Tôi chưa sử dụng pyserial nhưng dựa trên tài liệu API tại https://pyserial.readthedocs.io/en/latest/shortintro.html thì có vẻ như một giao diện rất đẹp. Bạn nên kiểm tra kỹ thông số kỹ thuật cho các lệnh AT của thiết bị / radio / bất cứ thứ gì bạn đang xử lý.

Cụ thể, một số yêu cầu một khoảng thời gian im lặng trước và / hoặc sau lệnh AT để nó vào chế độ lệnh. Tôi đã gặp một số không thích đọc phản hồi mà không bị chậm trễ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.