2011-10-02 20 views
5

Tôi có một máy ảnh/thiết bị theo dõi hồng ngoại mà tôi đang giao tiếp qua cổng nối tiếp. Tôi đang sử dụng các mô-đun pyserial để làm điều này vào lúc này. Máy ảnh cập nhật vị trí của đối tượng được theo dõi ở tốc độ 60 Hz. Để có được vị trí của đối tượng được theo dõi, tôi thực hiện một pyserial.write() và sau đó lắng nghe một câu trả lời đến với pyserial.read (serialObj.inWaiting()). Khi trả lời/vị trí đã nhận được vòng lặp while được nhập lại và cứ tiếp tục như vậy. Câu hỏi của tôi phải làm với độ tin cậy và tốc độ của phương pháp này. Tôi cần vị trí của máy tính với tốc độ ít nhất 60Hz (và vị trí sau đó sẽ được gửi qua UDP đến một hệ điều hành thời gian thực). Đây có phải là điều mà Pyserial/Python có khả năng hoặc tôi nên xem xét các phương pháp dựa trên C thay thế?pyserial/python và thu thập dữ liệu thời gian thực

Cảm ơn, Luke

+1

Điều này đã diễn ra như thế nào? Tỷ lệ lấy mẫu nào bạn có thể nhận được với python? Tôi đã thực hiện một số thu thập dữ liệu đơn giản tắt của một quy mô ohaus qua RS232, nhưng chỉ có thể nhận được 5hz (có thể đã được quy mô) – Chris

Trả lời

0

Python nên giữ nguyên, nhưng điều tốt nhất cần làm là đảm bảo bạn theo dõi số lần đọc mỗi giây bạn nhận được. Đếm số lần đọc hoàn thành mỗi giây và nếu số này quá thấp, hãy ghi vào nhật ký hiệu suất hoặc tương tự. Bạn cũng nên xem xét tách phần I/O khỏi phần còn lại của chương trình python (nếu có) vì các cuộc gọi đọc pyserial đang chặn.

+1

cảm ơn tất cả các câu trả lời tất cả mọi người. tôi đoán tôi sẽ kiểm tra hiệu suất của các chức năng đọc/viết pyserial trước khi tôi xem xét di chuyển vào cái gì khác. nhưng bạn có thể giải thích các cuộc gọi nối tiếp bị chặn và tại sao họ có thể yêu cầu tách phần còn lại của chương trình (bạn nói đúng, việc đọc/ghi chỉ là một phần nhỏ của chức năng được yêu cầu). – dataman

+0

Pyserial theo mặc định sẽ chặn trên các cuộc gọi đã đọc (bạn có thể cấu hình nó để nó không làm điều này). Điều này có nghĩa là khi bạn gọi 'read', toàn bộ chương trình ngồi và đợi một thứ gì đó được viết, sau đó đọc nó, sau đó chương trình của bạn có thể tiếp tục. Có một vài cách xung quanh điều này, bằng cách sử dụng các cuộc gọi không chặn ('đọc' trả về ngay lập tức, nhưng có thể không có gì), khung điều khiển sự kiện như xoắn (xoắn biết bạn đang chờ đợi và làm những việc khác trong thời gian chờ đợi), hoặc bằng cách sử dụng quy trình/luồng (mặc dù bạn có cùng một vấn đề khi nghe tin nhắn đến từ quá trình này). – jozzas

+1

vâng, tôi đã thiết lập thời gian chờ = 0 và sau đó kết thúc nhận được một char tại một thời điểm. tức là, tôi thực hiện serial.read (1) trong vòng lặp while và kiểm tra '\ r' cho biết kết thúc của lệnh return và khi điều kiện đó được đáp ứng i, sau đó phát hành một yêu cầu vị trí mới. từ một số thử nghiệm ngắn gọn, nó không có vẻ như tôi đã bỏ lỡ bất kỳ khung hình trong hệ thống camera, đó là tuyệt vời, mặc dù tôi muốn bằng cách nào đó đảm bảo rằng điều này luôn luôn là trường hợp. giống như nếu tôi mở trình duyệt trong khi chương trình đang thực thi, có cách nào để buộc tập lệnh có mức độ ưu tiên cao nhất không? – dataman

1

Đây là thêm một vấn đề độ trễ so với tốc độ.

Python luôn thực hiện cấp phát bộ nhớ và giải phóng, nhưng nếu dữ liệu được sử dụng lại, cùng một bộ nhớ sẽ được thư viện C sử dụng lại. Vì vậy, hệ điều hành (thư viện C/UDP/IP stack) sẽ có nhiều tác động hơn bản thân Python.

Tôi thực sự nghĩ bạn nên sử dụng cổng nối tiếp trên máy RTOS của bạn và sử dụng mã C và bộ đệm được phân bổ trước.

0

Tôi cho rằng Python sẽ cập nhật dữ liệu tốt. Lời khuyên của tôi là để thử nó, và nếu Python dường như tụt hậu, sau đó thử PyPy thay - một thực hiện Python biên dịch nhất của vòng bên trong của bạn xuống mã máy cho tốc độ gần để C.

http://pypy.org/

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