解决方案 »

  1.   

    这是我的接受处理线程
    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)
                {            }
            }
      

  2.   

    要看手册,ControlCAN.dll的函数接收的缓冲区最大多少?是否允许函数重入/多线程执行。
      

  3.   

    跟拒我的经验是CANApi里空指针或瞎指针导致的,查查CANApi的代码吧。
      

  4.   

    是这样的,我曾经在vb上面调通过周立功usbcan,并且很稳定,所以不太可能是api的问题,现在的操作方式也一样,
    想请教下你,C#线程操作,你看下我的线程处理是不是有不恰当的地方
      

  5.   

    是这样的,我曾经在vb上面调通过周立功usbcan,并且很稳定,所以不太可能是api的问题,现在的操作方式也一样,
    想请教下你,C#线程操作,你看下我的线程处理是不是有不恰当的地方
      

  6.   

    以前在VB上面操作过这个api,数据量很大也很稳定啊,您看看我的线程处理是否有不妥的地方