///
        /// 设置类中的属性值
        ///
        ///
        ///
        ///
        public bool SetModelValue(string FieldName, byte[] Value, object obj)
        {
            try
            {
                Type   Ts       = obj.GetType();
                string typeName = Ts.GetProperty(FieldName).PropertyType.Name;
                if (typeName == "string")
                {
                    //byte 转 string
                    string _value = ByteProcess.byteArrayToString(Value);
                    Ts.GetProperty(FieldName).SetValue(obj, _value, null);
                }
                else if (typeName == "Int32")
                {
                    //byte 转 int
                    int _value = ByteProcess.byteArrayToInt(MergerArray(Value, 4), 0);
                    Ts.GetProperty(FieldName).SetValue(obj, _value, null);
                }
                else
                {
                    Ts.GetProperty(FieldName).SetValue(obj, Value, null);
                }

                return(true);
            }
            catch
            {
                return(false);
            }
        }
示例#2
0
        public bool CheckOK(List <byte> buf)
        {
            //如果buf里的数值小于3
            if (buf.Count < 3)
            {
                return(false);
            }
            int _dataLength = DataLength(buf);

            if (_dataLength < 3)
            {
                return(false);
            }
            //和校验算法
            int sumValue = 0;

            for (int i = 0; i < (_dataLength - 1); i++)
            {
                sumValue += buf[i];
            }
            if (ByteProcess.intToByteArray(sumValue)[3] == buf[_dataLength - 1])
            {
                return(true);
            }
            return(false);
        }
        ///
        /// 获取类中的属性值
        ///
        ///
        public byte[] GetModelValue(string FieldName, object obj)
        {
            try
            {
                Type Ts = obj.GetType();
                //                object o = Ts.GetProperty(FieldName).GetValue(obj, null);
                string typeName = Ts.GetProperty(FieldName).PropertyType.Name;
                object o        = Ts.GetProperty(FieldName).GetValue(obj, null);
                if (typeName == "string") //string
                {
                    byte[] Value = ByteProcess.stringToByteArray((string)o);
                    return(Value);
                }
                else if (typeName == "Int32") //int
                {
                    long   tempVlaue = (int)o;
                    byte[] Value     = ByteProcess.longToByteArray(tempVlaue);
                    return(Value);
                }
                else if (typeName == "Int64") //long
                {
                    byte[] Value = ByteProcess.longToByteArray((long)o);
                    return(Value);
                }
                else
                {
                    return(o as byte[]);
                }

                /*
                 *              if (o is string)
                 *              {
                 *                  //string 转 byte[]
                 *                  byte[] Value = ByteProcess.stringToByteArray((string)o);
                 *                  return Value;
                 *              }
                 *              else if (o is byte[])
                 *              {
                 *                  return (o as byte[]);
                 *              }
                 *              else
                 *              {
                 *                  //当成long 处理 转 byte[]
                 *                  byte[] Value = ByteProcess.longToByteArray((long)o);
                 *                  return Value;
                 *              }
                 */
            }
            catch
            {
                return(null);
            }
        }
示例#4
0
        public byte[] Encode()
        {
            byte[] Args = this.Entity.Encode();
            int    sum  = 0;

            byte[] bytesNew = new byte[Args.Length + MinLength()];
            bytesNew[0] = (byte)Entity.GetCommand();
            bytesNew[1] = (byte)bytesNew.Length;

            sum += bytesNew[0];
            sum += bytesNew[1];
            for (int i = 0; i < Args.Length; i++)
            {
                bytesNew[2 + i] = Args[i];
                sum            += Args[i];
            }
            bytesNew[bytesNew.Length - 1] = ByteProcess.intToByteArray(sum)[3];

            return(bytesNew);
        }
