어제 게시물을 올렸습니다. 원래 C++로 작성된 구조를 C#으로 작성합니까?C#에서 안전하지 않은 포인터를 초기화하고 바이트 []로 변환하는 방법?
답변 해 주셔서 감사합니다.
나는 WinCE 6.0 및 .NET Compact Framework 2.0을 실행하는 ARM 플랫폼에서 DeviceIOControl을 사용하려고 노력하고 있습니다. 달성하려는 것은 포트 핀을 제어하고 악몽이되고 있습니다.
가[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를 선언 바이트 []를 단순히 전달 될 수 제안 다음
는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 = 새로운 pio_desc;
나는 다음이
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_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) :
그래서 확실히 지금처럼 뭔가를하고의 문제 구조체 PA13, 안전하지 않은 포인터 인 pin_name을 초기화하는 방법은 무엇입니까? 운전자의 저자는 아마도 운전자가 사용하지 않았다고 기록합니다. Windows가이를 필요로할까요?
PA13.pin_name = ??????
그렇다면이 포인터를 DeviceIOControl에 전달할 바이트 [] 배열에 맞게 바이트로 변환하려면 어떻게해야합니까?
저는 포트 핀의 전압 레벨을 변경하는 것이 얼마나 어려운지에 대해 매우 실망하고 좌절했습니다. 지금이 문제로 고생하고 있습니다. 하드웨어 배경에서 왔기 때문에 다른 컨트롤러에서 IO 컨트롤을 구현하고 COM 포트를 통해 컨트롤 데이터를 전달하는 것이 더 쉽고 (덜 성숙한) 생각이납니다.
(단순한) 도움을 주셔서 다시 한번 감사드립니다.
관리되지 않는 구조 정의를 붙여 넣을 수 있습니까? 구조체의 리터럴 포트가'char * pin_name'에서 왔을 것이기 때문에'pin_name'은 실제로 C 스타일의 문자열로 생각됩니다. 이 경우 struct에서 [MarshalAs (UnmanagedType.LPStr)] public string pin_name;을 사용할 수 있습니다. – cdhowie
관심을 가져 주셔서 감사합니다! unmananged 구조체는 다음과 같습니다. struct pio_desc { \t const char * pin_name;/* 핀 이름 */ \t unsigned int pin_num;/* 핀 번호 */ \t 부호없는 정수 dft_value;/* 출력의 기본값 */ \t 부호없는 char 특성; \t enum pio_type 유형; }; 열거 형을 int 또는 byte 데이터 유형으로 바꾸려고합니다. 필자는이 구조체에 대한 기술 노트에 따르면 핀 이름이 사용되지 않는다고 말합니다. 그렇다면 그것을 포함하는 것이 이상 할 것 같지만, 핀을 참조하는 것이 숫자 대신 발생한다고 생각합니다. – Gary