J'ai mis un post hier, Comment créer des structures pour C# écrites à l'origine en C++.Comment initialiser un pointeur non sécurisé en C# et le convertir en octet []?
Merci pour vos réponses. J'essaie, sans grand succès, d'utiliser DeviceIOControl sur une plate-forme ARM fonctionnant sous WinCE 6.0 et .NET Compact framework 2.0 Tout ce que j'essaie de faire, c'est de contrôler une broche de port et cela s'avère être un cauchemar.
Voici la déclaration PInvoke:
[DllImport("coredll.dll", EntryPoint = "DeviceIoControl", SetLastError = true)]
internal static extern bool DeviceIoControlCE(int hDevice,
int dwIoControlCode,
byte[] lpInBuffer,
int nInBufferSize,
byte[] lpOutBuffer,
int nOutBufferSize,
ref int lpBytesReturned,
IntPtr lpOverlapped);
La déclaration PInvoke suggère un octet [] peut être transmis à simplement. Il est certainement facile d'écrire les valeurs de chaque membre d'une structure, de le convertir en un tableau d'octets et de le passer à la DLL.
Je donne les résultats suivants:
[StructLayout(LayoutKind.Sequential)]
public struct pio_desc
{
unsafe byte* pin_name; //Length???
public uint pin_number; //4 bytes
public uint default_value; //4 bytes
public byte attribute; //1 byte
public uint pio_type; //4 bytes
}
et
pio_desc PA13 = new pio_desc();
Alors sûrement maintenant il est une question de faire quelque chose comme:
PA13.pin_number = AT91_PIN_PA13; //Length 4 bytes
PA13.default_value = 0; //Length 4 bytes
PA13.attribtue = PIO_DEFAULT; //Length 1 byte
PA13.pio_type = PIO_OUTPUT; //Length 4 bytes
et à convertir (pin_number par exemple) à un octet []:
byte[] temp = BitConverter.GetBytes(PA13.pin_number); //uints are 4 bytes wide
byteArray[++NumberOfChars] = temp[0];
byteArray[++NumberOfChars] = temp[1];
byteArray[++NumberOfChars] = temp[2];
byteArray[++NumberOfChars] = temp[3]; //Will need to check on Endianess
Questions:
En la structure PA13, comment initialiser le pointeur pin_name? L'auteur du pilote note que ce n'est pas utilisé, vraisemblablement par son chauffeur. Est-ce que Windows aura besoin de cela pour avoir de la valeur?
PA13.pin_name = ??????
Ensuite, comment puis-je convertir ce pointeur en un octet pour entrer dans mon tableau byte [] à passer à DeviceIOControl?
Je suis devenu assez déçu et frustré de voir à quel point il est difficile de changer le niveau de tension d'une broche de port - j'ai lutté avec ce problème pendant des jours maintenant. Parce que je viens d'un environnement matériel, je pense qu'il sera plus facile (et moins éligant) pour moi d'implémenter le contrôle d'E/S sur un autre contrôleur et de lui transmettre des données de contrôle via un port COM.
Merci encore pour toute assistance (simple).
Pouvez-vous coller la définition de structure non gérée? Il semble que 'pin_name' est en fait supposé être une chaîne de style C, car un port littéral de la structure proviendrait de' char * pin_name'. Si tel est le cas, vous pouvez utiliser '[MarshalAs (UnmanagedType.LPStr)] chaîne publique nom_broche;' dans la structure. – cdhowie
Merci pour l'intérêt! La structure non-gérée est: struct pio_desc { \t const char * nom_fichier;/* Nom de la broche */ \t unsigned int pin_num;/* Numéro de broche */ \t unsigned int dft_value;/* Valeur par défaut pour les sorties */ \t attribut char non signé; \t enum type_pio_type; }; Je souhaite remplacer l'enum par un type de données int ou byte. Selon une note technique que j'ai sur cette structure, l'auteur dit que le nom de Pin n'est pas utilisé. Il semble étrange de l'inclure alors, mais je pense que le référencement d'une épingle se fait par un nombre à la place. – Gary