private void PackOneFrameData(ref string id, ref string data, ref BinaryReader reader) { mFrameSendFlag = 1; if (reader.BaseStream.Position < reader.BaseStream.Length) { byte[] byteDat = reader.ReadBytes(8); string str = string.Empty; for (int i = 0; i < 8; i++) { if (i >= byteDat.Length) { str = "00"; } else { str = byteDat[i].ToString("X2"); } if (i < 7) { data += str + " "; } else { data += str; //System.Convert.ToString(obj.Data[j], 16) } } mSendFrameNum++; SendUpData(id, data); progressBar.Value = Convert.ToInt32(1000 * reader.BaseStream.Position / reader.BaseStream.Length); mLastFrame = data; data = string.Empty; } else { if (mDoneCnt++ < 2) { mDoneCnt = 2; progressBar.Visible = false; mSendDone = 1; sendListBox.Items.Add("升级文件发送完成!"); data = mLastFrame; SendUpData(id, data); mUpCmd = UpgradeCmd.CmdNone; mSendFrameNum = 0; } } }
private void bmsUp_Click(object sender, EventArgs e) { string fileType = string.Empty; DllAdapte.VCI_ClearBuffer(mDevType, mDevInd, 0); //检查升级文件路径是否为空 if (string.IsNullOrEmpty(mFilePath)) { MessageBox.Show("请先选择升级文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } //判断升级文件是否是bin文件 fileType = Path.GetExtension(mFilePath); if (!fileType.Equals(".bin")) //if (fileType.Contains("bin")) { MessageBox.Show("升级文件类型不是xxx.bin,请选择bin文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); return; } mUpgradeFlag = 1; //升级标志置1 timerSend.Enabled = mIsOpen == 1 ? true : false; //使能发送定时器 mUpCmd = UpgradeCmd.CmdJump; mBinStream = new FileStream(mFilePath, FileMode.Open, FileAccess.Read); mBinReader = new BinaryReader(mBinStream);//二进制读写器 mBinReader.BaseStream.Seek(0, SeekOrigin.Begin); FileInfo fileInfo = new FileInfo(mFilePath); mFileSize = (UInt32)fileInfo.Length; mSizeStr = (mFileSize & 0xff).ToString("X2") + " " + ((mFileSize >> 8) & 0xff).ToString("X2") + " " + ((mFileSize >> 16) & 0xff).ToString("X2") + " " + ((mFileSize >> 24) & 0xff).ToString("X2"); upgradeBtn.Enabled = false; }
unsafe private void ReceiveUpData() { String idStr = ""; string dataStr = string.Empty; UInt32 res = new UInt32(); UInt32 canId = 0; res = DllAdapte.VCI_GetReceiveNum(mDevType, mDevInd, canId); if (res == 0) { return; } //res = DllAdapte.VCI_Receive(mDevType, mDevInd, mCanInd, ref mRecObj[0],50, 100); UInt32 con_maxlen = 50; IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VCI_CAN_OBJ)) * (Int32)con_maxlen); res = DllAdapte.VCI_Receive(mDevType, mDevInd, canId, pt, con_maxlen, 100); for (UInt32 i = 0; i < res; i++) { VCI_CAN_OBJ obj = (VCI_CAN_OBJ)Marshal.PtrToStructure((IntPtr)((UInt32)pt + i * Marshal.SizeOf(typeof(VCI_CAN_OBJ))), typeof(VCI_CAN_OBJ)); idStr = System.Convert.ToString((Int32)obj.ID, 16); if (idStr.Contains("1441abaa")) // && mPauseFlag == 0 { if (obj.Data[1] == (byte)0xcc) { mUpCmd = UpgradeCmd.CmdUpgrade; sendListBox.Items.Add("同主机Ping成功!"); } else { mUpCmd = UpgradeCmd.CmdPing; } } if (idStr.Contains("1442abaa")) // && mPauseFlag == 0 { if (obj.Data[1] == (byte)0xcc) { mFrameSendFlag = 0; mUpgradeFlag = 0; mUpCmd = UpgradeCmd.CmdNone; //timerSend.Enabled = false; //重启后要先关闭发送定时器 sendListBox.Items.Add("主机重启成功!"); } } if (idStr.Contains("1443abaa")) // && mPauseFlag == 0 { if (obj.Data[1] == (byte)0xcc) { mUpCmd = UpgradeCmd.CmdSendData; sendListBox.Items.Add("发送升级地址成功!"); } else if (obj.Data[1] == (byte)0x33) { mUpgradeFlag = 0; mUpCmd = UpgradeCmd.CmdNone; sendListBox.Items.Add("升级下载地址不符合FLASH空间大小!"); } else { mUpCmd = UpgradeCmd.CmdUpgrade; } } if (idStr.Contains("1444abaa")) // && mPauseFlag == 0 { if (obj.Data[1] == (byte)0x33) { mRevFrameNum = 0; mUpgradeFlag = 0; progressBar.Visible = false; mUpCmd = UpgradeCmd.CmdRun; sendListBox.Items.Add("升级成功!"); mBinReader.Close(); mBinStream.Close(); } else if (obj.Data[1] == (byte)0xcc) { mUpCmd = UpgradeCmd.CmdSendData; } else { if (mSendDone == 1) { progressBar.Visible = false; mSendDone = 0; //标志复位 mUpgradeFlag = 0; //mUpCmd = UpgradeCmd.CmdRun; sendListBox.Items.Add("数据发送完成但未收到主机应答信号!"); } else { mUpgradeFlag = 0; mUpCmd = UpgradeCmd.CmdNone; sendListBox.Items.Add("提示:主机在本帧中有丢失数据!"); } } } if (obj.RemoteFlag == 0) { byte len = (byte)(obj.DataLen % 9); for (byte j = 0; j < len; j++) { if (j == 0) { dataStr += obj.Data[j].ToString("X2"); } else { dataStr += " " + obj.Data[j].ToString("X2"); //System.Convert.ToString(obj.Data[j], 16); } } } if (mPauseFlag == 0) { if (mFrameSendFlag == 1) { mRevFrameNum++; } RevListBox.Items.Add("报文ID: 0x" + idStr + " 接收数据: " + dataStr + " 接收帧数: " + mRevFrameNum.ToString("X4")); RevListBox.SelectedIndex = RevListBox.Items.Count - 1; } dataStr = string.Empty; } Marshal.FreeHGlobal(pt); }
private void timerSend_Tick(object sender, EventArgs e) { string id = string.Empty; string data = string.Empty; switch (mUpCmd) { case UpgradeCmd.CmdNone: break; case UpgradeCmd.CmdJump: //先app下载发送命令 ID:0x0040AAAB id = "1440aaab"; data = "00 cc cc cc cc cc cc cc"; SendUpData(id, data); sendListBox.Items.Add("正在从APP跳转到IAP中..."); if (mJumpTime++ >= 10) { mJumpTime = 0; mUpCmd = UpgradeCmd.CmdPing; } break; case UpgradeCmd.CmdPing: //先发送ping命令 ID:0x1841AAAB id = "1441aaab"; data = "ff ff ff ff 4b b4 5a a5"; SendUpData(id, data); sendListBox.Items.Add("同主机握手中Ping..."); mUpCmd = UpgradeCmd.CmdNone; break; case UpgradeCmd.CmdRun: //再发送运行命令 id = "1442aaab"; data = mLastFrame; SendUpData(id, data); sendListBox.Items.Add("主机软复位重启中..."); mUpCmd = UpgradeCmd.CmdNone; break; case UpgradeCmd.CmdUpgrade: //再发送升级命令 id = "1443aaab"; data = "00 40 00 00 " + mSizeStr; // af 9b 01 00"; SendUpData(id, data); sendListBox.Items.Add("发送APP应用升级地址..."); mUpCmd = UpgradeCmd.CmdNone; break; case UpgradeCmd.CmdSendData: //发送升级文件 id = "1444aaab"; progressBar.Visible = true; try { //连发8帧数据,缩短发送时间 PackOneFrameData(ref id, ref data, ref mBinReader); PackOneFrameData(ref id, ref data, ref mBinReader); PackOneFrameData(ref id, ref data, ref mBinReader); PackOneFrameData(ref id, ref data, ref mBinReader); PackOneFrameData(ref id, ref data, ref mBinReader); PackOneFrameData(ref id, ref data, ref mBinReader); PackOneFrameData(ref id, ref data, ref mBinReader); PackOneFrameData(ref id, ref data, ref mBinReader); } catch (EndOfStreamException ex) { sendListBox.Items.Add("升级文件发送完成!"); } catch (Exception ex) { mUpgradeFlag = 0; upgradeBtn.Enabled = true; sendListBox.Items.Add(ex.Message); //MessageBox.Show(ex.Message, "错误",MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } mUpCmd = UpgradeCmd.CmdNone; //每8帧的发送 break; default: upgradeBtn.Enabled = true; break; } }