在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → 读取EXCEL内数据(AET测试)

读取EXCEL内数据(AET测试)

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:11.81M
  • 下载次数:48
  • 浏览次数:720
  • 发布时间:2018-01-26
  • 实例类别:C#语言基础
  • 发 布 人:lee_lhz
  • 文件格式:.rar
  • 所需积分:2
 相关标签: Excel c 数据

实例介绍

【实例简介】

【实例截图】

from clipboard


from clipboard

【核心代码】

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

/*------------兼容ZLG的数据类型---------------------------------*/

//1.ZLGCAN系列接口卡信息的数据类型。
public struct VCI_BOARD_INFO 
{ 
	public UInt16 hw_Version;
    public UInt16 fw_Version;
    public UInt16 dr_Version;
    public UInt16 in_Version;
    public UInt16 irq_Num;
    public byte   can_Num;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=20)] public byte []str_Serial_Num;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
    public byte[] str_hw_Type;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
    public byte[] Reserved;
}

/////////////////////////////////////////////////////
//2.定义CAN信息帧的数据类型。
unsafe 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;          //数据长度
    public fixed byte Data[8];    //数据
    public fixed byte Reserved[3];//保留位

}

//3.定义初始化CAN的数据类型
public struct VCI_INIT_CONFIG 
{
    public UInt32 AccCode;
    public UInt32 AccMask;
    public UInt32 Reserved;
    public byte Filter;   //0或1接收所有帧。2标准帧滤波,3是扩展帧滤波。
    public byte Timing0;  //波特率参数,具体配置,请查看二次开发库函数说明书。
    public byte Timing1;
    public byte Mode;     //模式,0表示正常模式,1表示只听模式,2自测模式
}

/*------------其他数据结构描述---------------------------------*/
//4.USB-CAN总线适配器板卡信息的数据类型1,该类型为VCI_FindUsbDevice函数的返回参数。
public struct VCI_BOARD_INFO1
{
    public UInt16 hw_Version;
    public UInt16 fw_Version;
    public UInt16 dr_Version;
    public UInt16 in_Version;
    public UInt16 irq_Num;
    public byte can_Num;
    public byte Reserved;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst=8)] public byte []str_Serial_Num;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public byte[] str_hw_Type;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
    public byte[] str_Usb_Serial;
}

/*------------数据结构描述完成---------------------------------*/

public struct CHGDESIPANDPORT 
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
    public byte[] szpwd;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
    public byte[] szdesip;
    public Int32 desport;

    public void Init()
    {
        szpwd = new byte[10];
        szdesip = new byte[20];
    }
}


namespace WindowsApplication1
{
    public partial class mainPage : Form
    {
        const int DEV_USBCAN = 3;
        const int DEV_USBCAN2 = 4;

