2010-10-07 10 views
5

J'ai un périphérique qui se connecte au PC via la communication série USB. Je joue suivant les étapesComment fermer de manière sérielle la connexion SerialPort?

  1. périphérique de démarrage (Power On)
  2. appareil sera détecté dans mon PC comme nom COMx
  3. Démarrer mon application
  4. Sur la base de PID COM/VID, je me connecte à l'appareil
  5. Effectuer une communication. (Jusqu'à ce que je ne sois pas confronté à un problème)
  6. Lorsque j'éteins l'appareil, l'appareil est déconnecté mais je ne peux pas fermer la connexion.
  7. Lorsque je redémarre (appareil allumé), le périphérique est détecté mais mon application ne peut pas se connecter au COMx (périphérique). Il lance IOException "COMx n'existe pas"

Donc je pense que j'ai un moyen de fermer le port de communication avec force.

Toute aide est appréciée

Merci

Répondre

2

J'ai trouvé la solution mais il ne peut pas être appelée solution standard, mais si je n'ai aucun problème avec cette solution, car elle permet de résoudre mon problème, la solution est comme à l'étape de belove

  1. Créer une classe.
  2. Créez et disposez une instance de cette classe chaque fois que vous souhaitez envoyer des données.

PREMIÈRE ÉTAPE: -

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

    } 

Deuxième étape: -

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ême si c'est un peu un hack, je l'aime bien. Vous avez grandement réduit le risque de problèmes ici. :-) –

1

Avez-vous exécuter .Close() sur le comport lorsque vous avez terminé là-dessus?

Vous devez idéalement Fermer() avant vous éteignez ou débranchez l'appareil.

Également, utilisez-vous SerialPort.GetPortNames()? Si vous utilisez des compilateurs USB et les extrayez (ou les mettez hors tension), puis les réinsérez, ils reçoivent un nouveau nom donné par Windows.

Ensuite, vous devez les énumérer à nouveau avec SerialPort.GetPortNames(), pour vérifier ce qu'est le nouveau nom COM. Par exemple, votre périphérique peut être appelé COM3 lors de la première mise sous tension, à la deuxième mise sous tension, il peut s'appeler COM4 et ainsi de suite. Après un certain nombre de cycles, il pourrait être appelé COM3 à nouveau.

C'est pourquoi vous devez appeler GetPortNames, pour savoir si un "nouveau" périphérique est apparu. (Ce n'est pas vraiment un nouvel appareil, c'est votre appareil qui est allumé.)

+0

J'utilise cette connexion pour http://www.codeproject.com/KB/hardware -review/AUSBClassLibrary.aspx et je ne sais pas le descripteur de fichier – Pritesh

+0

comment changer le nom d'utilisateur USB? – Pritesh

+0

Oui, j'utilise .Close() sur le port COM. Mais cela ne permet pas de le faire. ça me donne une erreur. Parce que le périphérique est déconnecté, Connection ne peut pas le fermer. Et aussi je ne peux pas établir la connexion par Switch Sur mon appareil cela me donne errore. parce que la connexion n'est pas fermée au moment de la déconnexion avec mon appareil. – Pritesh

2

Si vous communiquez avec votre matériel via un port série et en utilisant un SerialEventListener, alors je pense que Serial.DATA_BREAK (Ne vous souvenez pas exactement nom) événement se produit. Vous pourriez attraper ceci dans la méthode SerialEvent et fermer la connexion de votre programme à votre port. J'espère que cela vous aidera à fermer de force votre connexion au moment de la déconnexion du matériel.

Questions connexes