Tôi có chương trình python đang đọc dữ liệu từ cổng nối tiếp qua mô-đun PySerial
. Hai điều kiện tôi cần lưu ý là: Tôi không biết dữ liệu sẽ phát triển mạnh như thế nào, và tôi không biết khi nào cần dữ liệu.Sử dụng PySerial là nó có thể chờ dữ liệu không?
Dựa trên này, tôi đã nảy ra snipets đang sau:
#Code from main loop, spawning thread and waiting for data
s = serial.Serial(5, timeout=5) # Open COM5, 5 second timeout
s.baudrate = 19200
#Code from thread reading serial data
while 1:
tdata = s.read(500) # Read 500 characters or 5 seconds
if(tdata.__len__() > 0): #If we got data
if(self.flag_got_data is 0): #If it's the first data we recieved, store it
self.data = tdata
else: #if it's not the first, append the data
self.data += tdata
self.flag_got_data = 1
Vì vậy, mã này sẽ lặp mãi mãi nhận được dữ liệu ra khỏi cổng nối tiếp. Chúng tôi sẽ nhận được tối đa 500 ký tự lưu trữ dữ liệu, sau đó cảnh báo vòng lặp chính bằng cách đặt cờ. Nếu không có dữ liệu, chúng tôi sẽ quay lại ngủ và đợi.
Mã đang hoạt động, nhưng tôi không thích thời gian chờ của 5s. Tôi cần nó bởi vì tôi không biết bao nhiêu dữ liệu để mong đợi, nhưng tôi không thích rằng nó thức dậy mỗi 5 giây ngay cả khi không có dữ liệu có mặt.
Có cách nào để kiểm tra khi dữ liệu có sẵn trước khi thực hiện read
không? Tôi đang suy nghĩ một cái gì đó giống như lệnh select
trong Linux.
EDIT:
Chỉ cần nghĩ rằng tôi muốn lưu ý rằng tôi tìm thấy phương pháp inWaiting()
, nhưng thực sự mà dường như nó chỉ cần thay đổi tôi "ngủ" tới thăm dò, do đó không phải là những gì tôi muốn ở đây. Tôi chỉ muốn ngủ cho đến khi dữ liệu vào, sau đó đi lấy nó.
'time.sleep (1)' có vẻ giống như một hack khá xấu mà thêm một loạt các chậm trễ để nhận dữ liệu của bạn. – TJD
@TJD - Không có đối số ở đó, dường như nó hoạt động mà không có giấc ngủ là tốt, nhưng 'data_left' trở nên rất không đáng tin cậy (một chuỗi gồm 19 ký tự là 3, sau đó 10, 6 ngân hàng). Vì vậy, tôi vẫn không hài lòng với nó, nhưng nó gần gũi hơn với những gì tôi đang nghĩ đến. Ngủ cho đến khi dữ liệu, sau đó đọc dữ liệu, sau đó quay trở lại giấc ngủ. – Mike
Tôi không thấy làm thế nào đó là "không đáng tin cậy". Đó chính là cách các byte đến khi bạn đọc chúng.Bạn có thể muốn sử dụng 'interCharTimeout', cho phép bạn phát hiện khi người nhận đã ngừng xem bất kỳ byte mới nào. – TJD