2010-10-07 13 views
5

Mam urządzenie, które jest połączone z komputerem przez port szeregowy USB. Ja wykonując następujące krokiJak skutecznie zamknąć połączenie SerialPort?

  1. Device start (Power On)
  2. Urządzenie zostanie wykryte w moim komputerze jako nazwa COMx
  3. Zacznij mój wniosek
  4. Na podstawie COM PID/VID, podłączyć do urządzenia
  5. Wykonaj komunikację. (Do tego nie napotkam żadnego problemu)
  6. po wyłączeniu urządzenia urządzenie jest odłączone, ale nie mogę zamknąć połączenia.
  7. Po ponownym uruchomieniu urządzenia (włącz) urządzenie zostanie wykryte, ale moja aplikacja nie może połączyć się z COMx (urządzenie). To rzuca wyjątek IOException "COMx nie istnieje"

Więc myślę, że mam jakiś sposób na skuteczne zamknięcie portu komunikacyjnego.

Każda pomoc jest mile widziana

Thanks

Odpowiedz

2

znalazłem rozwiązanie, choć nie można nazwać standardowym rozwiązaniem, ale jeśli nie mam żadnego problemu z tym rozwiązaniem, ponieważ rozwiązuje mój problem rozwiązanie jest jak na etapie belove

  1. Utwórz klasę.
  2. Twórz i usuwaj wystąpienia tej klasy za każdym razem, gdy chcesz wysłać dane.

Pierwszy krok: -

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(); 
     } 

    } 

drugim etapie: -

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

Mimo że jest to rodzaj hacka, to lubię. Tutaj znacznie zmniejszyło się ryzyko problemów. :-) –

1

Czy uruchomić .close() na licować gdy wykonywane są na niej?

Idealnie trzeba zamknąć() przed wyłączenia lub odłączenia urządzenia.

Czy używasz również SerialPort.GetPortNames()? Jeśli korzystasz z kompresorów USB i wyciągasz je (lub wyłączasz), a następnie ponownie je wstawiasz, otrzymują nową nazwę nadaną im przez system Windows.

Następnie należy ponownie wyliczyć je za pomocą SerialPort.GetPortNames(), aby sprawdzić, jaka jest nowa nazwa COM.

To znaczy, urządzenie może być nazywany COM3 przy pierwszym włączeniu zasilania, na drugiej potęgi na to może być nazywany COM4 i tak dalej. Po kilku cyklach można go ponownie nazwać COM3.

Dlatego trzeba zadzwonić GetPortNames, aby dowiedzieć się, czy pojawiła się „nowa” urządzenie. (To naprawdę nie jest nowe urządzenie, to twoje urządzenie zostało ponownie włączone).

+0

używam to połączenie http://www.codeproject.com/KB/hardware -review/AUSBClassLibrary.aspx i nie wiem deskryptor pliku – Pritesh

+0

jak zmienić USB kompresuje NAME? – Pritesh

+0

Tak Używam .Close() na comport. Ale to nie pozwala na to. daje mi błąd. Ponieważ urządzenie jest odłączone, więc połączenie nie może się zamknąć. A także nie mogę nawiązać połączenia przez Switch On my device to daje mi błąd. ponieważ połączenie nie jest zamknięte w momencie rozłączenia z moim urządzeniem. – Pritesh

2

Jeśli komunikujesz się ze sprzętem przez port szeregowy i korzystasz z SerialEventListener, to myślę, że to Serial.DATA_BREAK (Nie pamiętam dokładnie nazwa) występuje. Możesz to złapać w metodzie SerialEvent i zamknąć połączenie z twojego programu do portu. Nadzieję, że to pomaga przymusowo zamknąć połączenie w momencie odłączenia sprzętu.

Powiązane problemy