2017-08-05 2 views
1

Donc, je construis une application qui doit détecter si un périphérique est connecté ou non à un port série aléatoire avant de continuer. Bien que l'appareil se connecte via USB, il est répertorié comme COMPORT (COM5 dans mon cas, mais cela dépend du PC). J'ai le code suivant qui fonctionne si l'appareil est branché, pas de problème, se normalise en une seconde, mais si un appareil correspondant au nom que je cherche n'est pas connecté, l'application ne fait rien, quand elle devrait montrer jusqu'à la messagebox en disant qu'aucun périphérique n'est attaché. L'aide serait appréciée.C# - Le périphérique de détection sur le port série se bloque si aucun périphérique n'existe

ManagementScope connectionScope = new ManagementScope(); 
SelectQuery serialQuery = new SelectQuery("SELECT * FROM Win32_SerialPort"); 
ManagementObjectSearcher searcher = new ManagementObjectSearcher(connectionScope, serialQuery); 
try 
{ 
    foreach (ManagementObject item in searcher.Get()) 
    { 
    string desc = item["Description"].ToString(); 
    string deviceId = item["DeviceID"].ToString(); 
    if (desc.Contains("Arduino")) 
    { 
     device_loc = deviceId; 
     serializer.RunWorkerAsync(); 
     BeginInvoke((MethodInvoker)delegate 
     { 
     next_step.Enabled = true; 
     }); 
    } 
    else 
    { 
     MessageBox.Show("Could not detect any Arduino device connected, please connect your device.", 
     "No device", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); 
     BeginInvoke((MethodInvoker)delegate 
     { 
      next_step.Text = "Ok, let's continue."; 
      next_step.Enabled = true; 
     }); 
    } 
    } 
} 
catch (ManagementException xe) 
{ 
    MessageBox.Show("Could not check for serial devices due to the following error: " + xe, 
    "Ooops", MessageBoxButtons.OK, MessageBoxIcon.Error); 
} 

Le code ci-dessus fonctionne dans un composant séparé backgroundworker. Comme je l'ai dit, si l'appareil est connecté, cela fonctionne, si l'appareil n'est pas, je n'arrive jamais au point où le messagebox disant qu'il n'est pas montre.

+0

Je pense que vous avez une erreur de logique dans votre code. Pourquoi affichez-vous "Impossible de détecter un périphérique Arduino" dans 'foreach'? Par exemple, vous pouvez avoir beaucoup de ports COM et votre carte Arduino n'est pas connectée au premier. –

+0

Je pensais à ce sujet, mais comment dois-je montrer cela à l'extérieur? Si je le mets en dehors du 'foreach', le' messagebox' montre même quand l'appareil se connecte. – szoszu

+0

Vous pouvez utiliser la variable indicateur. Voir un [exampe] (https://pastebin.com/kEp6T5Va) –

Répondre

0

Vous devez terminer le cycle foreach avant de montrer "Non détecté n'importe quel périphérique Arduino". Vous pouvez utiliser la variable d'indicateur pour cela. S'il vous plaît essayez ce code:

bool arduinoFound = false; 
foreach (ManagementObject item in searcher.Get()) 
{ 
    string desc = item["Description"].ToString(); 
    if (desc.Contains("Arduino")) 
    { 
     arduinoFound = true; 
    } 
} 

if (!arduinoFound) 
    MessageBox.Show("Could not detect any Arduino device connected");