2017-08-31 2 views
0

Ich habe Firmware-Upgrade-Programm, das die Software auf einem Gerät über eine serielle Verbindung aktualisiert. Dies wird an Kunden gesendet, die das Upgrade durchführen. Beim Testen habe ich festgestellt, dass COM1 ausgewählt werden kann und auch ohne angeschlossenes serielles Kabel geöffnet wird. Es gibt Code, um zu prüfen, ob die Verbindung offen ist und um Ausnahmen zu fangen, aber da COM1 geöffnet wird, wird das Programm gerade fortgesetzt, obwohl keine Verbindung zum Gerät besteht.Handhabung der Wahl der falschen seriellen Schnittstelle in Upgrade-Software

Wie gehe ich mit einem Client um, der den falschen COM-Port auswählt?

Es wird Anweisungen geben, aber ich fühle mich sicherer, dieses Problem von der App behandelt zu haben.

Hier ist meine serielle Schnittstelle offen Code:

// Create a new SerialPort object. 
     SerialPort _serialPort; 
     _serialPort = new SerialPort(comPort, 115200, Parity.Even, 8, StopBits.One); 

     // for state machine 
     bool _continue = true; 

     do 
     { 
      try 
      { 
       _serialPort.Open(); 

       if (_serialPort.IsOpen) 
       { 
        Console.WriteLine(""); 
        Console.WriteLine("Serial Port is Open"); 
        Console.WriteLine(""); 
       } 
       else 
       { 
        MessageBox.Show("Serial Port is not open. Choose another port."); 
       } 
      } 
      catch (UnauthorizedAccessException ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      catch (ArgumentOutOfRangeException ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      catch (ArgumentException ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      catch (IOException ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
      catch (InvalidOperationException ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 

     } while (!_serialPort.IsOpen); 
+2

Machen Sie keine Schleife und Sie werden in Ordnung sein, versuchen Sie einfach, den Port zu öffnen, und wenn es eine Ausnahme auslöst, informieren Sie den Benutzer und lassen Sie ihn einen anderen wählen. – Gusman

+1

Ich nehme an, Sie haben eine Art von Protokoll mit einem Handshake von irgendeiner Form, so dass Sie ein Timeout programmieren können, wenn das Gerät nicht in X-Zeit antwortet, schließen Sie den Port und informieren Sie den Benutzer. – Gusman

+0

Der IsOpen-Test schlägt nie fehl, zuvor haben Sie Open aufgerufen. Du hast das nicht getestet, es funktioniert einfach nicht. Serielle Ports sind zu grob, um einen zuverlässigen "is connected" Test zu haben. Die DsrHolding-Eigenschaft kann helfen, ist aber keine Garantie. Stellen Sie sicher, dass Sie über ein Optionsmenü verfügen, mit dem der Benutzer die richtige Portnummer auswählen kann. –

Antwort

0

In der Mitte der 2000er Jahre arbeitete ich mit einem Unternehmen, das GPS-Geräte programmiert. Wir haben dies über USB auf serielle Kommunikation programmiert, da wir eine große Anzahl von Geräten gleichzeitig programmieren mussten. Das Gerät selbst hatte eine Methode zum Senden einer Anfrage-/Antwortnachricht, so dass wir sehen konnten, welche Ports mit einem Gerät verbunden waren. Ich würde mir das Gerät ansehen, das Sie programmieren, und sehen, ob es dieses Konzept hat. Wenn dies der Fall ist, können Sie alle seriellen Anschlüsse auf dem Gerät wiederholen, um den Benutzer darüber zu informieren, welche Geräte auf ihm installiert sind.

Wenn es möglich ist, dass ein Benutzer ein USB-zu-Seriell-Gerät verwenden kann, wird es etwas kniffliger, da USB-Geräte nicht bei jedem Hochfahren in der gleichen Reihenfolge auffinden. Unsere Lösung bestand darin, Geräte zu untersuchen, die an USB-Ports angeschlossen sind und nach einem USB-zu-Seriell-Gerät suchen. Es war ein bisschen grob, wie Sie die Geräteinformationen untersuchen, um zu bestimmen, dass es von USB zu seriell ist, und dann die seriellen Ports zu iterieren. Wir verwendeten mehrere 8 und später 16 Port-Geräte, die an USB angeschlossen waren.

Hoffe, das hilft.

Verwandte Themen