/// /// 设置类中的属性值 /// /// /// /// 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); } }
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); } }
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); }
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(); } }; }