示例#5
0
        private void TaskBuilder()
        {
            //回复同步
            mRecoverTask              = new SimpleSerialPortTask <ResetEcuReq, NullEntity>();
            mRecoverParam             = mRecoverTask.GetRequestEntity();
            mRecoverTask.RetryMaxCnts = 1;
            mRecoverTask.Timerout     = 1000;
            mRecoverParam.deviceType  = 0XF1;
            mRecoverParam.cmdCode     = 0x02;
            mRecoverParam.param1      = 0;
            mRecoverParam.param2      = 0;
            //等待同步报文
            //监听0x06
            mBroadCastTask = new SimpleSerialPortTask <NullEntity, pcTakeoverReq>();
            mBroadCastTask.RetryMaxCnts = 0;
            mBroadCastTask.Timerout     = 30 * 1000;
            mBroadCastTask.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <pcTakeoverReq> mEventArgs = e as SerialPortEventArgs <pcTakeoverReq>;
                if (mEventArgs.Data != null)
                {
                    //PC接管报文的响应
                    mStopSyncTask.Excute();
                    //启动监控,防止没有发成功,直到由PC接管为止
                    mMonitorTask.Excute();
                }
                else
                {
                    SetListView(sender, "上电超时!", "设备未上电或通讯有异常");
                    SetItemFail(sender, BindSteps.WAIT_POWER);
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    StopTask();
                }
            };
            //监控同步报文
            mMonitorTask = new SimpleSerialPortTask <NullEntity, pcTakeoverReq>();
            mMonitorTask.RetryMaxCnts = 0;
            mMonitorTask.Timerout     = 1000;
            mMonitorTask.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <pcTakeoverReq> mEventArgs = e as SerialPortEventArgs <pcTakeoverReq>;
                if (mEventArgs.Data != null)
                {
                    mStopSyncTask.Excute();
                    //再继续监控
                    mMonitorTask.Excute();
                }
                else
                {
                    SetMainText(sender, STEP_LEVEL.CHECK_SN);
                    mGetDevInfoTask.Excute();
                }
            };

            //停止同步报文
            mStopSyncTask              = new SimpleSerialPortTask <pcTakeOverRsp, NullEntity>();
            mStopSyncParam             = mStopSyncTask.GetRequestEntity();
            mStopSyncTask.RetryMaxCnts = 0;
            mStopSyncTask.Timerout     = 1000;
            mStopSyncParam.DeviceType  = 0xF1;
            mStopSyncParam.HardWareID  = 0xF1;
            mStopSyncParam.FirmID      = 0;

            //获取SN号
            mGetDevInfoTask = new SimpleSerialPortTask <getDevinfoReq, getDevinfoRsp>();
            mDevInfoParam   = mGetDevInfoTask.GetRequestEntity();
            mGetDevInfoTask.RetryMaxCnts = 10;
            mGetDevInfoTask.Timerout     = 1000;
            mDevInfoParam.devType        = 0X08;
            mGetDevInfoTask.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <getDevinfoRsp> mEventArgs = e as SerialPortEventArgs <getDevinfoRsp>;
                if (mEventArgs.Data != null)
                {
                    string devSN = ByteProcess.byteArrayToString(mEventArgs.Data.devSN);
                    if (mSN != devSN)
                    {
                        string temp = String.Format("设备读取的SN号:{0}", devSN);
                        SetListView(sender, "标签和设备SN号不匹配", temp);
                        SetMainText(sender, STEP_LEVEL.FAIL);
                        SetItemFail(sender, BindSteps.SN_VALID);
                        mRecoverTask.Excute();
                        StopTask();
                    }
                    else
                    {
                        SetValidSN(sender, INFO_LEVEL.PASS);
                        SetMainText(sender, STEP_LEVEL.BIND_KEY1);
                        mBindKey1Param.ack_device = Const.PCU;
                        mBindKey1Task.Excute();
                        mTimeout = 100;
                    }
                }
                else
                {
                    SetListView(sender, "未收到读取设备信息", "设备未上电或通讯有异常");
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    SetValidSN(sender, INFO_LEVEL.FAIL);
                    mRecoverTask.Excute();
                    StopTask();
                }
            };

            mBindKey1Task              = new SimpleSerialPortTask <get7001Result, get7001ResultRsp>();
            mBindKey1Param             = mBindKey1Task.GetRequestEntity();
            mBindKey1Param.ack_device  = Const.PCU;
            mBindKey1Param.server_mode = 0x08;//绑定钥匙
            mBindKey1Task.RetryMaxCnts = 0;
            mBindKey1Task.Timerout     = 10 * 1000;
            mBindKey1Task.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <get7001ResultRsp> mEventArgs = e as SerialPortEventArgs <get7001ResultRsp>;
                if (mEventArgs.Data != null)
                {
                    byte mAskDevice = (byte)mEventArgs.Data.ack_device; //应答设备
                    byte mAskResult = (byte)mEventArgs.Data.ack_value;  //响应
                    int  temp       = (byte)mEventArgs.Data.CutError_1 |
                                      mEventArgs.Data.CutError_2 << 8 |
                               mEventArgs.Data.ShortError_1 << 16;
                    int iAddrCode = temp >> 4;
                    if (mAskDevice == Const.PCU)
                    {
                        // 如果不为0, 说明有按下,把地址码键值存入List
                        if (iAddrCode != 0)
                        {
                            // 先判断是否含有某个Key
                            if (ht.ContainsKey(iAddrCode))
                            {
                                int iCnt = (int)ht[iAddrCode];
                                ht[iAddrCode] = iCnt + 1;
                            }
                            else//如果不存在此KEY
                            {
                                ht.Add(iAddrCode, 0);
                            }
                        }
                    }
                    //判断哈希的最大值
                    int valueMax = 0;
                    foreach (int value in ht.Values)
                    {
                        if (value > valueMax)
                        {
                            valueMax = value;
                        }
                    }
                    //判断次数是否超过某一值
                    if (valueMax >= this.TryCnts)
                    {
                        foreach (int key in ht.Keys)
                        {
                            if ((int)ht[key] == valueMax)
                            {
                                SetBindKey1(sender, INFO_LEVEL.PASS);
                                //保存Key1按键
                                mKey1Value = key;
                                mTimeout   = 100;
                                byte[] temp1 = new byte[3];
                                temp1[0] = (byte)(mKey1Value >> 16 & 0xFF);
                                temp1[1] = (byte)(mKey1Value >> 8 & 0xFF);
                                temp1[2] = (byte)(mKey1Value & 0xFF);
                                mWriteKeyParam.Key1Value = temp1;
                                SetKeyValue(sender, KeyType.BIND_KEY1, mKey1Value);
                                ht.Clear();
                                //写NV
                                if (KeyNumber == 2)
                                {
                                    SetMainText(sender, STEP_LEVEL.BIND_KEY2);
                                    mBindKey2Task.Excute();
                                }
                                else
                                {
                                    //写NV
                                    byte[] temp2 = new byte[3];
                                    mWriteKeyParam.Key2Value = temp2;
                                    mWriteKeyTask.Excute();
                                }
                                return;
                            }
                        }
                    }
                    if (mTimeout-- > 0)
                    {
                        Thread.Sleep(50);
                        mBindKey1Task.Excute();
                    }
                    else
                    {
                        SetListView(sender, "绑定超时", "未在5秒内,有效按下按键");
                        SetItemFail(sender, BindSteps.KEY1_BIND);
                        SetMainText(sender, STEP_LEVEL.BIND_TIMEOUT);
                        mRecoverTask.Excute();
                        StopTask();
                    }
                }
                else
                {
                    SetListView(sender, "未收到钥匙的绑定和检查的响应", "设备未上电或通讯有异常");
                    SetItemFail(sender, BindSteps.KEY1_BIND);
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    mRecoverTask.Excute();
                    StopTask();
                }
            };

            mBindKey2Task              = new SimpleSerialPortTask <get7001Result, get7001ResultRsp>();
            mBindKey2Param             = mBindKey2Task.GetRequestEntity();
            mBindKey2Param.ack_device  = Const.PCU;
            mBindKey2Param.server_mode = 0x08;//绑定钥匙
            mBindKey2Task.RetryMaxCnts = 0;
            mBindKey2Task.Timerout     = 10 * 1000;
            mBindKey2Task.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <get7001ResultRsp> mEventArgs = e as SerialPortEventArgs <get7001ResultRsp>;
                if (mEventArgs.Data != null)
                {
                    byte mAskDevice = (byte)mEventArgs.Data.ack_device; //应答设备
                    byte mAskResult = (byte)mEventArgs.Data.ack_value;  //响应
                    int  temp       = (byte)mEventArgs.Data.CutError_1 |
                                      mEventArgs.Data.CutError_2 << 8 |
                               mEventArgs.Data.ShortError_1 << 16;
                    int iAddrCode = temp >> 4;
                    if (mAskDevice == Const.PCU)
                    {
                        // 如果不为0, 说明有按下,把地址码键值存入List
                        if (iAddrCode != 0 && iAddrCode != mKey1Value)
                        {
                            // 先判断是否含有某个Key
                            if (ht.ContainsKey(iAddrCode))
                            {
                                int iCnt = (int)ht[iAddrCode];
                                ht[iAddrCode] = iCnt + 1;
                            }
                            else//如果不存在此KEY
                            {
                                ht.Add(iAddrCode, 0);
                            }
                        }
                    }
                    //判断哈希的最大值
                    int valueMax = 0;
                    foreach (int value in ht.Values)
                    {
                        if (value >= valueMax)
                        {
                            valueMax = value;
                        }
                    }
                    //判断次数是否超过某一值
                    if (valueMax > this.TryCnts)
                    {
                        foreach (int key in ht.Keys)
                        {
                            if ((int)ht[key] == valueMax)
                            {
                                SetBindKey2(sender, INFO_LEVEL.PASS);
                                //保存Key1按键
                                mKey2Value = key;
                                byte[] temp1 = new byte[3];
                                temp1[0] = (byte)(mKey2Value >> 16 & 0xFF);
                                temp1[1] = (byte)(mKey2Value >> 8 & 0xFF);
                                temp1[2] = (byte)(mKey2Value & 0xFF);
                                mWriteKeyParam.Key2Value = temp1;
                                SetKeyValue(sender, KeyType.BIND_KEY2, mKey2Value);
                                mWriteKeyTask.Excute();
                                ht.Clear();
                                return;
                            }
                        }
                    }

                    if (mTimeout-- > 0)
                    {
                        Thread.Sleep(50);
                        mBindKey2Task.Excute();
                    }
                    else
                    {
                        SetListView(sender, "绑定超时", "未在5秒内,有效按下按键");
                        SetItemFail(sender, BindSteps.KEY2_BIND);
                        SetMainText(sender, STEP_LEVEL.BIND_TIMEOUT);
                        mRecoverTask.Excute();
                        StopTask();
                    }
                }
                else
                {
                    SetListView(sender, "未收到钥匙的绑定和检查的响应", "设备未上电或通讯有异常");
                    SetItemFail(sender, BindSteps.KEY2_BIND);
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    mRecoverTask.Excute();
                    StopTask();
                }
            };

            mWriteKeyTask              = new SimpleSerialPortTask <writeKeyAddrReq, writeKeyAddrRsp>();
            mWriteKeyParam             = mWriteKeyTask.GetRequestEntity();
            mWriteKeyParam.Key1Index   = 0;
            mWriteKeyParam.Key2Index   = 1;
            mWriteKeyParam.KeyNumber   = 2;
            mWriteKeyParam.DeviceType  = Const.CCU;
            mWriteKeyTask.RetryMaxCnts = 0;
            mWriteKeyTask.Timerout     = 10 * 1000;
            mWriteKeyTask.SimpleSerialPortTaskOnPostExecute += (object sender, EventArgs e) =>
            {
                SerialPortEventArgs <writeKeyAddrRsp> mEventArgs = e as SerialPortEventArgs <writeKeyAddrRsp>;
                if (mEventArgs.Data != null)
                {
                    byte mResult = (byte)mEventArgs.Data.Result;
                    if (mResult == 0)
                    {
                        ht.Clear();
                        SetWriteNV(sender, INFO_LEVEL.PASS);
                        SetMainText(sender, STEP_LEVEL.PASS);
                        mRecoverTask.Excute();
                        StopTask();
                    }
                }
                else
                {
                    SetListView(sender, "写钥匙地址到设备失败", "设备异常或通讯有异常");
                    SetItemFail(sender, BindSteps.WRITE_NV);
                    SetMainText(sender, STEP_LEVEL.FAIL);
                    mRecoverTask.Excute();
                    StopTask();
                }
            };
        }