调试周立功USBCAN提示“尝试读取或写入受保护的内存”错误

阳扬1991 2014-11-19 09:33:30
如题,在写个监控界面,读取周立功usbcan发过来的帧。。

现在调试,当数据量比较小时(每秒100帧一下),一切正常,也不存在丢帧现象
但是当我的接收的数据量非常大时,总是会提示“尝试读取或写入受保护的内存,这通常指示其他内存已损坏”

代码如下
api:
[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);
调用:
len = CANApi.VCI_Receive(My_Can_Parameter.Get_DeviceType(), My_Can_Parameter.Get_DeviceIndex(), My_Can_Parameter.Get_CanIndex(), ref frameInfos[0], 30, 10);
其中frameInfos 定义如下:CANApi.VCI_CAN_OBJ[] frameInfos = new CANApi.VCI_CAN_OBJ[30];
现在每当运行到这句时就会报错。。郁闷死了
而且我试过了,当我30这个参数改到3一下不会报错,但是会丢帧。。
请大神指点一二,小弟不胜感激~
...全文
452 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
阳扬1991 2014-11-20
  • 打赏
  • 举报
回复
引用 4 楼 mwp 的回复:
跟拒我的经验是CANApi里空指针或瞎指针导致的,查查CANApi的代码吧。
以前在VB上面操作过这个api,数据量很大也很稳定啊,您看看我的线程处理是否有不妥的地方
阳扬1991 2014-11-20
  • 打赏
  • 举报
回复
引用 3 楼 devmiao 的回复:
要看手册,ControlCAN.dll的函数接收的缓冲区最大多少?是否允许函数重入/多线程执行。
是这样的,我曾经在vb上面调通过周立功usbcan,并且很稳定,所以不太可能是api的问题,现在的操作方式也一样, 想请教下你,C#线程操作,你看下我的线程处理是不是有不恰当的地方
阳扬1991 2014-11-20
  • 打赏
  • 举报
回复
引用 2 楼 xinjitmzy 的回复:
主要纠结就是数据量较小时,不会出现这个错误。。当数据量大(如每秒接收超过300帧),就会报错。。 大神指点一二
是这样的,我曾经在vb上面调通过周立功usbcan,并且很稳定,所以不太可能是api的问题,现在的操作方式也一样, 想请教下你,C#线程操作,你看下我的线程处理是不是有不恰当的地方
mwp 2014-11-20
  • 打赏
  • 举报
回复
跟拒我的经验是CANApi里空指针或瞎指针导致的,查查CANApi的代码吧。
devmiao 2014-11-19
  • 打赏
  • 举报
回复
要看手册,ControlCAN.dll的函数接收的缓冲区最大多少?是否允许函数重入/多线程执行。
阳扬1991 2014-11-19
  • 打赏
  • 举报
回复
主要纠结就是数据量较小时,不会出现这个错误。。当数据量大(如每秒接收超过300帧),就会报错。。 大神指点一二
阳扬1991 2014-11-19
  • 打赏
  • 举报
回复
这是我的接受处理线程 uint clear_buf = 0; string timeStamp = string.Empty; string frameFormat = string.Empty; string frameType = string.Empty; string data = string.Empty; #region 接收缓冲初始化 uint len = 0; long index = 0; CANApi.VCI_ERR_INFO errInfo = new CANApi.VCI_ERR_INFO(); errInfo.Passive_ErrData = new byte[10]; //CANApi.VCI_CAN_OBJ[] frameInfos = new CANApi.VCI_CAN_OBJ[20]; #endregion try { for (index = 0; index < 251; index++) //if (true)//while (true) { if (!(My_Can_Parameter.Is_Connect())) break; if (index % 50 == 0) { clear_buf = CANApi.VCI_ClearBuffer(My_Can_Parameter.Get_DeviceType(), My_Can_Parameter.Get_DeviceIndex(), My_Can_Parameter.Get_CanIndex()); if (250 == index) index = 0; } len = 0; len = CANApi.VCI_Receive(My_Can_Parameter.Get_DeviceType(), My_Can_Parameter.Get_DeviceIndex(), My_Can_Parameter.Get_CanIndex(), ref frameInfos[0], 30, 10); if (len <= 0) { CANApi.VCI_ReadErrInfo(My_Can_Parameter.Get_DeviceType(), My_Can_Parameter.Get_DeviceIndex(), My_Can_Parameter.Get_CanIndex(), ref errInfo); } else { for (int i = 0; i < len; i++) { if (i >= frameInfos.Length) break; CANApi.VCI_CAN_OBJ frame = frameInfos[i]; Battery_Display(frame); #region 接收帧显示 string frameID = string.Format("{0:X8}", frame.ID); if (frame.TimeFlag == 0) { timeStamp = "无"; } else { timeStamp = string.Format("{0:X8}", frame.TimeStamp); } if (frame.RemoteFlag == 0) { frameFormat = "数据帧"; } else { frameFormat = "远程帧"; } if (frame.ExternFlag == 0) { frameType = "标准帧"; } else { frameType = "扩展帧"; } if (frame.RemoteFlag == 0) { StringBuilder sbData = new StringBuilder(); for (int j = 0; j < frame.DataLen; j++) { if (frame.Data.Length <= j) break; sbData.AppendFormat("{0:X2} ", frame.Data[j]); } data = sbData.ToString(); } if (frameID != "00000000") { if (!My_Can_Parameter.Halt_Dis) { string frameCount = string.Empty; frame_count++; frameCount = string.Format("{0:X6}", frame_count); this.NotifyReceiveFrame(new FrameInfo(frameCount, frameID, timeStamp, frameFormat, frameType, data)); } } #endregion } } Thread.Sleep(5); } } catch (Exception ee) { } }

110,561

社区成员

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

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

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