Вчера я разместил пост. Как создать структуры для C #, изначально написанные на C ++.
Спасибо за ваши ответы.
Я пытаюсь, но без особого успеха,использовать DeviceIOControl на платформе ARM под управлением WinCE 6.0 и .NET Compact framework 2.0. Все, чего я пытаюсь добиться, - это управление выводом порта, и это становится кошмаром.
Ниже приводится объявление 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);
Объявление PInvoke предполагает, что ему может быть просто передан байт [].Конечно, легко записать значения для каждого члена структуры, преобразовать его в массив байтов и передать его в dll.
У меня есть следующее:
[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
}
и
pio_desc PA13 = new pio_desc ();
Так что теперь, безусловно, нужно сделать что-то вроде:
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
и преобразовать (например, pin_number) вбайт []:
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
Вопросы:
Как в структуре PA13 инициализировать небезопасный указатель pin_name?Автор драйвера отмечает, что он не используется, предположительно, его водителем.Потребуется ли для Windows какое-либо значение?
PA13.pin_name = ??????
Затем, как мне преобразовать этот указатель в байт, чтобы поместиться в мой массив byte []быть переданным в DeviceIOControl?
Я очень разочарован и разочарован тем, насколько сложно изменить уровень напряжения на выводе порта - я уже несколько дней борюсь с этой проблемой.Поскольку я пришел из аппаратного обеспечения, я думаю, что будет проще (и менее подходящим) для меня реализовать управление вводом-выводом на другом контроллере и передавать управляющие данные на него через COM-порт.
Еще раз спасибо залюбая (простая) помощь.