2012-04-12 29 views
5

Tôi đang đọc dữ liệu từ vi điều khiển thông qua nối tiếp, tại tốc độ 921600. Tôi đang đọc một lượng lớn dữ liệu ASCII csv và vì nó đến quá nhanh, bộ đệm nhận được đầy và tất cả phần còn lại của dữ liệu bị mất trước khi tôi có thể đọc được. Tôi biết tôi có thể tự chỉnh sửa mã nguồn pyserial cho serialwin32 để tăng kích thước bộ đệm, nhưng tôi đã tự hỏi nếu có một cách khác xung quanh nó?Bộ đệm đệm đầy nhanh hơn tôi có thể đọc

Tôi chỉ có thể ước tính lượng dữ liệu tôi sẽ nhận được, nhưng nó ở đâu đó khoảng 200kB dữ liệu.

+0

Bạn có thể giảm tốc độ truyền xuống không? –

+0

Không, thật không may là tôi không có quyền kiểm soát uC baudrate. Tất cả những gì tôi có thể làm là gửi byte truyền và nhận dữ liệu. – Nate

Trả lời

4

Có một Thanh trượt "Receive Buffer" có thể truy cập từ trang thuộc tính của cổng com trong Trình quản lý thiết bị. Nó được tìm thấy bằng cách làm theo nút Advanced trên tab "Port Settings".

advanced settings for com port

Thông tin thêm:

http://support.microsoft.com/kb/131016 thuộc nhóm Nhận Buffer

http://tldp.org/HOWTO/Serial-HOWTO-4.html thuộc nhóm Ngắt

Hãy thử gõ nó xuống một hoặc hai notch.

+0

Tôi cũng sẽ thử tính năng này. Tuy nhiên nó có vẻ như nó sẽ chỉ giúp với bộ đệm phần cứng, vì vậy trong khi tôi có lẽ tràn ngập bộ đệm đó quá, tôi biết tôi đang overrunning bộ đệm pySerial, đó là mối quan tâm đầu tiên tôi phải giải quyết. – Nate

+1

Trên Windows 7 của tôi, cài đặt có vẻ là: Device Manager | Cổng | COMn | Thuộc tính | Cài đặt cổng | Nâng cao | Nhận (Byte).Đây là danh sách thả xuống và tôi đã ở mức tối đa 4096. Bộ đệm của tôi dường như bị giới hạn ở khoảng 2K. –

+0

Lý do tại sao cài đặt của bạn không giống như hình ảnh được cung cấp bởi @jon là vì trang microsoft đó áp dụng cho ** windows 95 ** – krb686

4

Bạn đã cân nhắc đọc từ giao diện nối tiếp trong một chuỗi riêng biệt đang chạy trước để gửi lệnh tới UC để gửi dữ liệu?

Điều này sẽ xóa một số sự chậm trễ sau lệnh ghi và bắt đầu đọc. Có other SO users đã thành công với phương pháp này, được cấp rằng họ không bị tràn bộ đệm.

Nếu điều này không rõ ràng, hãy cho tôi biết và tôi có thể ném thứ gì đó lại với nhau để hiển thị điều này.

EDIT

Suy nghĩ về nó nhiều hơn một chút, nếu bạn đang cố gắng để đọc từ bộ đệm và viết nó ra với hệ thống tập tin ngay cả những chủ đề độc lập có thể không giúp bạn tiết kiệm. Để giảm thiểu thời gian xử lý, bạn có thể cân nhắc đọc nói 100 byte tại một thời điểm serial.Read(size=100) và đẩy dữ liệu đó vào một Queue để xử lý nó tất cả sau khi việc chuyển giao đã hoàn thành

Pseudo Mã số Ví dụ

def thread_main_loop(myserialobj, data_queue): 
    data_queue.put_no_wait(myserialobj.Read(size=100)) 

def process_queue_when_done(data_queue): 
    while(1): 
     if len(data_queue) > 0: 
      poped_data = data_queue.get_no_wait() 
      # Process the data as needed 
     else: 
      break; 
+0

Tôi sẽ thử, mặc dù sau khi làm một bài toán nhỏ, tôi vẫn không biết liệu điều này có hữu ích hay không. hiện tại bộ đệm sẽ bị tràn ngập trong 0,03 giây. Và trên hết, tôi khá chắc chắn không có kết thúc thông báo luồng nào. Niềm vui của phần cứng homebrew. – Nate

+0

@Nate Đó là khá nhanh .... Kiểm tra chỉnh sửa của tôi cho các cách bổ sung để tăng tốc độ nó lên. –

Các vấn đề liên quan