2013-07-11 144 views
5

Gần đây tôi đã làm việc với lớp SerialPort. Hiện tại tôi đang cố gắng tìm ra cách thích hợp để kiểm tra xem thiết bị có được kết nối với cổng cam mà ứng dụng của tôi sử dụng hay không. Có cách nào thích hợp để kiểm tra xem một thiết bị có được kết nối với cổng kết nối không? Phương pháp hiện tại của tôi là như sau:C# Cổng nối tiếp Kiểm tra xem thiết bị đã được kết nối chưa

  while (isReading == true) 
      { 
       try 
       { 
        received += serialPort.ReadExisting(); 

        if (received.Contains('>')) 
         isReading = false; 
       } 
       catch (Exception e) 
       { 

       } 
       if (tick == 10000) 
        if (received == "") 
        { 
         Console.WriteLine("No Data Received. Device isn't connected."); 
         isReading = false; 
        } 
       tick++; 
      } 
      Console.WriteLine(received); 

Nó hoạt động nhưng tôi cảm thấy hơi khó hiểu và không đáng tin cậy. Tôi có thể giữ nó nếu cần nhưng tôi muốn nó nếu có một thay thế thích hợp để làm điều này.

Chỉnh sửa: Tôi thực sự phải đặt giá trị đánh dấu là khoảng 10.000 để đảm bảo nó đáng tin cậy. Nếu không, tôi không nhận được dữ liệu nhân dịp. Ngay cả khi đặt 1000 hoặc 5000 là không đáng tin cậy. Thậm chí sau đó, nó không đảm bảo đáng tin cậy trên nhiều máy.

+0

Bạn đang lập trình các thiết bị không? – Rubixus

+0

@Rubixus No. Đây là thiết bị y tế được gọi là Máy hiệu chuẩn đa năng Fluke 5500A. Tôi thậm chí không thay đổi các thiết lập bên trong nó. – DanteTheEgregore

+0

Thiết bị có đăng ký trình điều khiển trong sổ đăng ký khi nó được cắm vào không? Nó là một thiết bị USB? – Kcvin

Trả lời

7

Tôi cũng cần làm việc với các cổng nối tiếp và tin rằng tôi là một nỗi đau. Phương pháp của tôi để kiểm tra xem thiết bị có được kết nối thường xoay quanh việc phát hành lệnh bỏ phiếu hay không. Mặc dù phương pháp của bạn có thể hoạt động nhưng tôi không thể không ngần ngại sử dụng vòng lặp while khi một sự kiện đủ.

.NET cổng nối tiếp lớp cung cấp một số các sự kiện hữu ích:

Serial.DataReceivedSerial.ErrorReceivedSerial.Write

Thông thường tôi sẽ phát hành một lệnh bỏ phiếu tại một thời điểm cụ thể để đảm bảo các thiết bị được kết nối. Khi thiết bị phản hồi, thiết bị sẽ kích hoạt sự kiện DataReceived và bạn có thể xử lý phản hồi tương ứng (cùng với bất kỳ dữ liệu cần thiết nào khác). Điều này có thể được sử dụng kết hợp với một Timer đơn giản hoặc biến tăng dần để đáp ứng thời gian. Lưu ý rằng bạn sẽ cần đặt giá trị ReadTimeoutWriteTimeout một cách thích hợp.Điều này, cùng với phương pháp ReadExisting và/hoặc ReadLine có thể được sử dụng trong trình xử lý sự kiện DataReceived của bạn.

Vì vậy, để tóm tắt, (trong mã giả)

Send Polling command, Start Timer 
Timer to CountDown for a specified time 
If Timer fires, then assume no response 
If DataRecieved fires (and expected response) assume connection 
(of course handle any specific Exceptions (e.g TimeOutException, InvalidOperationException) 
0

Tôi đồng ý rằng đó là một hack vì bất kỳ thiết bị nào có thể được kết nối và gửi '>'; nhưng điều đó không có nghĩa là thiết bị của bạn.

Thay vào đó, hãy năng động và sử dụng thứ gì đó như SerialPort.GetPortNamesWMI Queries để thẩm vấn các thiết bị được cắm vào cổng COM.

Bạn có thể sử dụng ví dụ this làm điểm bắt đầu.

Sau khi đọc tài liệu và ví dụ, bạn sẽ có thể tạo danh sách tất cả thông tin thiết bị đăng ký trình điều khiển trên máy tính và cổng COM được kết nối.

Edit:

Kể từ khi thiết bị không tự đăng ký, hãy xem xét nhìn vào product drivers cho Visual Studio có thể làm cho công việc của bạn dễ dàng hơn nhiều.

+0

'>' Chỉ là ký tự mã thông báo biểu thị rằng thiết bị được thực hiện phát hành một lệnh và mọi thứ được ghi vào bộ đệm. Phương pháp hiện tại của tôi để kiểm tra xem thiết bị có được kết nối hay không bằng cách chờ một khoảng thời gian đã định và sau đó kiểm tra xem có nhận được gì không chỉ là một chuỗi rỗng. Vấn đề là trên một máy tính tốt, giá trị đánh dấu có thể tăng gấp 10.000 lần trước khi nhận được bất kỳ dữ liệu nào. Nó không phải cái gì tôi có thể dễ dàng phụ thuộc vào. – DanteTheEgregore

+0

Phương pháp này chỉ hoạt động với các thiết bị nối tiếp USB, không phải RS232, đó là những gì OP quy định. – Rubixus

+0

@Rubixus Đó là ví dụ tôi đưa ra. Bạn có thể sử dụng các truy vấn WMI với các thiết bị đã cài đặt trình điều khiển. Khi trình điều khiển được cài đặt, trình điều khiển sẽ hiển thị trong trình quản lý thiết bị của bạn. Nếu trong trình quản lý thiết bị của bạn, bạn có thể tìm thấy nó bằng cách sử dụng Truy vấn WMI. Vì vậy, nhận xét của bạn cũng không hợp lệ. – Kcvin

2

Thật không may với cổng nối tiếp, không có cách thích hợp để xác định xem thiết bị nào đó đã được kết nối chưa. Bạn có thể viết một thông điệp ma thuật mà chỉ thiết bị của bạn sẽ phản hồi chính xác, nhưng như được mô tả trong this answer, phương pháp này có thể gây ra sự cố cho các thiết bị được kết nối khác.

Cuối cùng, bạn chỉ phải phụ thuộc vào người dùng chọn đúng cổng.

Ngoài ra, nếu bạn tình cờ mất kết nối với thiết bị, bạn sẽ chỉ biết khi nào bạn không đọc/ghi nó. Trong trường hợp này, chỉ cần ném một sự kiện LostConnection.

+0

Nếu thiết bị có trình điều khiển, bạn có thể xác định thiết bị bằng các truy vấn WMI như được ghi trong câu trả lời của tôi. Câu trả lời này là sai lầm. Nếu không có trình điều khiển, bạn có thể học cách viết trình điều khiển, tự viết trình điều khiển và phát hiện thiết bị. – Kcvin

+0

@NETscape Đối với các thiết bị RS232, các truy vấn WMI sẽ không hoạt động. – Rubixus

+1

@NETscape Tôi không tin câu trả lời là sai lầm. Anh ấy làm cho một điểm tuyệt vời. Kết nối nối tiếp cực kỳ khó chịu. Họ có thể khá khó khăn để làm việc với. Trình điều khiển arent 'thực sự là một lựa chọn. – DanteTheEgregore

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