2010-10-07 52 views
5

Tôi có thiết bị được kết nối với PC qua giao tiếp Serial USB. Tôi đang thực hiện theo các bướcLàm cách nào để đóng kết nối SerialPort một cách hiệu quả?

  1. Bắt đầu Device (Power On)
  2. thiết bị sẽ phát hiện trong máy tính của tôi như tên COMx
  3. Bắt đầu ứng dụng của tôi
  4. Trên cơ sở của COM PID/VID, tôi kết nối với thiết bị
  5. Thực hiện liên lạc. (Lên đến điều này tôi không gặp phải bất kỳ vấn đề nào)
  6. khi tôi tắt thiết bị, thiết bị bị ngắt kết nối nhưng tôi không thể đóng kết nối.
  7. Khi tôi lại khởi động (Bật) thiết bị, Thiết bị được phát hiện nhưng ứng dụng của tôi không thể kết nối với COMx (thiết bị). Nó ném IOException "COMx không tồn tại"

Vì vậy, tôi nghĩ rằng tôi có một số cách để đóng cổng giao tiếp một cách mạnh mẽ.

Any help is appreciated

Cảm ơn

Trả lời

2

Tôi đã tìm thấy giải pháp mặc dù nó không thể được gọi là giải pháp tiêu chuẩn nhưng mặc dù tôi không có bất kỳ vấn đề với giải pháp mà bởi vì nó giải quyết vấn đề của tôi là giải pháp là theo belove bước

  1. Tạo lớp.
  2. Tạo và hủy bỏ phiên bản của lớp này mỗi khi bạn muốn gửi dữ liệu.

FIRST STEP: -

class clsRS232 : IDisposable 
    { 
     private SerialPort myPort; 
     public clsRS232() 
     { 
      myPort = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); 
     } 
     public void OpenPort() 
     { 
      myPort.Open(); 
     } 
     public void SendFunc(string str) 
     { 
      myPort.Write(str); 
     } 
     public string ReadFunc() 
     { 
      return myPort.ReadExisting(); 
     } 

     public void Dispose() 
     { 
      myPort.Dispose(); 
     } 

    } 

THỨ HAI BƯỚC: -

using (clsRS232 mySerialPort = new clsRS232()) 
        { 
         lock (mySerialPort) 
         { 
          mySerialPort.OpenPort(); 
          mySerialPort.SendFunc(commandArg);//here "commandArg" is command or data you want to send to serial port 
          this.serialPortObj_DataReceived(mySerialPort.ReadFunc()); //here "serialPortObj_DataReceived()" is a user define method where received data will be passed 
         } 
        } 
+1

Mặc dù nó là loại hack, tôi thích nó. Bạn đã giảm thiểu rủi ro cho các vấn đề ở đây rất nhiều. :-) –

1

Bạn đã chạy .Close() trên các cư khi bạn đang thực hiện trên nó?

Bạn lý tưởng cần đóng() trước khi bạn tắt nguồn hoặc ngắt kết nối thiết bị.

Ngoài ra, bạn có đang sử dụng SerialPort.GetPortNames() không? Nếu bạn đang sử dụng USB comports và kéo chúng ra (hoặc tắt chúng) và sau đó chèn lại chúng, chúng sẽ nhận được một tên mới do Windows cung cấp.

Sau đó, bạn phải liệt kê lại chúng bằng SerialPort.GetPortNames(), để kiểm tra tên COM mới là gì.

Tức là, thiết bị của bạn có thể được gọi là COM3 khi bật nguồn đầu tiên, trên nguồn thứ hai trên thiết bị có thể được gọi là COM4 và v.v. Sau một số chu kỳ, nó có thể được gọi là COM3 một lần nữa.

Đó là lý do tại sao bạn cần gọi số GetPortNames để tìm hiểu xem thiết bị "mới" đã xuất hiện chưa. (Đây không phải là thiết bị mới, thiết bị của bạn được bật lại.)

+0

Tôi đang sử dụng này cho kết nối http://www.codeproject.com/KB/hardware -review/AUSBClassLibrary.aspx và tôi không biết tập tin mô tả – Pritesh

+0

làm thế nào để thay đổi USB comports NAME? – Pritesh

+0

Có Tôi đang sử dụng .Đóng() trên comport. Nhưng nó không cho phép làm điều đó. nó cho tôi lỗi. Vì Thiết bị bị ngắt kết nối nên kết nối không thể đóng được. Và cũng có thể tôi không thể thiết lập kết nối bằng cách chuyển đổi trên thiết bị của tôi nó mang lại cho tôi errore. vì kết nối không được đóng tại thời điểm ngắt kết nối với thiết bị của tôi. – Pritesh

2

Nếu bạn kết nối với phần cứng của mình qua cổng nối tiếp và sử dụng SerialEventListener, tôi nghĩ Serial.DATA_BREAK (Không nhớ chính xác tên) sự kiện xảy ra. Bạn có thể nắm bắt điều này trong phương pháp SerialEvent và đóng kết nối từ chương trình của bạn vào cổng của bạn. Hy vọng điều này sẽ giúp bạn buộc phải đóng kết nối của bạn tại thời điểm ngắt kết nối phần cứng.

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