2009-03-13 41 views
15

Tôi chỉ xem xét một số mã tôi đã viết để giao tiếp với cổng nối tiếp trong C# trên CF2.0. Tôi không sử dụng sự kiện DataReceived vì nó không đáng tin cậy. MSDN states that:Giao tiếp cổng nối tiếp: đấu nối cổng nối tiếp vs sử dụng cổng nối tiếp DataReceived event

Sự kiện DataReceived không phải là gauranteed được nâng lên cho mỗi byte nhận. Sử dụng thuộc tính BytesToRead để xác định lượng dữ liệu còn lại để được đọc trong bộ đệm.

Tôi thăm dò ý kiến ​​của cổng bằng phương thức read() và ủy quyền xử lý dữ liệu khi đọc. Tôi cũng đọc ở đâu đó rằng "bỏ phiếu là xấu" (không có lời giải thích nào).

Bất kỳ ý tưởng nào tại sao việc bỏ phiếu có thể xấu? bên cạnh các lưu ý luồng thông thường - Tôi có một chủ đề riêng biệt (chủ đề nền) thăm dò ý kiến ​​các cảng, các chủ đề được thoát sau khi dữ liệu được đọc, tất cả các thử nghiệm và hoạt động tốt.

Trả lời

17

Cách tôi đọc điều đó, bạn có thể nhận được một sự kiện cho nhiều byte, thay vì một sự kiện trên mỗi byte. Tôi vẫn mong đợi để có được một sự kiện khi dữ liệu đã sẵn sàng, và không có nó "bỏ qua" một số byte hoàn toàn.

Tôi đã luôn sử dụng sự kiện này và không gặp bất kỳ sự cố nào với sự kiện này.

+1

Tuyệt đối, đây cũng là trải nghiệm của tôi. – Andy

7

Sự khôn ngoan thông thường có nghĩa là "bỏ phiếu là xấu" vì nó thường kết thúc là quá trình liên kết CPU. Nếu chặn I/O được sử dụng thay vào đó, thì CPU có sẵn cho các quá trình khác cho đến khi sự kiện xảy ra.

Điều đó nói rằng, thường có thể thiết lập mọi thứ để cuộc thăm dò chờ thời gian chờ (ngắn) trước khi trở về khi không có sẵn ký tự. Nếu thời gian chờ phù hợp được chọn, thì vòng lặp bỏ phiếu đơn giản của bạn sử dụng thời gian CPU ít hơn đáng kể và các quá trình khác cũng sẽ chạy.

tôi đã không sử dụng cổng nối tiếp từ C# ở tất cả, nhưng tôi sẽ đánh bạo đoán rằng những gì các tài liệu có nghĩa là bởi

Sự kiện DataReceived không đảm bảo được nâng lên cho mỗi byte nhận được. Sử dụng thuộc tính BytesToRead để xác định lượng dữ liệu còn lại được đọc trong bộ đệm.

là bạn không thể mong đợi nhận một sự kiện cho mỗi ký tự. Nó có thể trong một số trường hợp cung cấp các sự kiện với nhiều hơn một nhân vật có sẵn. Chỉ cần truy xuất tất cả các ký tự có sẵn trong trình xử lý sự kiện của bạn và tất cả sẽ tốt.

Chỉnh sửa: Thực hiện cuộc gọi chặn trên chuỗi trình đọc có thể là câu trả lời hay nhất. Nó không phải là polling per se kể từ khi thread bị chặn cho đến khi các ký tự đến. Bạn có thể cần phải điều chỉnh kích thước bộ đệm và một số cài đặt cổng nối tiếp nếu bạn cần xử lý dữ liệu khi nó đến thay vì trong các khối có kích thước cố định.

+0

cảm ơn tôi đoán nó có ý nghĩa. Tôi không chặn CPU. Trong ứng dụng của tôi, người dùng sẽ có thể chụp giá trị từ thiết bị hoặc nhập thủ công. Khi xảy ra, luồng bỏ phiếu sẽ bị thoát. – sarsnake

1

Tôi chắc chắn rằng mã trình điều khiển cổng nối tiếp cơ bản bị gián đoạn điều khiển, ngay cả khi sử dụng chặn Đọc cuộc gọi.

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