        static string text1 = " ";
        static string currerror1 = "";
         /// <summary>
        /// 
        /// </summary>
        /// <param name="DeviceType"></param>
        /// <param name="DeviceInd"></param>
        /// <param name="Reserved"></param>
        /// <returns></returns>
        /*------------兼容ZLG的函数描述---------------------------------*/
        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_OpenDevice(UInt32 DeviceType, UInt32 DeviceInd, UInt32 Reserved);
        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_CloseDevice(UInt32 DeviceType, UInt32 DeviceInd);
        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_InitCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_INIT_CONFIG pInitConfig);

        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_ReadBoardInfo(UInt32 DeviceType, UInt32 DeviceInd, ref VCI_BOARD_INFO pInfo);

        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_GetReceiveNum(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);
        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_ClearBuffer(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);

        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_StartCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);
        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_ResetCAN(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd);

        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_Transmit(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pSend, UInt32 Len);

        [DllImport("controlcan.dll")]
        //static extern UInt32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, ref VCI_CAN_OBJ pReceive, UInt32 Len, Int32 WaitTime);
        static extern UInt32 VCI_Receive(UInt32 DeviceType, UInt32 DeviceInd, UInt32 CANInd, IntPtr pReceive, UInt32 Len, Int32 WaitTime);
        /*------------其他函数描述---------------------------------*/

        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_ConnectDevice(UInt32 DevType,UInt32 DevIndex);
        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_UsbDeviceReset(UInt32 DevType,UInt32 DevIndex,UInt32 Reserved);
        [DllImport("controlcan.dll")]
        static extern UInt32 VCI_FindUsbDevice(ref VCI_BOARD_INFO1 pInfo);
        /*------------函数描述结束---------------------------------*/

        static UInt32 m_devtype = 4;//USBCAN2

          static UInt32 m_bOpen = 0;
        // CAN接收使能
        static UInt32 m_bRec = 1;
        static UInt32 m_bDisplay = 1;
        static UInt32 m_devind = 0;
        static UInt32 m_canind = 0;

        // 数据存储使能
        public static UInt32 m_DatStoreEnable = 0;
        // 数据存储时间间隔,以ms为单位
        public static Double m_DatStoreInterval = 1000;

        // CAN升级时的数据包发送间隔
        public static Byte CANupdateTimeInterval = 0;

        // 每组最多单体数
        UInt32 m_bMaxCellNum = 60;
        // 每组最多温度数
        UInt32 m_bMaxTmpNum = 20;

        VCI_CAN_OBJ[] m_recobj = new VCI_CAN_OBJ[1000];

        UInt32[] m_arrdevtype = new UInt32[20];

        public static string user = mainPage.text1;                  //接收CAN信号
        public static string CurrErroruser = mainPage.currerror1;    //当前故障信息
        public static int recTimerEnable = 1;                        //接收CAN使能

        //申明全局变量。
        byte[] BinBuffer = new byte[1024 * 1024 * 50];
        public mainPage()
        {
            InitializeComponent();
            user = mainPage.text1;
            Control.CheckForIllegalCrossThreadCalls = false;
            timer_rec.Enabled = false;
            timer_send.Enabled = true;
            timer_updata.Enabled = false;
            timer_save.Enabled = true;
        }


        public static void ModelParamResverdSet()
        {

            mainPage.bmsu.BattGroupNumber = 2;
            mainPage.bmsu.TempNumOneGroup = 12;
            mainPage.bmsu.Bsu[0].Type = 3;
            mainPage.bmsu.Bsu[0].Num = 48;
            mainPage.bmsu.Bsu[0].TmpNum = 12;
            mainPage.bmsu.Bsu[0].InvalidNum = 0;
            mainPage.bmsu.BSUNum = 2;

            mainPage.bmsu.Bsu[1].Type = 3;
            mainPage.bmsu.Bsu[1].Num = 47;
            mainPage.bmsu.Bsu[1].TmpNum = 12;
            mainPage.bmsu.Bsu[1].InvalidNum = 0;
        }
        private void Form1_Load(object sender, EventArgs e)
        {
            ModelParamResverdSet();

            mainPage.CANupdateTimeInterval = 2;
            comboBox1.SelectedIndex = 2;//波特率250kbit/s
            comboBox_DevIndex.SelectedIndex = 0;//设备索引号,挂载的CAN设备序号
            comboBox_CANIndex.SelectedIndex = 0; ///CAN通道


            CurPageIndex = Page_Main;
            mainPage.BMSInfoSendEnable = 1;
           // comboBox_Filter.SelectedIndex = 0;   //接收所有类型
          
            comboBox_SendType.SelectedIndex = 0;      //0:正常工作模式
            comboBox_FrameFormat.SelectedIndex = 0;  //帧格式,0:数据帧
            comboBox_FrameType.SelectedIndex = 1;////帧类型,1:扩展帧
            textBox_ID.Text = "00000123";
            textBox_Data.Text = "00 01 02 03 04 05 06 07 ";

            //
            Int32 curindex = 0;
            comboBox_devtype.Items.Clear();

            curindex = comboBox_devtype.Items.Add("DEV_USBCAN");
            m_arrdevtype[curindex] =  DEV_USBCAN;
            //comboBox_devtype.Items[2] = "VCI_USBCAN1";
            //m_arrdevtype[2]=  VCI_USBCAN1 ;

            curindex = comboBox_devtype.Items.Add("DEV_USBCAN2");
            m_arrdevtype[curindex] = DEV_USBCAN2 ;
            //comboBox_devtype.Items[3] = "VCI_USBCAN2";
            //m_arrdevtype[3]=  VCI_USBCAN2 ;

            comboBox_devtype.SelectedIndex = 1;///////////////////类型
            comboBox_devtype.MaxDropDownItems = comboBox_devtype.Items.Count;

            label4.Text = "未连接";//显示设备连接状况
            label4.BackColor = System.Drawing.Color.Red;
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if (m_bOpen==1)
            {
                VCI_CloseDevice(m_devtype, m_devind);
            }
        }

        private void buttonConnect_Click(object sender, EventArgs e)
        {
            if (m_bOpen==1)
            {
                VCI_CloseDevice(m_devtype, m_devind);
                m_bOpen = 0;
                label4.Text = "未连接";
                label4.BackColor = System.Drawing.Color.Red;
                //label4.ForeColor = System.Drawing.Color.Red;
            }
            else
            {
                m_devtype = m_arrdevtype[comboBox_devtype.SelectedIndex];

                m_devind=(UInt32)comboBox_DevIndex.SelectedIndex;
                m_canind = (UInt32)comboBox_CANIndex.SelectedIndex;
                if (VCI_OpenDevice(m_devtype, m_devind, 0) == 0)
                {
                    MessageBox.Show("打开设备失败,请检查设备类型和设备索引号是否正确", "错误",
                            MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    return;
                }

                m_bOpen = 1;
                VCI_INIT_CONFIG config=new VCI_INIT_CONFIG();
                config.AccCode = 0x00000000;
                config.AccMask = 0xFFFFFFFF;
                string txt = comboBox1.Text;
                if (txt == "125kbit/s")
                {
                    config.Timing0 = 0X03;
                    config.Timing1 = 0X1C;
                }
                else if (txt == "250kbit/s")
                {
                    config.Timing0 = 0X01;
                    config.Timing1 = 0X1C;
                }
                else if (txt == "500kbit/s")
                {
                    config.Timing0 = 0X00;
                    config.Timing1 = 0X1C;
                }
                else if (txt == "1000kbit/s")
                {
                    config.Timing0 = 0X00;
                    config.Timing1 = 0X14;
                }

                config.Filter = 1;// (Byte)(comboBox_Filter.SelectedIndex   1);
                config.Mode = (Byte)comboBox_SendType.SelectedIndex;
                VCI_InitCAN(m_devtype, m_devind, m_canind, ref config);
                VCI_StartCAN(m_devtype, m_devind, m_canind);
                // 开启接收定时器
                timer_rec.Enabled = true;

                label4.Text = "连接中";//////////////////////////////////////////////////////////////////////////////////////
                //label4.ForeColor = System.Drawing.Color.LawnGreen;
                label4.BackColor = System.Drawing.Color.LawnGreen;
               
            }
            buttonConnect.Text = m_bOpen==1?"断开设备":"连接设备";
            timer_rec.Enabled = m_bOpen==1?true:false;
            if (m_bOpen == 0)
            {
                //label4.Text = "断开中";
                Resultlabel.Text = "";
                Resultlabel.BackColor = System.Drawing.Color.Red; 
            }     
        }

       
        int savedatatime = 0;
        private void timer_save_Tick(object sender, EventArgs e)
        {
            this.timer_save.Interval = (int)mainPage.m_DatStoreInterval;
            if (mainPage.m_DatStoreEnable == 1)
            {
                //savedata();
                savedatatime  ;
            }
        }
        #region 系统成员变量
        public static BMSU bmsu = new BMSU();
        public static float[] cellTemp = new float[200];
        public static float[] cellVolt = new float[6000];
        public static float[] cellTemp1 = new float[2000];
        public static float[] balCurrt = new float[600];
        public static float[] balState = new float[600];
        public static string Tempup1 = null;
        public static string Tempup1addr = null;
        public static string Tempup2 = null;
        public static string Tempup2addr = null;
        public static string Tempup3 = null;
        public static string Tempup3addr = null;
        public static string Tempup4 = null;
        public static string Tempup4addr = null;
        public static string Templow1 = null;
        public static string Templow1addr = null;
        public static string Templow2 = null;
        public static string Templow2addr = null;
        public static string Templow3 = null;
        public static string Templow3addr = null;
        public static string Templow4 = null;
        public static string Templow4addr = null;

        public static string Voltup1 = null;
        public static string Voltup1addr = null;
        public static string Voltup2 = null;
        public static string Voltup2addr = null;
        public static string Voltup3 = null;
        public static string Voltup3addr = null;
        public static string Voltup4 = null;
        public static string Voltup4addr = null;
        public static string Voltlow1 = null;
        public static string Voltlow1addr = null;
        public static string Voltlow2 = null;
        public static string Voltlow2addr = null;
        public static string Voltlow3 = null;
        public static string Voltlow3addr = null;
        public static string Voltlow4 = null;
        public static string Voltlow4addr = null;

        #endregion

        #region 系统升级使用相关变量

        byte[] Frame1C8data = new byte[8];
        byte[] Frame1C9data = new byte[8];
        // 0:IDDLE 1:主控触发升级  2:从控发送获取数据指令  3:主控回应从控指令  4:32帧数据传输  5:升级完成
        byte UpdateStep = 0;
        // 0:正常工作模式  1:升级模式
        byte UpdateStus = 0;
        // bin文件的偏移地址
        UInt32 ulImageAddr = 0;
        // 获取的字节数
        UInt16 uiLength = 0;
        // 要升级的测控的地址
        byte LcuAddrForUpdate = 255;
        byte g_u8SelfAddr = 0xF0;
        // bin文件的大小
        Int32 g_ui32LCUsize = 0;

        public const int Page_Main = 0;
        const int Page_FormSysParam = 1;
        const int Page_Charger = 2;
        const int Page_CellInfo = 3;
        const int Page_CANParam = 4;
        const int Page_Calibration = 5;
        const int Page_BMUParam = 6;
        const int Page_DataStore = 7;
        const int Page_batGroup = 8;
        const int Page_Debug = 9;
        const int Page_CellCalibration = 10;
        const int Page_PVDebug = 11;
        const int Page_BMSFactoryInfo = 12;


        // 当前页面索引,向BMS发送当前索引,BMS根据页面索引发送数据包
        public static byte CurPageIndex = Page_Main;

        #endregion

      /*
        unsafe private void chk_SpecialFrame(string id, string strinfo)
        {
            // 判断是否显示特定帧,用于识别CAN2和CAN3的数据包
            string frameID = "";
            if (textBoxID1.Text != "")
            {
                frameID = Convert.ToString(textBoxID1.Text);

                if (frameID.Contains(id))
                {
                    textBoxID1Rec.Text = strinfo;

                    textBoxID1Cnt.Text = Convert.ToString((Convert.ToUInt32(textBoxID1Cnt.Text))   1);
                }
            }
            if (textBoxID2.Text != "")
            {
                frameID = Convert.ToString(textBoxID2.Text);

                if (frameID.Contains(id))
                {
                    textBoxID2Rec.Text = strinfo;

                    textBoxID2Cnt.Text = Convert.ToString((Convert.ToUInt32(textBoxID2Cnt.Text))   1);
                }
            }
        }*/


        // 获取CAN数据帧中的字节流,转换为温度数据
        private float get_tmp(byte high, byte low)
        {
            byte[] tmpByte = new byte[2];
            Int16 itmp16 = 0;
            tmpByte[0] = low;
            tmpByte[1] = high;

            itmp16 = BitConverter.ToInt16(tmpByte, 0);
            return Convert.ToSingle(itmp16) / 100;
        }
        unsafe private void get_36Info(int modenum, VCI_CAN_OBJ obj)
        {
            #region 36串采样板数据接收
            switch (obj.Data[3])
            {
                // 36串单体信息
                case 0x05:
                    cellVolt[modenum * m_bMaxCellNum   0] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   1] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x06:
                    cellVolt[modenum * m_bMaxCellNum   2] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   3] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x07:
                    cellVolt[modenum * m_bMaxCellNum   4] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   5] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x08:
                    cellVolt[modenum * m_bMaxCellNum   6] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   7] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x09:
                    cellVolt[modenum * m_bMaxCellNum   8] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   9] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x0A:
                    cellVolt[modenum * m_bMaxCellNum   10] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   11] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x0B:
                    cellVolt[modenum * m_bMaxCellNum   12] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   13] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x0C:
                    cellVolt[modenum * m_bMaxCellNum   14] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   15] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x13:
                    cellVolt[modenum * m_bMaxCellNum   16] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   17] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x14:
                    cellVolt[modenum * m_bMaxCellNum   18] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   19] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x15:
                    cellVolt[modenum * m_bMaxCellNum   20] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   21] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x16:
                    cellVolt[modenum * m_bMaxCellNum   22] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   23] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x17:
                    cellVolt[modenum * m_bMaxCellNum   24] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   25] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x18:
                    cellVolt[modenum * m_bMaxCellNum   26] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   27] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x19:
                    cellVolt[modenum * m_bMaxCellNum   28] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   29] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x1A:
                    cellVolt[modenum * m_bMaxCellNum   30] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   31] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x1B:
                    cellVolt[modenum * m_bMaxCellNum   32] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   33] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x1C:
                    cellVolt[modenum * m_bMaxCellNum   34] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   35] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;

                // 36串温度信息
                case 0x03:
                    cellTemp1[modenum * m_bMaxTmpNum   0] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   1] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x04:
                    cellTemp1[modenum * m_bMaxTmpNum   2] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   3] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x0D:
                    cellTemp1[modenum * m_bMaxTmpNum   4] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   5] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x0E:
                    cellTemp1[modenum * m_bMaxTmpNum   6] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   7] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x0F:
                    cellTemp1[modenum * m_bMaxTmpNum   8] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   9] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x10:
                    cellTemp1[modenum * m_bMaxTmpNum   10] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   11] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x11:
                    cellTemp1[modenum * m_bMaxTmpNum   12] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   13] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x12:
                    cellTemp1[modenum * m_bMaxTmpNum   14] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   15] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;

                // 36串均衡信息


                // 36串单体测量状态



                // 36串温度测量状态


                default:
                    break;
            }
            #endregion
        }

        unsafe private void get_LbInfo(int modenum, VCI_CAN_OBJ obj)
        {
            #region 主动均衡采样板数据接收(最大支持16个单体,16个温度)
            switch (obj.Data[3])
            {
                // 主动均衡单体信息
                case 0x05:
                    cellVolt[modenum * m_bMaxCellNum   0] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   1] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                  
                    break;
                case 0x06:
                    cellVolt[modenum * m_bMaxCellNum   2] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   3] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x07:
                    cellVolt[modenum * m_bMaxCellNum   4] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   5] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x08:
                    cellVolt[modenum * m_bMaxCellNum   6] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   7] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x09:
                    cellVolt[modenum * m_bMaxCellNum   8] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   9] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x0A:
                    cellVolt[modenum * m_bMaxCellNum   10] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   11] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x0B:
                    cellVolt[modenum * m_bMaxCellNum   12] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   13] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x0C:
                    cellVolt[modenum * m_bMaxCellNum   14] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   15] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;

                // 主动均衡温度信息
                case 0x03:
                    cellTemp1[modenum * m_bMaxTmpNum   0] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   1] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x04:
                    cellTemp1[modenum * m_bMaxTmpNum   2] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   3] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x0D:
                    cellTemp1[modenum * m_bMaxTmpNum   4] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   5] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x0E:
                    cellTemp1[modenum * m_bMaxTmpNum   6] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   7] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x0F:
                    cellTemp1[modenum * m_bMaxTmpNum   8] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   9] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x10:
                    cellTemp1[modenum * m_bMaxTmpNum   10] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   11] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x11:
                    cellTemp1[modenum * m_bMaxTmpNum   12] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   13] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x12:
                    cellTemp1[modenum * m_bMaxTmpNum   14] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   15] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;

                // 主动均衡均衡信息


                //主动均衡单体测量状态


                // 主动均衡温度测量状态


                default:
                    break;
            }
            #endregion
        }

        unsafe private void get_48Info(int modenum, VCI_CAN_OBJ obj)
        {
            #region 48串采样板数据接收
            switch (obj.Data[3])
            {
                // 48串单体信息
                case 0x05:
                    cellVolt[modenum * m_bMaxCellNum   0] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   1] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    //textBox1.Text = "123456";
                    //textBox1.Text = Convert.ToString(cellVolt[modenum * m_bMaxCellNum   1]);
                    break;
                case 0x06:
                    cellVolt[modenum * m_bMaxCellNum   2] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   3] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x07:
                    cellVolt[modenum * m_bMaxCellNum   4] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   5] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x08:
                    cellVolt[modenum * m_bMaxCellNum   6] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   7] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x09:
                    cellVolt[modenum * m_bMaxCellNum   8] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   9] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x0A:
                    cellVolt[modenum * m_bMaxCellNum   10] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   11] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x0B:
                    cellVolt[modenum * m_bMaxCellNum   12] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   13] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x0C:
                    cellVolt[modenum * m_bMaxCellNum   14] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   15] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x13:
                    cellVolt[modenum * m_bMaxCellNum   16] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   17] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x14:
                    cellVolt[modenum * m_bMaxCellNum   18] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   19] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x15:
                    cellVolt[modenum * m_bMaxCellNum   20] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   21] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x16:
                    cellVolt[modenum * m_bMaxCellNum   22] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   23] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x17:
                    cellVolt[modenum * m_bMaxCellNum   24] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   25] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x18:
                    cellVolt[modenum * m_bMaxCellNum   26] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   27] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x19:
                    cellVolt[modenum * m_bMaxCellNum   28] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   29] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x1A:
                    cellVolt[modenum * m_bMaxCellNum   30] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   31] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x1E:
                    cellVolt[modenum * m_bMaxCellNum   32] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   33] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x1F:
                    cellVolt[modenum * m_bMaxCellNum   34] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   35] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x20:
                    cellVolt[modenum * m_bMaxCellNum   36] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   37] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x21:
                    cellVolt[modenum * m_bMaxCellNum   38] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   39] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x22:
                    cellVolt[modenum * m_bMaxCellNum   40] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   41] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x23:
                    cellVolt[modenum * m_bMaxCellNum   42] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   43] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x24:
                    cellVolt[modenum * m_bMaxCellNum   44] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   45] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;
                case 0x25:
                    cellVolt[modenum * m_bMaxCellNum   46] = Convert.ToSingle(obj.Data[4] << 8 | obj.Data[5]) / 1000;
                    cellVolt[modenum * m_bMaxCellNum   47] = Convert.ToSingle(obj.Data[6] << 8 | obj.Data[7]) / 1000;
                    break;

                #region 48串温度信息
                case 0x03:
                    cellTemp1[modenum * m_bMaxTmpNum   0] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   1] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x04:
                    cellTemp1[modenum * m_bMaxTmpNum   2] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   3] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x0D:
                    cellTemp1[modenum * m_bMaxTmpNum   4] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   5] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x0E:
                    cellTemp1[modenum * m_bMaxTmpNum   6] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   7] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x0F:
                    cellTemp1[modenum * m_bMaxTmpNum   8] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   9] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x10:
                    cellTemp1[modenum * m_bMaxTmpNum   10] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   11] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x11:
                    cellTemp1[modenum * m_bMaxTmpNum   12] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   13] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                case 0x12:
                    cellTemp1[modenum * m_bMaxTmpNum   14] = get_tmp(obj.Data[4], obj.Data[5]);
                    cellTemp1[modenum * m_bMaxTmpNum   15] = get_tmp(obj.Data[6], obj.Data[7]);
                    break;
                #endregion

                // 48串均衡信息


                // 48串单体测量状态



                // 48串温度测量状态


                default:
                    break;
            }

            #endregion
        }

        int saveTimeStart = 0;
        unsafe private void timer_rec_Tick(object sender, EventArgs e)
        {
            UInt32 res = new UInt32();
            #region 定时接收部分基本处理/////////////////////////////////////////////////////////////////////////
            if (saveTimeStart   > 20)
            {
                timer_save.Enabled = true;
            }
            if (m_bOpen != 1)
                return;
            //res = VCI_Receive(m_devtype, m_devind, m_canind, ref m_recobj[0], 1000, 100);
            // 未接收到数据或者接收到的数据异常,不解析数据,防止线程间设备开关不同步
            res = VCI_GetReceiveNum(m_devtype, m_devind, m_canind);//连续打印数据
            if ((res == 0) || (res >= 10000))
                return;
            if (res > 200)
                res = 200;
            UInt32 con_maxlen = 50;
            IntPtr pt = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VCI_CAN_OBJ)) * (Int32)con_maxlen);
            res = VCI_Receive(m_devtype, m_devind, m_canind, pt, con_maxlen, 100);//打印一行

            String str = "";
            text1 = null;
            int j = 0;
            VCI_CAN_OBJ obj;
            for (UInt32 i = 0; i < res; i  )
            {
                obj = (VCI_CAN_OBJ)Marshal.PtrToStructure((IntPtr)((UInt32)pt   i * Marshal.SizeOf(typeof(VCI_CAN_OBJ))), typeof(VCI_CAN_OBJ));
                text1 = null;
                str = "接收到数据: ";
                string text2 = System.Convert.ToString((Int32)obj.ID, 16);
                str  = "  帧ID:0x";

                for (int jj = text2.Length; jj < 8; jj  )
                {
                    str  = "0";
                    text1  = "0";
                }

                str  = System.Convert.ToString((Int32)obj.ID, 16);
                text1  = System.Convert.ToString((Int32)obj.ID, 16);


                str  = "  帧格式:";

                if (obj.RemoteFlag == 0)
                    str  = "数据帧 ";
                else
                    str  = "远程帧 ";
                if (obj.ExternFlag == 0)
                    str  = "标准帧 ";
                else
                    str  = "扩展帧 ";

                //////////////////////////////////////////
                if (obj.RemoteFlag == 0)
                {
                    str  = "数据: ";
                    byte len = (byte)(obj.DataLen % 9);
                    byte jj = 0;
                    if (j   < len)
                    {
                        text2 = System.Convert.ToString(obj.Data[0], 16);
                        str  = " ";
                        for (int ij = text2.Length; ij < 2; ij  )
                        {
                            str  = "0";
                        }
                        str  = text2;

                    }
                    if (j   < len)
                    {
                        text2 = System.Convert.ToString(obj.Data[1], 16);
                        str  = " ";
                        for (int ij = text2.Length; ij < 2; ij  )
                        {
                            str  = "0";
                        }
                        str  = text2;

                    }
                    if (j   < len)
                    {
                        text2 = System.Convert.ToString(obj.Data[2], 16);
                        str  = " ";
                        for (int ij = text2.Length; ij < 2; ij  )
                        {
                            str  = "0";
                        }
                        str  = text2;

                    }
                    if (j   < len)
                    {
                        text2 = System.Convert.ToString(obj.Data[3], 16);
                        str  = " ";
                        for (int ij = text2.Length; ij < 2; ij  )
                        {
                            str  = "0";
                        }
                        str  = text2;

                    }
                    if (j   < len)
                    {
                        text2 = System.Convert.ToString(obj.Data[4], 16);
                        str  = " ";
                        for (int ij = text2.Length; ij < 2; ij  )
                        {
                            str  = "0";
                        }
                        str  = text2;
                    }
                    if (j   < len)
                    {
                        text2 = System.Convert.ToString(obj.Data[5], 16);
                        str  = " ";
                        for (int ij = text2.Length; ij < 2; ij  )
                        {
                            str  = "0";
                        }
                        str  = text2;
                    }
                    if (j   < len)
                    {
                        text2 = System.Convert.ToString(obj.Data[6], 16);
                        str  = " ";
                        for (int ij = text2.Length; ij < 2; ij  )
                        {
                            str  = "0";
                        }
                        str  = text2;

                    }

                    if (j   < len)
                    {
                        text2 = System.Convert.ToString(obj.Data[7], 16);
                        str  = " ";
                        for (int ij = text2.Length; ij < 2; ij  )
                        {
                            str  = "0";
                        }
                        str  = text2;

                    }
                    j = (j >= len) ? 0 : j;

                    for (jj = 0; jj < 8; jj  )
                    {
                        if (obj.Data[jj] >= 16)
                        {
                            text1  = System.Convert.ToString(obj.Data[jj], 16);
                        }
                        else
                        {
                            text1  = "0"   System.Convert.ToString(obj.Data[jj], 16);
                        }
                    }

                }




          
             
           #endregion///////////////////////////////////////////////////

                //listBox_Info.Items.Add(str);
                //listBox_Info.SelectedIndex = listBox_Info.Items.Count - 1;
                if (m_bDisplay == 1)
                {
                    listBox_Info.Items.Add(str);
                    listBox_Info.SelectedIndex = listBox_Info.Items.Count - 1;
                    //label4.Text = "连接中";
                }

               //chk_SpecialFrame(System.Convert.ToString((Int32)obj.ID, 16), str);

                user = text1;
                text1 = null;
                string currerror = "";
                string addr1 = null;
                string addr2 = null;

                switch ((Int32)obj.ID)
                {
                  
                    #region 主控的综合信息
                    // 总电压、总电流、SOC、DO输出状态、DI输入状态
                    case 0x0631C001:
                       
                        bmsu.BatVolt = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 10;
                        bmsu.BatCur = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10 - 1000;
                        bmsu.SOC = (float)(Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) * 0.01 / 100);

                        bmsu.DO1 = (Byte)(((obj.Data[6] & (Byte)0x01) == 0x01) ? 1 : 0);
                        bmsu.DO2 = (Byte)(((obj.Data[6] & (Byte)0x02) == 0x02) ? 1 : 0);
                        bmsu.DO3 = (Byte)(((obj.Data[6] & (Byte)0x04) == 0x04) ? 1 : 0);
                        bmsu.DO4 = (Byte)(((obj.Data[6] & (Byte)0x08) == 0x08) ? 1 : 0);
                        bmsu.DO5 = (Byte)(((obj.Data[6] & (Byte)0x10) == 0x10) ? 1 : 0);
                        bmsu.DO6 = (Byte)(((obj.Data[6] & (Byte)0x20) == 0x20) ? 1 : 0);
                        bmsu.DO7 = (Byte)(((obj.Data[6] & (Byte)0x40) == 0x40) ? 1 : 0);
                        bmsu.DO8 = (Byte)(((obj.Data[6] & (Byte)0x80) == 0x80) ? 1 : 0);

                        bmsu.DI1 = (Byte)(((obj.Data[7] & (Byte)0x01) == 0x01) ? 1 : 0);
                        bmsu.DI2 = (Byte)(((obj.Data[7] & (Byte)0x02) == 0x02) ? 1 : 0);
                        bmsu.DI3 = (Byte)(((obj.Data[7] & (Byte)0x04) == 0x04) ? 1 : 0);
                        bmsu.DI4 = (Byte)(((obj.Data[7] & (Byte)0x08) == 0x08) ? 1 : 0);

                        // 刷控件
                        VALL.Text = Convert.ToString(bmsu.BatVolt);
                        //label4.Text = "连接中";
                        //textBoxBatVolt.Text = Convert.ToString(bmsu.BatVolt);
                        //textBoxBatCur.Text = Convert.ToString(bmsu.BatCur);
                        //textBoxSOC.Text = Convert.ToString(bmsu.SOC * 100)   "%";

                        //pictureBoxDO1.Image = imageList2.Images[bmsu.DO1];
                        //pictureBoxDO2.Image = imageList2.Images[bmsu.DO2];
                        //pictureBoxDO3.Image = imageList2.Images[bmsu.DO3];
                        //pictureBoxDO4.Image = imageList2.Images[bmsu.DO4];
                        //pictureBoxDO5.Image = imageList2.Images[bmsu.DO5];
                        //pictureBoxDO6.Image = imageList2.Images[bmsu.DO6];
                        //pictureBoxDO7.Image = imageList2.Images[bmsu.DO7];
                        //pictureBoxDO8.Image = imageList2.Images[bmsu.DO8];

                        //pictureBoxDI1.Image = imageList2.Images[bmsu.DI1];
                        //pictureBoxDI2.Image = imageList2.Images[bmsu.DI2];
                        //pictureBoxDI3.Image = imageList2.Images[bmsu.DI3];

                        //pictureBoxDI4.Image = imageList2.Images[bmsu.DI4];

                        break;
                    // 最高单体,组号,编号,最低单体,组号,编号
                    case 0x0631C002:
                        bmsu.BattHighVoltReading.fBattSignalReading = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
                        bmsu.BattHighVoltReading.ucBattBoxSn = obj.Data[2];
                        bmsu.BattHighVoltReading.ucBattSensorSn = obj.Data[3];

                        bmsu.BattLowVoltReading.fBattSignalReading = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
                        bmsu.BattLowVoltReading.ucBattBoxSn = obj.Data[6];
                        bmsu.BattLowVoltReading.ucBattSensorSn = obj.Data[7];

                        //// 刷控件
                        //textBoxHighVolt.Text = Convert.ToString(bmsu.BattHighVoltReading.fBattSignalReading);
                        //textBoxLowVolt.Text = Convert.ToString(bmsu.BattLowVoltReading.fBattSignalReading);
                        //BattHighVoltSensorSn.Text = "G"   Convert.ToString(bmsu.BattHighVoltReading.ucBattBoxSn)   "N"   Convert.ToString(bmsu.BattHighVoltReading.ucBattSensorSn);
                        //BattLowVoltSensorSn.Text = "G"   Convert.ToString(bmsu.BattLowVoltReading.ucBattBoxSn)   "N"   Convert.ToString(bmsu.BattLowVoltReading.ucBattSensorSn);

                        break;
                    // 最高温度,组号,编号,最低温度,组号,编号

                    case 0x0631C003:
                        
                        bmsu.BattHighTempReading.fBattSignalReading = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 100 - 40;
                        bmsu.BattHighTempReading.ucBattBoxSn = obj.Data[2];
                        bmsu.BattHighTempReading.ucBattSensorSn = obj.Data[3];

                        bmsu.BattLowTempReading.fBattSignalReading = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 100 - 40;
                        bmsu.BattLowTempReading.ucBattBoxSn = obj.Data[6];
                        bmsu.BattLowTempReading.ucBattSensorSn = obj.Data[7];

                    //    // 刷控件
                    //    textBoxHighTemp.Text = Convert.ToString(bmsu.BattHighTempReading.fBattSignalReading);
                    //    BattHighTempSensorSn.Text = "G"   Convert.ToString(bmsu.BattHighTempReading.ucBattBoxSn)   "N"   Convert.ToString(bmsu.BattHighTempReading.ucBattSensorSn);
                    //    textBoxLowTemp.Text = Convert.ToString(bmsu.BattLowTempReading.fBattSignalReading);
                    //    BattLowTempSensorSn.Text = "G"   Convert.ToString(bmsu.BattHighTempReading.ucBattBoxSn)   "N"   Convert.ToString(bmsu.BattLowTempReading.ucBattSensorSn);

                       break;
                    // 正绝缘电阻值、负绝缘电阻值、主控软件版本号、配置软件版本号
                    case 0x0631C004:

                        bmsu.PInsuRes = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) * 1000; // 正对地绝缘电阻
                        bmsu.NInsuRes = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) * 1000; // 负对地绝缘电阻

                        bmsu.mSoftVersion = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000; // 主控软件版本号
                        bmsu.mSetdataVersion = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000; // 主控设置参数版本号

                        // 刷控件
                        //textBoxPInsuRes.Text = Convert.ToString(bmsu.PInsuRes);
                        //textBoxNInsuRes.Text = Convert.ToString(bmsu.NInsuRes);
                        //textBoxmSoftVersion.Text = Convert.ToString(bmsu.mSoftVersion);
                        //textBoxmParamVersion.Text = Convert.ToString(bmsu.mSetdataVersion);
                        break;
                    // 年-月-日 时-分-秒
                    case 0x0631C005:

                        bmsu.year = Convert.ToUInt16(obj.Data[1] << 8 | obj.Data[0]);
                        bmsu.mon = obj.Data[2];
                        bmsu.day = obj.Data[3];
                        bmsu.hour = obj.Data[4];
                        bmsu.min = obj.Data[5];
                        bmsu.sec = obj.Data[6];

                        break;
                    // 平均电压,最大压差,平均温度,最大温差
                    case 0x0631C006:

                        bmsu.AverBattVolt = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000; // 平均电压
                        bmsu.MaxBattVoltDiff = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 5000) / 1000; // 最大压差
                        bmsu.AverBattTmp = (float)(Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 100.0 - 100); // 平均温度
                        bmsu.MaxBattTmpDiff = (float)(Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 100.0 - 100); // 最大温差

                        // 刷控件
                        //textBoxAverBattVolt.Text = Convert.ToString(bmsu.AverBattVolt);
                        //textBoxMaxBattVoltDiff.Text = Convert.ToString(bmsu.MaxBattVoltDiff);
                        //textBoxAverBattTmp.Text = Convert.ToString(bmsu.AverBattTmp);
                        //textBoxMaxBattTmpDiff.Text = Convert.ToString(bmsu.MaxBattTmpDiff);

                        break;
                        
                    // CC电压、CP占空比、CC2电压、故障代码、最大放电电流、最大充电电流
                    case 0x0631C007:

                        bmsu.CC = obj.Data[0];
                        bmsu.CP = obj.Data[1];
                        bmsu.CC2 = obj.Data[2];
                        bmsu.FaultCode = obj.Data[3];  // 故障代码

                        bmsu.MaxChgCur = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]);     // 最大充电电流
                        bmsu.MaxDisChgCur = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]);  // 最大放电电流

                        // 刷控件
                        //textBoxCC.Text = Convert.ToString(bmsu.CC / 10);
                        //textBoxCP.Text = Convert.ToString(bmsu.CP);
                        //textBoxCC2.Text = Convert.ToString(bmsu.CC2 / 10);
                        //textBoxFaultCode.Text = Convert.ToString(bmsu.FaultCode);

                        //textBoxMaxChgCur.Text = Convert.ToString(bmsu.MaxChgCur);
                        //textBoxMaxDisChgCur.Text = Convert.ToString(bmsu.MaxDisChgCur);

                        // 根据故障代码判断系统故障状态
                        if (bmsu.FaultCode < 150)
                        {
                        //    textBoxSysStus.BackColor = System.Drawing.Color.LimeGreen;
                        //    textBoxSysStus.Text = "正常";
                        }
                        else
                        {
                            //textBoxSysStus.BackColor = System.Drawing.Color.Red;
                            //textBoxSysStus.Text = "告警";
                        }


                        break;
                    // 充电次数、充电AH数、放电AH数、SOH
                    case 0x0631C008:

                        //bmsu.ChgCnt;   // 充电次数
                        //bmsu.ChgAH;    // 充电安时数
                        bmsu.DisAH = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]);    // 放电安时数
                        bmsu.SOH = obj.Data[7];

                        break;
                    // 主继电器切断原因、负继电器切断原因
                    case 0x0631C009:

                        bmsu.PCutMode = obj.Data[0];        // 主继电器切断原因
                        bmsu.NCutMode = obj.Data[1];        // 负继电器切断原因
                        //bmsu.ChgCutMode;                  // 充电继电器切断原因

                        // 刷控件
                        //textBoxPCutMode.Text = Convert.ToString(bmsu.PCutMode);
                        //textBoxPCutMode.Text = Convert.ToString(bmsu.NCutMode);

                        break;
                    // 电池箱数、温度数/箱、标称容量、实际容量
                    case 0x0631C00A:

                        bmsu.BattGroupNumber = obj.Data[0];        // 电池箱数
                        bmsu.TempNumOneGroup = obj.Data[1];        // 温度数每箱
                        bmsu.StdCap = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10;                // 标称容量
                        bmsu.RealCap = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 10;               // 实际容量

                        // 刷控件
                        //textBoxStdCap.Text = Convert.ToString(bmsu.StdCap);
                        //textBoxRealCap.Text = Convert.ToString(bmsu.RealCap);

                        break;
                    // 测控1~16采样状态
                    case 0x0631C00B:


                        break;
                    // 测控1单体数、测控2单体数、测控3单体数、测控4单体数、测控5单体数、测控6单体数、测控7单体数、测控8单体数
                    case 0x0631C00C:
                        bmsu.Bsu[0].bmsNum = obj.Data[0];
                        bmsu.Bsu[1].bmsNum = obj.Data[1];
                        bmsu.Bsu[2].bmsNum = obj.Data[2];
                        bmsu.Bsu[3].bmsNum = obj.Data[3];
                        bmsu.Bsu[4].bmsNum = obj.Data[4];
                        bmsu.Bsu[5].bmsNum = obj.Data[5];
                        bmsu.Bsu[6].bmsNum = obj.Data[6];
                        bmsu.Bsu[7].bmsNum = obj.Data[7];

                        break;
                    // 测控9单体数、测控10单体数、测控11单体数、测控12单体数、测控13单体数、测控14单体数、测控15单体数、测控16单体数
                    case 0x0631C00D:
                        bmsu.Bsu[8].bmsNum = obj.Data[0];
                        bmsu.Bsu[9].bmsNum = obj.Data[1];
                        bmsu.Bsu[10].bmsNum = obj.Data[2];
                        bmsu.Bsu[11].bmsNum = obj.Data[3];
                        bmsu.Bsu[12].bmsNum = obj.Data[4];
                        bmsu.Bsu[13].bmsNum = obj.Data[5];
                        bmsu.Bsu[14].bmsNum = obj.Data[6];
                        bmsu.Bsu[15].bmsNum = obj.Data[7];

                        break;
                    // 电压告警状态、电流告警状态、容量告警状态、最高电压告警状态、最低电压告警状态、单体压差告警状态、绝缘告警状态
                    case 0x0631C00E:


                        break;
                    // 电池箱平均温度告警状态、高温告警状态、低温告警状态、温差告警状态、主控故障
                    case 0x0631C00F:


                        break;
                    // 电池电压高1级、电池电压高2级、电池电压高3级、电池电压高4级
                    case 0x0631C010:

                        bmsu.BatHighL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 10;
                        bmsu.BatHighL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10;
                        bmsu.BatHighL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 10;
                        bmsu.BatHighL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 10;

                        break;
                    // 电池电压低1级、电池电压低2级、电池电压低3级、电池电压低4级
                    case 0x0631C011:

                        bmsu.BatLowL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 10;
                        bmsu.BatLowL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10;
                        bmsu.BatLowL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 10;
                        bmsu.BatLowL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 10;

                        break;
                    // 放电电流高1级、放电电流高2级、放电电流高3级、放电电流高4级
                    case 0x0631C012:

                        bmsu.BatDisChgL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
                        bmsu.BatDisChgL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
                        bmsu.BatDisChgL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
                        bmsu.BatDisChgL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;

                        break;
                    // 充电电流高1级、充电电流高2级、充电电流高3级、充电电流高4级
                    case 0x0631C013:

                        bmsu.BatChgL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
                        bmsu.BatChgL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
                        bmsu.BatChgL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
                        bmsu.BatChgL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;

                        break;
                    // 单体电压高1级、单体电压高2级、单体电压高3级、单体电压高4级
                    case 0x0631C014:

                        bmsu.CellHighL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
                        bmsu.CellHighL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
                        bmsu.CellHighL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
                        bmsu.CellHighL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;

                        break;
                    // 单体电压低1级、单体电压低2级、单体电压低3级、单体电压低4级
                    case 0x0631C015:

                        bmsu.CellLowL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
                        bmsu.CellLowL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
                        bmsu.CellLowL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
                        bmsu.CellLowL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;

                        break;
                    // 电池温度高1级、电池温度高2级、电池温度高3级、电池温度高4级
                    case 0x0631C016:

                        bmsu.CellTmpHighL1 = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 10000) / 100;
                        bmsu.CellTmpHighL2 = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 10000) / 100;
                        bmsu.CellTmpHighL3 = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;
                        bmsu.CellTmpHighL4 = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 10000) / 100;

                        break;
                    // 电池温度低1级、电池温度低2级、电池温度低3级、电池温度低4级
                    case 0x0631C017:

                        bmsu.CellTmpLowL1 = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 10000) / 100;
                        bmsu.CellTmpLowL2 = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 10000) / 100;
                        bmsu.CellTmpLowL3 = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;
                        bmsu.CellTmpLowL4 = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 10000) / 100;

                        break;
                    // 绝缘电阻低1级、绝缘电阻低2级、绝缘电阻低3级、绝缘电阻低4级
                    case 0x0631C018:

                        bmsu.CellInsuLowL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) * 100;
                        bmsu.CellInsuLowL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) * 100;
                        bmsu.CellInsuLowL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) * 100;
                        bmsu.CellInsuLowL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) * 100;

                        break;
                    // 单体压差高1级、单体压差高2级、单体压差高3级、单体压差高4级
                    case 0x0631C019:

                        bmsu.CellDiffHighL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
                        bmsu.CellDiffHighL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
                        bmsu.CellDiffHighL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
                        bmsu.CellDiffHighL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;

                        break;
                    // 电池温差高1级、电池温差高2级、电池温差高3级、电池温差高4级
                    case 0x0631C01A:

                        bmsu.CellTmpDiffHighL1 = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 10000) / 100;
                        bmsu.CellTmpDiffHighL2 = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 10000) / 100;
                        bmsu.CellTmpDiffHighL3 = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;
                        bmsu.CellTmpDiffHighL4 = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 10000) / 100;

                        break;
                    // SOC过高1级、SOC过高2级、SOC过高3级、SOC过高4级
                    case 0x0631C01B:

                        bmsu.SocHighL1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 100;
                        bmsu.SocHighL2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 100;
                        bmsu.SocHighL3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 100;
                        bmsu.SocHighL4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 100;

                        break;
                    // SOC过低1级、SOC过低2级、SOC过低3级、SOC过低4级
                    case 0x0631C01C:

                        bmsu.SOCLow1 = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 100;
                        bmsu.SOCLow2 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 100;
                        bmsu.SOCLow3 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 100;
                        bmsu.SOCLow4 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 100;

                        break;
                    // 霍尔系数A、霍尔系数B、电流校准系数K、电流校准系数B
                    case 0x0631C01D:

                        bmsu.CurrHallSensorA = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]);
                        bmsu.CurrHallSensorB = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]);
                        bmsu.CurrHallPosCoeffK = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 3000) / 1000;
                        bmsu.CurrHallPosCoeffB = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 3000) / 1000;

                        break;
                    // 满充SOC校准电压、满放SOC校准电压、SOC低告警平均电压、SOC高告警平均电压
                    case 0x0631C01E:

                        bmsu.SOCChgCellVolt = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
                        bmsu.SOCDisChgCellVolt = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
                        bmsu.SOCLowAverVolt = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
                        bmsu.SOCHighAverVolt = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;

                        break;
                    // 过充自恢复电压、过放自恢复电压、高温自恢复温度、不均衡平均电压限制
                    case 0x0631C01F:

                        bmsu.CellHighCutResetVolt = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
                        bmsu.CellLowCutResetVolt = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
                        bmsu.TmpHighCutResetVolt = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;

                        break;
                    // 电流零飘阈值、高压电压基准校准系数、电池电压校准系数
                    case 0x0631C020:

                        bmsu.CurZeroDriftThreshold = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;

                        break;
                    // 调试模式使能位、OCV使能位、直接执行OCV校准
                    //case 0x0631C021:

                    // 风扇启动,风扇停止,加热启动,加热停止温度
                    case 0x0631C022:
                        bmsu.FanCtrlTemperature = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 10000) / 100;
                        bmsu.FanNOTCtrlTemperature = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 10000) / 100;
                        bmsu.HeatCtrlTemperature = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 10000) / 100;
                        bmsu.HeatNOTCtrlTemperature = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 10000) / 100;

                        break;

                    // 霍尔校正系数k(放) 霍尔校正系数b(放) 分流器系数A  分流器系数B
                    case 0x0631C023:

                        bmsu.CurrHallNegCoeffK = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 3000) / 1000;
                        bmsu.CurrHallNegCoeffB = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 3000) / 1000;
                        bmsu.CurrShuntSensorA = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]);
                        bmsu.CurrShuntSensorB = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]);

                        break;
                    // 分流器校正系数k(充)、分流器校正系数b(充)分流器校正系数k(放) 分流器校正系数b(放)
                    case 0x0631C024:

                        bmsu.CurrShuntPosCoeffK = (Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) - 3000) / 1000;
                        bmsu.CurrShuntPosCoeffB = (Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) - 3000) / 1000;
                        bmsu.CurrShuntNegCoeffK = (Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) - 3000) / 1000;
                        bmsu.CurrShuntNegCoeffB = (Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) - 3000) / 1000;

                        break;

                    // 电流传感器类型 粘连检测类型 TF卡数据存储类型 CAN数据存储类型 
                    case 0x0631C025:

                        bmsu.BattCurrSensorType = obj.Data[0];
                        bmsu.SDCardInserted = obj.Data[2];

                        break;

                    // 绝缘监测使能 绝缘保护使能 压差保护使能 温差保护使能 风扇使能 加热使能 OCV使能 OCV直接执行
                    case 0x0631C026:

                        bmsu.InsulationDetectEnable = obj.Data[0];
                        bmsu.InsulationLowLVDEnable = obj.Data[1];
                        bmsu.CellVoltDiffHighLVDEnable = obj.Data[2];
                        bmsu.BattTempDiffHighLVDEnable = obj.Data[3];
                        bmsu.FanCtrlEnable = obj.Data[4];
                        bmsu.HeatCtrlEnable = obj.Data[5];
                        bmsu.OCVEnable = obj.Data[6];
                        bmsu.DirectOCVEnable = obj.Data[7];

                        break;

                    // 均衡使能 主正粘连检测使能 主负粘连检测使能 快充粘连检测使能 慢充检测使能
                    case 0x0631C027:

                        bmsu.CellEqualizeEnable = obj.Data[0];

                        break;

                    // 均衡电压阈值 不均衡电压阈值 均衡压差限 不均衡压差限
                    case 0x0631C029:

                        bmsu.CellHighVoltEqualize = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 1000;
                        bmsu.CellVoltNOTEqualize = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 1000;
                        bmsu.CellVoltDiffEqualize = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 1000;
                        bmsu.CellVoltDiffNotEqualize = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 1000;

                        break;
                    // 母线负对地电压  高压回采1电压  高压回采2电压  高压回采3电压
                    case 0x0631C030:

                        bmsu.HighVoltNeg = Convert.ToSingle(obj.Data[1] << 8 | obj.Data[0]) / 10;
                        bmsu.HighVolt1 = Convert.ToSingle(obj.Data[3] << 8 | obj.Data[2]) / 10;
                        bmsu.HighVolt2 = Convert.ToSingle(obj.Data[5] << 8 | obj.Data[4]) / 10;
                        bmsu.HighVolt3 = Convert.ToSingle(obj.Data[7] << 8 | obj.Data[6]) / 10;

                        //textBoxHighVoltNeg.Text = Convert.ToString(bmsu.HighVoltNeg);
                        //textBoxHighVolt1.Text = Convert.ToString(bmsu.HighVolt1);
                        //textBoxHighVolt2.Text = Convert.ToString(bmsu.HighVolt2);
                        //textBoxHighVolt3.Text = Convert.ToString(bmsu.HighVolt3);

                        break;       
                    #endregion

                    default:
                        try
                        {
                            #region 接收采样板信息
                            if ((obj.ID & 0x062f8000) == 0x062f8000)
                            {
                                // 获取测控地址信息
                                int modenum = Convert.ToInt16(obj.ID & 0x7F8) / 8;
                                UInt16 utmp16 = 0;

                                // 识别出主控地址--这个地方需要改为0xF0
                                if (modenum == 0xE0)
                                    modenum = 0;

                                // 获取对应测控的配置信息
                                utmp16 = bmsu.Bsu[modenum].Type;

                                // 主动均衡采样板
                                if ((utmp16 == 0) || (utmp16 == 1))
                                {
                                    get_LbInfo(modenum, obj);
                                    //textBox1.Text = "123456";
                                }

                                // 36串采样板
                                if (utmp16 == 2)
                                {
                                    get_36Info(modenum, obj);
                                    //textBox1.Text = "123456";
                                }
                                
                                // 48串采样板
                                if (utmp16 == 3)
                                {
                                    //textBox1.Text = "123456";
                                    get_48Info(modenum, obj);
                                }
                            }
                            #endregion

                            #region 升级信息
                            else if (((obj.ID & 0x1FF00000) >> 20) == 0x1C8)
                            {
                                Byte updateRecEnable = 0;

                                // 判断是不是被升级对象
                                //if (comboBoxLCUAddr.Text == "MBU")
                                //{
                                //    if (((obj.ID & 0x7F8) >> 3) == utility.Addr_BMU_UPDATE)
                                //        updateRecEnable = 1;
                                //}
                                //else
                                //{
                                //    if (((obj.ID & 0x7F8) >> 3) == LcuAddrForUpdate)
                                //        updateRecEnable = 1;
                                //}

                                if (updateRecEnable == 1)
                                {
                                    Frame1C8data[0] = obj.Data[0];
                                    Frame1C8data[1] = obj.Data[1];
                                    Frame1C8data[2] = obj.Data[2];
                                    Frame1C8data[3] = obj.Data[3];
                                    Frame1C8data[4] = obj.Data[4];
                                    Frame1C8data[5] = obj.Data[5];
                                    Frame1C8data[6] = obj.Data[6];
                                    Frame1C8data[7] = obj.Data[7];

                                    UpdateStep = 2;
                                }
                            }
                            else if (((obj.ID & 0x1FF00000) >> 20) == 0x1C9)
                            {
                                Byte updateRecEnable = 0;

                                // 判断是不是被升级对象
                                //if (comboBoxLCUAddr.Text == "MBU")
                                //{
                                //    if (((obj.ID & 0x7F8) >> 3) == utility.Addr_BMU_UPDATE)
                                //        updateRecEnable = 1;
                                //}
                                //else
                                //{
                                //    if (((obj.ID & 0x7F8) >> 3) == LcuAddrForUpdate)
                                //        updateRecEnable = 1;
                                //}

                                if (updateRecEnable == 1)
                                {
                                    Frame1C9data[0] = obj.Data[0];
                                    Frame1C9data[1] = obj.Data[1];
                                    Frame1C9data[2] = obj.Data[2];
                                    Frame1C9data[3] = obj.Data[3];
                                    Frame1C9data[4] = obj.Data[4];
                                    Frame1C9data[5] = obj.Data[5];
                                    Frame1C9data[6] = obj.Data[6];
                                    Frame1C9data[7] = obj.Data[7];

                                    // 如果已经处于数据传输阶段,则不切换状态,避免打断正常时序
                                    if (UpdateStep != 4)
                                        UpdateStep = 3;
                                }
                            }
                            #endregion

                            //labelSysInfo.Text = "数据接收正常!";
                        }
                        catch
                        {
                            //labelSysInfo.Text = "数据接收异常,请检查BMS设置!";

                        }
                        finally
                        {

                        }
                        break;



                }

                
            }
            //Marshal.FreeHGlobal(ptArray[0]);
            Marshal.FreeHGlobal(pt);
        }
        
        public static Byte BMSInfoSendEnable = 0;

        private void timer_send_Tick(object sender, EventArgs e)
        {
            if (recTimerEnable == 1)
            {
                timer_rec.Enabled = true;
            }
            else if (recTimerEnable == 0)
            {
                timer_rec.Enabled = false;
            }

            //timer_rec.Enabled = false;
            if (UpdateStep == 0)
                sendPageNum2BMS();
            //timer_rec.Enabled = true;
            //SetData();
            //setdata = new Thread(SetData);
            //setdata.IsBackground = true;
            //setdata.Start();
        }
        public unsafe void sendPageNum2BMS()
        {
            Byte ret = 0;
            UInt16 data = 0;
            UInt16 data1 = 0;
            VCI_CAN_OBJ setobj = new VCI_CAN_OBJ();////////////////////////////////////////////////////////////////////////////////////
            setobj.SendType = (byte)comboBox_SendType.SelectedIndex;
            setobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
            setobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;
            setobj.ID = CAN.paramSetID;


            if (m_bOpen == 1)
            {
                try
                {
                    setobj.DataLen = 8;

                    setobj.Data[0] = 0x52;
                    setobj.Data[1] = 0x01;
                    setobj.Data[2] = 0;
                    setobj.Data[3] = 1; //BMSInfoSendEnable;//BMS使能数据。当0:BMS不发数据
                    setobj.Data[4] = 0;
                    setobj.Data[5] = 0;
                    setobj.Data[6] = 0;
                    setobj.Data[7] = CurPageIndex;

                    if (VCI_Transmit(m_devtype, m_devind, m_canind, ref setobj, 1) == 0)
                    {
                        ret = 1;
                        //MessageBox.Show("参数设置发送失败", "错误",
                        //MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
                catch
                {
                    ret = 2;
                    //MessageBox.Show("发送错误!!!");
                }
            }
            else
                ret = 3;

            /// return ret;
        }
        public unsafe Byte SendMessageToBMS(VCI_CAN_OBJ setobj)
        {
            Byte ret = 0;
            UInt16 data = 0;
            UInt16 data1 = 0;

            setobj.SendType = 0;// comboBox_SendType.SelectedIndex;
            setobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
            setobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;

            if (m_bOpen == 1)
            {
                try
                {
                    setobj.DataLen = 8;

                    if (VCI_Transmit(m_devtype, m_devind, m_canind, ref setobj, 1) == 0)
                    {
                        ret = 1;
                        //MessageBox.Show("参数设置发送失败", "错误",
                        //MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                }
                catch
                {
                    ret = 2;
                    //MessageBox.Show("发送错误!!!");
                }
            }
            else
                ret = 3;

            return ret;
        }
        private void button_StopCAN_Click(object sender, EventArgs e)
        {
            //if (m_bOpen == 0)
            //    return;
            VCI_ResetCAN(m_devtype, m_devind, m_canind);
        }
        /// <summary>
        /// ///////////////
        /// </summary>测试按键
        /// <param name="sender"></param>
        /// <param name="e"></param>
        unsafe private void button_Send_Click(object sender, EventArgs e)///////////测试
        {
            
            VCI_StartCAN(m_devtype, m_devind, m_canind);
    ////////////////////////////////////////////////////////////////////////////////////////////////////////开始测试            
            VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ();
            //sendobj.Init();
            sendobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
            sendobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;
            sendobj.ID = System.Convert.ToUInt32("0x" textBox_ID.Text,16);
            int len = (textBox_Data.Text.Length 1) / 3;
            sendobj.DataLen =System.Convert.ToByte(len);
            String strdata = textBox_Data.Text;
            int i=-1;
            if(i  <len-1)
                sendobj.Data[0]=System.Convert.ToByte("0x"  strdata.Substring(i * 3, 2),16);
            if (i   < len - 1)
                sendobj.Data[1]=System.Convert.ToByte("0x"  strdata.Substring(i * 3, 2),16);
            if (i   < len - 1)
                sendobj.Data[2]=System.Convert.ToByte("0x"  strdata.Substring(i * 3, 2),16);
            if (i   < len - 1)
                sendobj.Data[3]=System.Convert.ToByte("0x"  strdata.Substring(i * 3, 2),16);
            if (i   < len - 1)
                sendobj.Data[4]=System.Convert.ToByte("0x"  strdata.Substring(i * 3, 2),16);
            if (i   < len - 1)
                sendobj.Data[5]=System.Convert.ToByte("0x"  strdata.Substring(i * 3, 2),16);
            if (i   < len - 1)
                sendobj.Data[6]=System.Convert.ToByte("0x"  strdata.Substring(i * 3, 2),16);
            if (i   < len - 1)
                sendobj.Data[7] = System.Convert.ToByte("0x"   strdata.Substring(i * 3, 2), 16);

            if(VCI_Transmit(m_devtype,m_devind,m_canind,ref sendobj,1)==0)
            {
                MessageBox.Show("发送失败", "错误",
                        MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
            }
  
            if (m_bOpen == 1)
            {
                //label4.Text = "连接中";
                Resultlabel.Text = "Fail ";
                Resultlabel.BackColor = System.Drawing.Color.LawnGreen;
            }
        }
     
        private void button_Clear_Click(object sender, EventArgs e)
        {
            listBox_Info.Items.Clear();
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

        unsafe private void timer_updata_Tick(object sender, EventArgs e)
        {

            VCI_CAN_OBJ sobj = new VCI_CAN_OBJ();

            sobj.SendType = (byte)comboBox_SendType.SelectedIndex;
            sobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
            sobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;
            sobj.DataLen = 8;

            for (byte nn = 0; nn < 8; nn  )
            {
                sobj.Data[nn] = 0xff;////////////
            }

            // Frame1C8data,Frame1C9data
            switch (UpdateStep)
            {
                // 0x1C8
                case 2:
                    ulImageAddr = (UInt32)((Frame1C8data[0] << 24) | (Frame1C8data[1] << 16) | (Frame1C8data[2] << 8) | (Frame1C8data[3] << 0));
                    uiLength = (UInt16)((Frame1C8data[4] << 8) | (Frame1C8data[5] << 0));
                    SendResponse(LcuAddrForUpdate, ulImageAddr, uiLength, _CMD_TYPE_INFO);
                    break;

                // 0x1C9
                case 3:
                    // 切换到数据传输模式
                    UpdateStep = 4;
                    break;

                case 4:
                    // 传输数据
                    ulImageAddr = (UInt32)((Frame1C9data[0] << 24) | (Frame1C9data[1] << 16) | (Frame1C9data[2] << 8) | (Frame1C9data[3] << 0));
                    uiLength = (UInt16)((Frame1C9data[4] << 8) | (Frame1C9data[5] << 0));
                    SendResponse(LcuAddrForUpdate, ulImageAddr, uiLength, _CMD_TYPE_DATA);
                    break;

                default:

                    break;
            }

        }
        const Byte _RET_RESPONSE_OK = 1;
        const Byte _RET_RESPONSE_FINISHED = 2;

        const UInt16 _COMM_DATA_LENGTH_EACHTIME = 256;
        const Byte _CMD_TYPE_INFO = 00;
        const Byte _CMD_TYPE_DATA = 01;

        Byte cRetFlag = 0;
        unsafe private void SendResponse(Int32 i32Address, UInt32 ulImageAddr, UInt16 uiLength, Byte ui8CmdType)
        {
            UInt16 i = 0;
            UInt32 utmp32 = 0;
            VCI_CAN_OBJ sobj = new VCI_CAN_OBJ();

            sobj.SendType = (byte)comboBox_SendType.SelectedIndex;
            sobj.RemoteFlag = (byte)comboBox_FrameFormat.SelectedIndex;
            sobj.ExternFlag = (byte)comboBox_FrameType.SelectedIndex;
            sobj.DataLen = 8;

            if (_CMD_TYPE_DATA == ui8CmdType)//发送内容
            {
                for (i = 0; i < (uiLength / 8); i  )//连续发
                {
                    sobj.ID = 0x1D080003   (((UInt32)i) << 20)   (((UInt32)g_u8SelfAddr) << 3)   (((UInt32)LcuAddrForUpdate) << 11);

                    // 数据填充
                    sobj.Data[0] = BinBuffer[ulImageAddr   i * 8   0];
                    sobj.Data[1] = BinBuffer[ulImageAddr   i * 8   1];
                    sobj.Data[2] = BinBuffer[ulImageAddr   i * 8   2];
                    sobj.Data[3] = BinBuffer[ulImageAddr   i * 8   3];
                    sobj.Data[4] = BinBuffer[ulImageAddr   i * 8   4];
                    sobj.Data[5] = BinBuffer[ulImageAddr   i * 8   5];
                    sobj.Data[6] = BinBuffer[ulImageAddr   i * 8   6];
                    sobj.Data[7] = BinBuffer[ulImageAddr   i * 8   7];

                    if (VCI_Transmit(m_devtype, m_devind, m_canind, ref sobj, 1) == 0)
                    {
                        //MessageBox.Show("数据发送失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        //labelSysInfo.Text = "CAN 数据发送失败";////////////////////
                    }

                    System.Threading.Thread.Sleep(mainPage.CANupdateTimeInterval);
                }

                System.Threading.Thread.Sleep(10);

                cRetFlag = _RET_RESPONSE_OK;
            }
            else //_CMD_TYPE_INFO
            {
                char[] i8uStr = new char[20];
                Byte i8uPercentFinished = 0;

                sobj.ID = 0x1CF80003   (((UInt32)g_u8SelfAddr) << 3)   (((UInt32)LcuAddrForUpdate) << 11);

                // 把偏移地址填入发送缓冲区
                sobj.Data[0] = Frame1C8data[0];
                sobj.Data[1] = Frame1C8data[1];
                sobj.Data[2] = Frame1C8data[2];
                sobj.Data[3] = Frame1C8data[3];

                if ((ulImageAddr % (_COMM_DATA_LENGTH_EACHTIME * 4)) == 0)
                {
                    i8uPercentFinished = (Byte)((float)ulImageAddr / (float)g_ui32LCUsize * 100);
                    if (i8uPercentFinished >= 100)//显示100%
                    {
                        i8uStr[0] = '1';
                        i8uStr[1] = '0';
                        i8uStr[2] = '0';
                        i8uStr[3] = '%';
                        i8uStr[4] = '\r';
                        i8uStr[5] = '\n';
                    }
                    else if (i8uPercentFinished >= 10)//显示XX%
                    {
                        i8uStr[0] = Convert.ToChar(i8uPercentFinished / 10);
                        i8uStr[1] = Convert.ToChar(i8uPercentFinished % 10);
                        i8uStr[2] = '%';
                        i8uStr[3] = ' ';
                    }
                    else //显示X%
                    {
                        i8uStr[0] = Convert.ToChar(i8uPercentFinished % 10);
                        i8uStr[1] = '%';
                        i8uStr[2] = ' ';
                    }

                    //labelUpdateProgress.Text = Convert.ToString(i8uPercentFinished);
                    //progressBarUpdate.Value = i8uPercentFinished;
                }

                if (g_ui32LCUsize <= ulImageAddr) //已全部请求完
                {

                    //SerialPutString("\r\n");

                    uiLength = 0;

                    cRetFlag = _RET_RESPONSE_FINISHED;
                    // 升级完成
                    UpdateStep = 5;
                   // labelUpdateStus.Text = "升级完成!!!";
                  //  labelUpdateProgress.Text = "100";
                  //  progressBarUpdate.Value = 100;
                    // 关闭升级任务
                    timer_updata.Enabled = false;
                    // 使能相关升级参数配置控件
                    //MCUBox.Enabled = true;
                    //comboBoxLCUAddr.Enabled = true;
                   // button1.Enabled = true;
                }
                else if (g_ui32LCUsize > ulImageAddr   _COMM_DATA_LENGTH_EACHTIME)
                {
                    uiLength = _COMM_DATA_LENGTH_EACHTIME;

                    cRetFlag = _RET_RESPONSE_OK;  
                }
                else
                {
                    uiLength = Convert.ToUInt16(g_ui32LCUsize - ulImageAddr);

                    uiLength = Convert.ToUInt16(((uiLength % 8) > 0) ? ((uiLength / 8   1) * 8) : uiLength);

                    cRetFlag = _RET_RESPONSE_OK;
                }

                utmp32 = ((UInt32)uiLength << 16)   (UInt32)cyg_crc16(ulImageAddr, uiLength);
                sobj.Data[4] = Convert.ToByte((utmp32 >> 24) & 0xFF);
                sobj.Data[5] = Convert.ToByte((utmp32 >> 16) & 0xFF);
                sobj.Data[6] = Convert.ToByte((utmp32 >> 8) & 0xFF);
                sobj.Data[7] = Convert.ToByte((utmp32 >> 0) & 0xFF);

                if (VCI_Transmit(m_devtype, m_devind, m_canind, ref sobj, 1) == 0)
                {
                    //MessageBox.Show("指令发送失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                }

                System.Threading.Thread.Sleep(mainPage.CANupdateTimeInterval);

                if (UpdateStep == 5)
                    UpdateStep = 0;
            }
        }

        /* Table of CRC constants - implements x^16 x^12 x^5 1 */
        static private UInt16[] crc16_tab = {
	        0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,
	        0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,
	        0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,
	        0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,
	        0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,
	        0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,
	        0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,
	        0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,
	        0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,
	        0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,
	        0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,
	        0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,
	        0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,
	        0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,
	        0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,
	        0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,
	        0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,
	        0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,
	        0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,
	        0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,
	        0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,
	        0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,
	        0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,
	        0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,
	        0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,
	        0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,
	        0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,
	        0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,
	        0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,
	        0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,
	        0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,
	        0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
        };

        UInt16 cyg_crc16(UInt32 index, Int32 len)
        {
            Int32 i;
            UInt16 cksum;

            cksum = 0;
            for (i = 0; i < len; i  )
            {
                cksum = Convert.ToUInt16((crc16_tab[((cksum >> 8) ^ BinBuffer[index   i]) & 0xFF] ^ (cksum << 8)) & 0xffff);
            }
            return cksum;
        }

        private void groupBox1_Enter(object sender, EventArgs e)
        {

        }

        private void 单体信息ToolStripMenuItem_Click(object sender, EventArgs e)
        {

            //if (m_bOpen == 0)
            //{
            //    MessageBox.Show("设备未启动,请检查设备连接!");
            //    return;
            //}

            // 切换页码
            CurPageIndex = 3;// Page_CellInfo;
            //mainPage.BMSInfoSendEnable = 0;

            CellInfo child = new CellInfo();
            child.Show();
            

        }

        private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
        {

        } 





    }
}

标签: Excel c 数据

实例下载地址

读取EXCEL内数据(AET测试)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警