英创信息技术嵌入式系统设备驱动接口的C#编程

网友投稿 236 2022-11-06

英创信息技术嵌入式系统设备驱动接口的C#编程

1、DeviceIoControl函数的定义 在wince中核心库为coredll.dll,相当于window的kernel32.dll和user32.dll。要调用核心库,首先需要在代码中添加引用:

[DllImport('coredll.dll', EntryPoint = 'CloseHandle')] private static extern int CloseHandle(int hObject);

[DllImport('coredll.dll', EntryPoint = 'DeviceIoControl')] private static extern bool DeviceIoControl(int hDevice, uint dwIoControlCode, byte[] lpInBuf, uint nInBufSize, byte[] lpOutBuf, uint nOutBufSize, ref uint lpBytesReturned, uint lpOverlapped);

DeviceIoControl函数参数分析:

在C#调用外部dll时,可以用uint来对应DWORD,用ref uint来对应LPDWORD,用IntPtr来对应各种指针,更通用的,可以直接使用byte[]来对应各种指针。

2、DeviceIoControl函数的操作实例 以英创嵌入式主板EM9170的ISA操作为例,以下代码包括了CreatFile需要的参数定义,ISA操作的IOCTL定义,和ISA的DeviceIoControl操作传入参数结构体的定义,和封装DeviceIoControl的两个ISA函数定义。

主函数操作程序打开ISA设备,并操作ISA输出输入,最后关闭设备。

3、传递结构体的操作说明 该例程的ISA_Read,ISA_Write和函数中,DeviceIoControl的参数lpIntBuf需要传递一个结构体指针,关于结构体的操作需要按以下步骤。

在每个成员前面用FieldOffset字段设定该成员在结构体中的偏移。

[StructLayout(LayoutKind.Explicit, Size = 16)] public struct ISA_BUS_ACCESS { [FieldOffset(0)]public uint dwCmd; // = 0: Read, = 1: Write [FieldOffset(4)]public uint dwSeg; // = 0: ISA_CS0, = 1: ISA_CS1 [FieldOffset(8)]public uint dwOffset; [FieldOffset(12)]public uint dwValue; // only lower byte valid }

然后设定结构体各成员值,将结构体拷贝到byte[]中,在C#中将结构体拷贝到byte数组需要使用Marshal类。

首先计算结构体大小 int size = Marshal.SizeOf(typeof(ISA_BUS_ACCESS));

创建一个byte[] byte[] lpIntBuf = new byte[size];

用AllocHGlobal申请一块非托管空间,并获得该空间的指针 IntPtr buffer = Marshal.AllocHGlobal(size);

然后用StructureToPtr将结构体拷贝到指针位置,再用Copy将指针位置数据拷贝到byte数组。因为之前申请了内存空间,使用try-finally确报用FreeHGlobal释放空间

try { Marshal.StructureToPtr(isabus, buffer, false); Marshal.Copy(buffer, lpIntBuf, 0, size); } finally { Marshal.FreeHGlobal(buffer); }

以上操作包括空间申请与释放,效率并不高,为提高效率,应当将结构体成员变量值直接赋值到byte数组相应位置,如: ISA_BUS_ACCESS isabus; isabus.dwCmd = 1;

修改为 lpIntBuf[3] = 1;

注意整数的低位在高地址。

4、英创EM9170其他使用DeviceIoControl操作的设备dwIoControlCode值定义

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:网络层协议与应用(IP数据包格式,ICMP协议,ARP协议)
下一篇:OpenKruise 如何实现应用的可用性防护?
相关文章

 发表评论

暂时没有评论,来抢沙发吧~