2012-01-09 30 views
6

Tôi đã cố gắng googling này, không thể tìm thấy một câu trả lời, tìm kiếm ở đây, không thể tìm thấy một câu trả lời. Có ai nhìn vào cho dù đó là thread an toàn để viết vào một Serial() đối tượng (pyserial) từ thread a và làm chặn đọc từ thread b?pyserial - có thể ghi vào cổng nối tiếp từ chuỗi a, làm chặn đọc từ chủ đề b?

Tôi biết cách sử dụng nguyên gốc đồng bộ hóa chủ đề và cấu trúc dữ liệu an toàn luồng, và thực tế, hình thức hiện tại của chương trình này có chủ đề đọc/ghi trên cổng nối tiếp và tôi sử dụng cấu trúc dữ liệu chủ đề an toàn hoạt động trong ứng dụng.

Ứng dụng của tôi sẽ được hưởng lợi rất nhiều nếu tôi có thể ghi vào cổng nối tiếp từ chuỗi chính (và không bao giờ đọc từ đó) và đọc từ cổng nối tiếp bằng cách sử dụng tính năng chặn đọc trong chuỗi thứ hai (và không bao giờ ghi vào đó). Nếu ai đó thực sự muốn tôi đi vào lý do tại sao điều này sẽ có lợi cho các ứng dụng tôi có thể thêm lý do của tôi. Trong tâm trí của tôi sẽ có chỉ là một ví dụ của Serial() và ngay cả trong khi thread B ngồi trong một chặn đọc trên đối tượng Serial, thread A sẽ được an toàn để sử dụng phương pháp ghi trên đối tượng Serial.

Bất kỳ ai biết liệu lớp Serial có thể được sử dụng theo cách này không?

EDIT: Nó xảy ra với tôi rằng câu trả lời có thể phụ thuộc vào nền tảng. Nếu bạn có bất kỳ kinh nghiệm với một nền tảng như thế này, nó sẽ là tốt để biết bạn đang làm việc trên nền tảng nào.

CHỈNH SỬA: Chỉ có một câu trả lời nhưng nếu bất kỳ ai khác đã thử điều này, vui lòng để lại phản hồi với trải nghiệm của bạn.

Trả lời

11

Tôi đã thực hiện việc này với chế độ đa tầng. Đọc từ một chủ đề và viết từ một chủ đề khác không nên gây ra vấn đề chung, vì không có bất kỳ loại vấn đề trọng tài tài nguyên nào. Cổng nối tiếp là chế độ song công hoàn chỉnh, vì vậy việc đọc và ghi có thể diễn ra hoàn toàn độc lập và đồng thời.

+0

Bạn có đang sử dụng PySerial không? Và trên nền tảng nào nó hoạt động thành công? –

+0

Tôi đã sử dụng PySerial trên Windows, nhưng không thể tưởng tượng tại sao nó sẽ không hoạt động trên bất kỳ nền tảng nào. – TJD

+0

Cảm ơn bạn đã chia sẻ trải nghiệm của mình! –

3

Tôi đã sử dụng bộ xử lý theo cách này trên Linux (và Windows), không có vấn đề gì!

0

Tôi khuyên bạn nên sửa đổi Chủ đề B từ "chặn đọc" thành "không chặn đọc/ghi". Chủ đề B sẽ trở thành cổng nối tiếp của bạn "Daemon".

Chủ đề A có thể chạy ở tốc độ tối đa cho giao diện người dùng thân thiện hoặc thực hiện bất kỳ thao tác thời gian thực nào.

Chủ đề A sẽ viết một thông báo cho Chủ đề B thay vì cố viết trực tiếp vào cổng nối tiếp. Nếu kích thước/tần số của các thông báo thấp, một bộ đệm chia sẻ đơn giản cho bản thân thông điệp và một lá cờ để chỉ ra rằng một thông điệp mới hiện diện sẽ hoạt động. Nếu bạn cần hiệu năng cao hơn, bạn nên sử dụng ngăn xếp. Điều này thực sự được thực hiện chỉ đơn giản bằng cách sử dụng một mảng đủ lớn để tích lũy nhiều thông điệp được gửi và hai con trỏ. Con trỏ ghi chỉ được cập nhật bởi Chủ đề A. Con trỏ đọc chỉ được cập nhật bởi Chủ đề B.

Chủ đề B sẽ lấy tin nhắn và gửi đến cổng nối tiếp. Cổng nối tiếp nên sử dụng tính năng thời gian chờ để chức năng cổng nối tiếp đọc phát hành CPU, cho phép bạn thăm dò ý kiến ​​bộ đệm dùng chung và nếu có bất kỳ thông báo mới nào, hãy gửi nó đến cổng nối tiếp. Tôi sẽ sử dụng một giấc ngủ tại thời điểm đó để hạn chế thời gian CPU được sử dụng bởi Thread B .. Sau đó, bạn có thể làm cho Thread B loop đến chức năng đọc cổng nối tiếp. Nếu thời gian chờ của cổng nối tiếp không hoạt động đúng, như nếu cáp USB-RS232 được rút phích cắm, chức năng ngủ sẽ tạo sự khác biệt giữa một mã Python tốt so với mã không tốt.

+4

Toàn bộ điểm của phương pháp hai luồng là bạn không cần phải bỏ phiếu ở bất kỳ đâu, vì chuỗi chỉ đọc chỉ chặn trên rcv. – mikepurvis

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