C#调用ControlCAN.dll为何只能取第1笔数据??

host_2007 2012-08-28 12:09:25

//2.定义CAN信息帧的数据类型。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct VCI_CAN_OBJ
{
public uint ID;
public uint TimeStamp;
public byte TimeFlag;
public byte SendType;
public byte RemoteFlag;//是否是远程帧
public byte ExternFlag;//是否是扩展帧
public byte DataLen;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8, ArraySubType = UnmanagedType.I1)]
public byte[] Data;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3, ArraySubType = UnmanagedType.I1)]
public byte[] Reserved;
}

[DllImport("ControlCAN.dll", EntryPoint = "VCI_Receive", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern uint VCI_Receive(uint DeviceType, uint DeviceInd, uint CANInd, ref VCI_CAN_OBJ pReceive, uint Len, int WaitTime);


CANApi.VCI_CAN_OBJ[] frameInfos = new CANApi.VCI_CAN_OBJ[50];
len = (int)CANApi.VCI_Receive(3, 0, 0, ref frameInfos[0], 50, 200);
if (len <= 0)
{

CANApi.VCI_ReadErrInfo(3, 0, 0, ref errInfo);
}





运行程序可以读取并返回一条数据
...全文
499 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
iyomumx 2012-08-28
  • 打赏
  • 举报
回复
因为定义是ref VCI_CAN_OBJ pReceive,因此PInvoke就会认为只返回一条数据。如果要返回一个数组,请制定[Out]特性以及[MarshalAs(UnmanagedType.LPArray)]特性,并使用VCI_CAN_OBJ[] pReceive形式定义
iyomumx 2012-08-28
  • 打赏
  • 举报
回复
[Out][MarshalAs(UnmanagedType.LPArray)]VCI_CAN_OBJ[] pReceive
这样
host_2007 2012-08-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
因为定义是ref VCI_CAN_OBJ pReceive,因此PInvoke就会认为只返回一条数据。如果要返回一个数组,请制定[Out]特性以及[MarshalAs(UnmanagedType.LPArray)]特性,并使用VCI_CAN_OBJ[] pReceive形式定义
[/Quote]

不是很明白,你能否讲得详细点。
host_2007 2012-08-28
  • 打赏
  • 举报
回复
[DllImport("ControlCAN.dll", EntryPoint = "VCI_Receive", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern uint VCI_Receive(uint DeviceType, uint DeviceInd, uint CANInd, ref VCI_CAN_OBJ pReceive, uint Len, int WaitTime);

是将这部分重新定义吗?

[DllImport("ControlCAN.dll", EntryPoint = "VCI_Receive", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
public static extern uint VCI_Receive(uint DeviceType, uint DeviceInd, uint CANInd, out VCI_CAN_OBJ[] pReceive, uint Len, int WaitTime);
bdmh 2012-08-28
  • 打赏
  • 举报
回复
ref VCI_CAN_OBJ pReceive,这不就是一个struct吗,不是数组

111,092

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