c语言sscanf函数的用法是什么
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~