Bonjour,
Développement en C#, WPF, Framework 4.7.2.
Je ne sais pas si c'est techniquement possible, de couper l'alimentation d'un composant de façon logiciel (capteur infrarouge), connecté en USB et simulant un port COM avec dans mon cas un composant (USB/COM) de la marque Prolific.
Car parfois l'appareil ne répond plus alors que j'arrive à me connecter dessus. La LED des interrogations TX qui est dessus reste éteinte, alors que j'essaie de communiquer avec l'appareil.
Pour que cela fonctionne il faut déconnecter le port USB pour le reconnecter, ce qui n'est pas possible lorsque le logiciel est en application car le boitier est fermé.
C'est un gros point bloquant que je dois solutionner, pour la suite du développement du logiciel.
Avant nous avions un boitier infrarouge connecté en port COM RS232 qui n'avais pas ce problème de déconnexion, mais il ne fonctionne plus avec les nouveaux appareils, qui ne communique plus en 9600 bauds (ont passe par une DLL propriétaire pour la communication malheureusement, nous n'avons pas le protocole direct vers l'appareil pour nous passer de cette DLL)
J'ai tenté cela avec devcon.exe:
Mais la fonction ReconnectPort n'arrange rien et l'évènement DeviceChanged n'est jamais déclenché.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59 private string deviceName; private string devicePort; private ManagementEventWatcher watcher; public event EventHandler DeviceChanged; public SerialPortReconnector(string deviceport) { this.devicePort = deviceport; deviceName = GetFullComPortName(devicePort); WqlEventQuery query = new WqlEventQuery("SELECT * FROM Win32_DeviceChangeEvent"); watcher = new ManagementEventWatcher(query); watcher.EventArrived += (sender, e) => OnDeviceChanged(EventArgs.Empty); } public string GetFullComPortName(string portName) { string fullPortName = null; using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Name LIKE '%(COM%)'")) { foreach (ManagementObject queryObj in searcher.Get()) { if (queryObj["Name"] != null && queryObj["Name"].ToString().Contains(portName)) { fullPortName = queryObj["Name"].ToString(); break; } } } return fullPortName; } public void ReconnectPort() { Process process = new Process(); process.StartInfo.FileName = "devcon.exe"; // Utilisez le chemin complet vers devcon.exe si nécessaire process.StartInfo.Arguments = $"enable {deviceName}"; process.StartInfo.UseShellExecute = false; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.CreateNoWindow = true; process.Start(); process.WaitForExit(); } public void StartMonitoring() { watcher.Start(); } public void StopMonitoring() { watcher.Stop(); watcher.Dispose(); } protected virtual void OnDeviceChanged(EventArgs e) { DeviceChanged?.Invoke(this, e); }
On a constaté que parfois l'appareil était déclaré désactivé dans le gestionnaire de périphérique, dans ce cas un bouton apparaissait dans les propriétés pour le réactiver et cela marchait. C'est pour cela que j'ai essayé avec devcon.
Si vous avez des infos à ce sujet je suis vraiment preneur, car j'en peux plus de ces nouveaux appareils qui me font changer beaucoup de chose dans le programme, j'avais vraiment pas besoin de sa en plus.
La semaine prochaine je suis en vacance (ouffff), donc je ne vais peut être pas répondre rapidement, mais merci de votre aide comme d'habitude.
Je précise que j'ai constaté cela en mode débogage, mais pour le moment jamais sur une PC simulant les bornes définitive avec un exe en release. Je me fait peut-être du mouron pour rien, mais si cela ce produit ont serait bien embêté, car ont va déjà changer les milliers de modèles RS23 par les USB (enfin ont va faire des tests avant quand même), mais si il faut encore les rechanger pour un autre modèle plus robuste, cela va être compliqué.
Les bornes sont fermées avec un écran tactile donc impossible de dire au client de débranché les USB et les remettre et encore moins aux utilisateurs finaux.
Partager