Bonjour,
Je m’initie à C#. A titre d’exercice, je développe un programme qui commande un relais via USB. Pour cela je dispose d'une DLL écrite en C++ (disponible sur Git https://github.com/pavel-a/usb-relay-hid) et d'un Wrapper exemple pour utiliser les fonctions de la DLL en c#.
La première étape consiste à détecter la (les) cartes relais connectées compatibles à l’aide d’une fonction de la DLL . Cette fonction renvoie une structure qui contient le serial de la carte (pour y accéder avec une autre fonction de la DLL), le nombre de relais et un pointeur IntPtr sur la structure de la carte suivante (s’il y en une deuxième ou qui est null s’il n’y a pas d’autre - c'est ce que j'ai compris).
La déclaration de cette fonction dans c# :
La declaration de la structure dans C# :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 [DllImport("usb_relay_device.dll", EntryPoint = "usb_relay_device_enumerate", CallingConvention = CallingConvention.Cdecl)] //[return: MarshalAs(UnmanagedType.LPStruct)] private static extern IntPtr Pusb_relay_device_enumerate(); public static usb_relay_device_info usb_relay_device_enumerate() { IntPtr x = RelayDeviceWrapper.Pusb_relay_device_enumerate(); usb_relay_device_info a = (usb_relay_device_info)Marshal.PtrToStructure(x, typeof(usb_relay_device_info)); return a; }
Pour récupérer la structure :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public struct usb_relay_device_info { [MarshalAs(UnmanagedType.LPStr)] public string serial_number; public IntPtr device_path { get; set; } public usb_relay_device_type type { get; set; } public IntPtr next { get; set; } }
Je gère sans problème la première carte (excitation et désexcitation du relais)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 public usb_relay_device_info mydeviceinfo; private void ButtonFindDevice_Click(object sender, EventArgs e) { { mydeviceinfo = RelayDeviceWrapper.usb_relay_device_enumerate();
Par contre lorsqu’il y a une deuxième carte sur un autre port USB je n’arrive pas à récupérer sa structure à partir de « mydeviceinfo.next » (qui est un IntpTr sur cette structure).
Nota : La DLL détecte bien si une deuxième carte est connectée
Je teste avec :
Pourriez-vous me dire comment accéder à la structure de la deuxième carte.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 IntPtr myIntptr = mydeviceinfo.next; if (myIntptr == IntPtr.Zero) { MessageBox.Show("Pas d'autre carte relais"); } else { MessageBox.Show("Attention d'autre(s) cartes relais sont connectées");
Partager