public bool GetParameter(ushort controllerId, ushort parameterId, byte subindex) { int repeatCount = 0; var dataList = new List <CanDriver.canmsg_t>(); var msg = new CanDriver.canmsg_t(); msg.flags = CanDriver.MSG_BOVR; msg.cob = 0; msg.id = (uint)(0x600 + controllerId); //rSdo + id=1 msg.length = (short)CanDriver.DATALENGTH; msg.data = new byte[CanDriver.DATALENGTH]; msg.data[0] = 0x40; //read data msg.data[1] = (byte)(parameterId); //id low msg.data[2] = (byte)(parameterId >> 8); //id high msg.data[3] = subindex; //subindex dataList.Add(msg); while (true) { _device.SendData(dataList); if (!_isUnloaded.WaitOne(TimeSpan.FromMilliseconds(250))) { repeatCount++; if (repeatCount == 10) { MessageBox.Show(@"Превышен лимит ожидания вычитки параметра 0x" + Convert.ToString(parameterId, 16) + @"!!!", @"Ошибка"); return(false); } continue; } break; } return(true); }
public List <CanDriver.canmsg_t> ReceiveMsgBlock(int msgCount) { int Ret = 0; byte CAN_No, Mode, RTR, DLC; byte[] Data = new byte[8]; UInt32 CANID, TH, TL, DL, DH; var msgBlock = new List <CanDriver.canmsg_t>(); UInt32 realCount = 0; CAN_No = 1; Mode = RTR = DLC = 0; CANID = TH = TL = 0; int ret; while (Ret++ < msgCount) { Mode = RTR = DLC = 0; CANID = TH = TL = 0; ret = VCI_CAN_DotNET.VCI_SDK.VCI_RecvCANMsg_NoStruct(CAN_No, ref Mode, ref RTR, ref DLC, ref CANID, ref TL, ref TH, Data); if ((ret == 14 && Ret == 1) || ret == 5) { return(msgBlock); } var msg = new CanDriver.canmsg_t { id = CANID, length = (short)Data.Count(), data = new byte[Data.Count()] }; for (int i = 0; i < msg.length; i++) { msg.data[i] = Data[i]; } msgBlock.Add(msg); } return(msgBlock); }
public List <CanDriver.canmsg_t> ReceiveMsgBlock(int msgCount) { string ReceiveStatus; int nRet; uint nReadCount = (uint)msgCount; uint pulNumberofRead = 0; var msgRead = new CanDriver.canmsg_t[msgCount]; for (int i = 0; i < msgCount; i++) { msgRead[i].data = new byte[8]; } nRet = acCanRead(msgRead, nReadCount, ref pulNumberofRead); //Receiving frames if (nRet == AdvCANIO.TIME_OUT) { ReceiveStatus = "Package "; ReceiveStatus += "receiving timeout!"; return(new List <CanDriver.canmsg_t>()); } else if (nRet == AdvCANIO.OPERATION_ERROR) { ReceiveStatus = "Package "; ReceiveStatus += " error!"; return(null); } else { var ret = msgRead.ToList(); //var ret = msgRead.ToList().Where(m=>m.id!=0xF).ToList(); //if(ret.Count!=0) ret.RemoveRange((int)pulNumberofRead, (int)(msgRead.Count() - pulNumberofRead)); return(ret); } }
public bool SetParameter(CanParameter canParameter) { int repeatCount = 0; var msg = new CanDriver.canmsg_t(); msg.flags = CanDriver.MSG_BOVR; msg.cob = 0; msg.id = (uint)(0x600 + canParameter.ControllerId); //rSdo + id=1 msg.length = (short)CanDriver.DATALENGTH; msg.data = new byte[CanDriver.DATALENGTH]; msg.data[1] = (byte)(canParameter.ParameterId); //id low msg.data[2] = (byte)(canParameter.ParameterId >> 8); //id high msg.data[3] = canParameter.ParameterSubIndex; //subindex if (canParameter.Data.Count() == 4) { msg.data[0] = 0x22; //write 4 byte e=1 s=0; msg.data[4] = canParameter.Data[0]; msg.data[5] = canParameter.Data[1]; msg.data[6] = canParameter.Data[2]; msg.data[7] = canParameter.Data[3]; } else if (canParameter.Data.Count() == 3) { msg.data[0] = 0x26; //write 3 byte e=1 s=0; msg.data[4] = canParameter.Data[0]; msg.data[5] = canParameter.Data[1]; msg.data[6] = canParameter.Data[2]; } else if (canParameter.Data.Count() == 2) { msg.data[0] = 0x2A; //write 2 byte e=1 s=0; msg.data[4] = canParameter.Data[0]; msg.data[5] = canParameter.Data[1]; } else if (canParameter.Data.Count() > 4) //codtDomain { _codtDomainThread = new Thread(SetSegment) { IsBackground = true }; _codtDomainThread.Start(canParameter); return(true); } while ((true)) { if (repeatCount == 10) { MessageBox.Show("Превышен лимит ожидания записи параметра 0x" + Convert.ToString(canParameter.ParameterId, 16) + "!!!", "Ошибка"); return(false); } _device.SendData(new List <CanDriver.canmsg_t> { msg }); if (!_isLoaded.WaitOne(TimeSpan.FromMilliseconds(500))) { repeatCount++; continue; } break; } return(true); }
private void SetSegment(object parameter) { int repeatCount = 0; //start block var canParameter = parameter as CanParameter; var msg = new CanDriver.canmsg_t(); msg.flags = CanDriver.MSG_BOVR; msg.cob = 0; msg.id = (ushort)(0x600 + canParameter.ControllerId); //rSdo + id=1 msg.length = (short)CanDriver.DATALENGTH; msg.data = new byte[CanDriver.DATALENGTH]; msg.data[0] = 0x20; //write segment e=0 s=0; msg.data[1] = (byte)(canParameter.ParameterId); //id low msg.data[2] = (byte)(canParameter.ParameterId >> 8); //id high msg.data[3] = canParameter.ParameterSubIndex; //subindex msg.data[4] = (byte)canParameter.Data.Count(); //Device.SendData(new List<CanDriver.canmsg_t> { msg });// start block while (true) { if (repeatCount == 10) { MessageBox.Show("Превышен лимит ожидания записи параметра 0x" + Convert.ToString(canParameter.ParameterId, 16) + "!!!", "Ошибка"); return; } Thread.Sleep(20); _device.SendData(new List <CanDriver.canmsg_t> { msg }); // start block if (!_isLoaded.WaitOne(TimeSpan.FromMilliseconds(2000))) { repeatCount++; continue; } repeatCount = 0; Thread.Sleep(200); break; } //if (!_isLoaded.WaitOne(TimeSpan.FromMilliseconds(1000))) //{ // return; //} double byteCount = canParameter.Data.Count(); var _sendNumber = (int)Math.Ceiling((double)(byteCount / 7)); //send data int i = 0; while (i < _sendNumber) { var block = new byte[8]; for (int j = 0; j < 7; j++) { if (i * 7 + j >= canParameter.Data.Count()) //set last bute to 0 { block[j + 1] = 0; } else { block[j + 1] = canParameter.Data[i * 7 + j]; } } if (i == _sendNumber - 1)//last block + 6 bit unused { block[0] = 0x1D; } else if (i % 2 == 0) //change count bit { block[0] = 0; } else { block[0] = 0x10; } _device.SendData(new List <CanDriver.canmsg_t> { new CanDriver.canmsg_t { id = (ushort)(0x600 + canParameter.ControllerId), length = 8, flags = CanDriver.MSG_BOVR, data = block } }); if (i == _sendNumber - 1) // if it was last block { ParameterReceive(new List <CanParameter> //parameter was seted { new CanParameter { ControllerId = canParameter.ControllerId, ParameterId = canParameter.ParameterId, ParameterSubIndex = canParameter.ParameterSubIndex } }); } if (!_isLoaded.WaitOne(TimeSpan.FromMilliseconds(500))) { repeatCount++; if (repeatCount == 10) { MessageBox.Show("Превышен лимит ожидания записи сегмента №" + i + "!!!", "Ошибка"); return; } continue; } repeatCount = 0; i++; } }