2013-04-18 103 views
11

Tôi đang gặp khó khăn khi đọc nhiều hơn một ký tự sử dụng chương trình của mình, có vẻ như tôi không biết có vấn đề gì với chương trình của mình , vì tôi rất mới với python.Python Serial: Cách sử dụng chức năng đọc hoặc đọc để đọc nhiều hơn 1 ký tự tại một thời điểm

import serial 

ser = serial.Serial(
    port='COM5',\ 
    baudrate=9600,\ 
    parity=serial.PARITY_NONE,\ 
    stopbits=serial.STOPBITS_ONE,\ 
    bytesize=serial.EIGHTBITS,\ 
     timeout=0) 

print("connected to: " + ser.portstr) 
count=1 

while True: 
    for line in ser.read(): 

     print(str(count) + str(': ') + chr(line)) 
     count = count+1 

ser.close() 

đây là kết quả tôi nhận được

connected to: COM5 
1: 1 
2: 2 
3: 4 
4: 3 
5: 1 

tôi đã thực sự mong

connected to: COM5 
1:12431 
2:12431 

một cái gì đó này như nêu trên có khả năng đọc nhiều ký tự cùng một lúc không ai bằng một.

Trả lời

3

Nối tiếp gửi dữ liệu 8 bit tại một thời điểm, dịch thành 1 byte và 1 byte có nghĩa là 1 ký tự.

Bạn cần triển khai phương pháp của riêng mình có thể đọc ký tự vào bộ đệm cho đến khi đạt được một số nội dung gửi. Quy ước là gửi một tin nhắn như 12431\n cho biết một dòng. Vì vậy, những gì bạn cần làm là để thực hiện một bộ đệm sẽ lưu trữ X số ký tự và ngay sau khi bạn đạt được rằng \n, thực hiện hoạt động của bạn trên dòng và tiến hành đọc dòng tiếp theo vào bộ đệm.

Note bạn sẽ phải chăm sóc các trường hợp tràn bộ đệm tức là khi một dòng nhận được đó là dài hơn đệm của bạn vv ...

EDIT

import serial 

ser = serial.Serial(
    port='COM5',\ 
    baudrate=9600,\ 
    parity=serial.PARITY_NONE,\ 
    stopbits=serial.STOPBITS_ONE,\ 
    bytesize=serial.EIGHTBITS,\ 
     timeout=0) 

print("connected to: " + ser.portstr) 

#this will store the line 
line = [] 

while True: 
    for c in ser.read(): 
     line.append(c) 
     if c == '\n': 
      print("Line: " + line) 
      line = [] 
      break 

ser.close() 
+0

Hi, bạn có thể cho tôi một số hướng dẫn trên đệm? Tôi thực sự bối rối ngay bây giờ. – user2294001

+0

Tôi đã chỉnh sửa mã, hãy xem. Chỉ cần nhớ một điều, mã ở trên sẽ GIỮ đọc vào mảng 'line' cho đến khi nó thấy ký tự' \ n' để đảm bảo rằng trong thiết bị nối tiếp của bạn gửi một '\ n'. – 1337holiday

+0

Xin chào, các mã aboves dường như không hoạt động. nó nói char không được định nghĩa. – user2294001

21

Tôi thấy một số vấn đề.

Đầu tiên:

ser.read() chỉ trả về 1 byte mỗi lần.

Nếu bạn chỉ định một số

ser.read(5) 

nó sẽ đọc 5 byte (ít hơn nếu thời gian chờ occurrs trước 5 byte đến.)

Nếu bạn biết rằng đầu vào của bạn luôn được kết thúc đúng với các nhân vật EOL, cách tốt hơn là sử dụng

ser.readline() 

Điều đó sẽ tiếp tục đọc các ký tự cho đến khi nhận được EOL.

Thứ hai:

Thậm chí nếu bạn nhận được ser.read() hoặc ser.readline() để trả về nhiều byte, vì bạn đang lặp lại so với giá trị trả về, bạn sẽ vẫn được xử lý nó một byte tại một thời gian.

Hãy loại bỏ

for line in ser.read(): 

và chỉ nói:

line = ser.readline() 
+0

Xin chào, khi tôi đang sử dụng line = ser.readline(), nó luôn yêu cầu tôi in số nguyên (str (count) + str (':') + chr (dòng)) LoạiError: số nguyên là bắt buộc – user2294001

+0

chr (dòng) đang mong đợi đối số nguyên. Bạn đang cho nó một chuỗi. – jwygralak67

1

Tôi đã reciving một số ngày từ Arduino uno của tôi (0-1023 số). Sử dụng mã từ 1337holiday, jwygralak67 và một số lời khuyên từ các nguồn khác:

import serial 
import time 

ser = serial.Serial(
    port='COM4',\ 
    baudrate=9600,\ 
    parity=serial.PARITY_NONE,\ 
    stopbits=serial.STOPBITS_ONE,\ 
    bytesize=serial.EIGHTBITS,\ 
     timeout=0) 

print("connected to: " + ser.portstr) 

#this will store the line 
seq = [] 
count = 1 

while True: 
    for c in ser.read(): 
     seq.append(chr(c)) #convert from ANSII 
     joined_seq = ''.join(str(v) for v in seq) #Make a string from array 

     if chr(c) == '\n': 
      print("Line " + str(count) + ': ' + joined_seq) 
      seq = [] 
      count += 1 
      break 


ser.close() 
+1

Tôi nghĩ nhận xét của bạn #convert từ ansii phải là #convert từ ascii –

+0

@NatoSaichek có, bạn nói đúng, cảm ơn bạn! – Desprit