2011-06-22 27 views
5

Tôi nhận thấy mã mẫu tôi đã đọc khi đóng và mở SerialPort nơi mọi người sẽ thêm Thread.Sleep (1000) trước SerialPort.Open() và Close(). Giống như sau:Tại sao Thread.Sleep() trước SerialPort.Open và Close?

Thread.Sleep(1000); 
serialPort1.Open(); 
/* some code */ 
Thread.Sleep(1000); 
serialPort1.Close(); 

Tôi không thể tìm thấy bất kỳ lời giải thích nào ở bất cứ đâu. Tại sao mọi người chặn cổng nối tiếp bằng cách sử dụng Thread.Sleep trước khi nó được mở hoặc đóng? Có phải vì mục đích thời gian không? Tôi có nên đặt một Thread.Sleep bất cứ khi nào tôi đọc từ hoặc ghi vào Serial Port là tốt?

+0

rằng sẽ có ý nghĩa hơn nếu ngủ là sau khi khai mạc và sau khi đóng vào cho nó thời gian để eithe r thiết lập hoặc kết thúc một kết nối – Prix

+0

Tôi biết trong những ngày cũ xấu của ISA, bạn phải cẩn thận không gửi công cụ đến cổng quá nhanh hoặc nó sẽ gây ra vấn đề. Tôi tự hỏi bao nhiêu trong đó vẫn là trường hợp, và bao nhiêu của nó là hàng hóa cult'ism? – cHao

Trả lời

9

Khi bạn mở một cổng, lớp SerialPort sẽ kích hoạt một chuỗi mới bên dưới nắp chịu trách nhiệm (thông qua chức năng API Windows WaitCommEvent) để đợi hoạt động cổng nối tiếp (ví dụ: dữ liệu đến) và kích hoạt sự kiện phù hợp với bạn xử lý. Đó là lý do tại sao các sự kiện như DataReceived thực sự xảy ra trên một chuỗi thứ cấp.

Khi bạn đóng cổng, lệnh Đóng() trả về ngay lập tức nhưng phải mất một thời gian để chuỗi thứ cấp quay xuống.

Nếu bạn cố gắng mở lại cổng quá nhanh sau khi gọi Đóng và chuỗi chưa được kéo xuống, trường hợp SerialPort không ở trạng thái có thể bắt đầu kết nối mới.

Lưu ý MSDN documentation for SerialPort.Close trạng thái:

Các thực hành tốt nhất cho bất kỳ ứng dụng là để chờ đợi đối với một số lượng thời gian sau khi gọi phương thức Close trước khi cố gắng gọi Open phương pháp, như cảng có thể không đóng cửa ngay lập tức.

Bạn có thể theo dõi thời điểm đóng cổng và trước khi mở lại, đảm bảo thời gian chờ tùy ý đã trôi qua.

Không cần phải ngủ trước khi đọc/viết, mặc dù một vài quirks cần lưu ý:

  • đọc có thể trở lại byte ít hơn bạn yêu cầu
  • Đôi khi sự kiện DataReady không cháy
  • ReadTimeout can be buggy

Hãy ghi nhớ những lớp SerialPort trong NET BCL vẫn dựa trên nền tảng Win32 API, và tôi không nghĩ rằng nó nhận được rất nhiều tình cảm từ Microsoft sinc e thực hiện ban đầu.

Để biết thêm thông tin xem:

+0

+1 cũng thông tin với các trích dẫn. Tôi phải đưa bạn như là câu trả lời mới. – KMC

3

Chỉ một kết nối mở có thể tồn tại trên mỗi đối tượng SerialPort. Cách thực hành tốt nhất cho bất kỳ ứng dụng nào là chờ một khoảng thời gian sau khi gọi phương thức Close trước khi thử gọi phương thức Open, vì cổng có thể không được đóng ngay lập tức.

Hãy xem link này.

1

Tôi đã thực hiện một vài chương trình I/O nối tiếp trong C# và tôi không nghĩ mình chưa bao giờ thêm ngủ như thế. Tôi đã trải qua không có ảnh hưởng xấu (với báo trước rằng các ứng dụng của tôi không bao giờ cố mở và đóng cổng nối tiếp nhanh chóng)

Bạn chắc chắn không cần phải ngủ trước khi đọc hoặc viết.

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