public bool IsAll() { if (!DataStrList.Any()) { return(false); } var len = DataStrList.Count(); var body = DataStrList.Take(len - 2); var crc = CrcHelper.GetCrc16(body).ToArray(); return(crc.Length == 2 && crc[1] == DataStrList.ElementAt(len - 1) && crc[0] == DataStrList.ElementAt(len - 2)); }
private string Deserialize() { try { var datas = DataStrList.ToArray(); //包头 F3 //功能码 02 //字节数 4bytes //唯一识别码 4bytes if (datas.Length == 0 || datas[0] != "f3" || datas[1] != "02") { return(DataStrList.Join(",")); } var trueData = datas.Skip(10); if (!trueData.Any()) { return(DataStrList.Join(",")); } //变量数据 //变量1(4bytes) //变量2 //… //变量N DeviceData = new DeviceData(); var i = 0; for (i = 0; i < ValNum; i++) { var str = trueData.Skip(i * 4).Take(4).Reverse().Join(""); var v = Convert.ToInt32(str, 16); DeviceData.vals.Add(v); } //I口数据 //I1~I8(1bytes) //I9~I17 //… //IN~I(N + 8) trueData = trueData.Skip(i * 4); for (i = 0; i < trueData.Count(); i++) { if (DeviceData.ins.Count >= InNum) { break; } var str = trueData.Skip(i).Take(1).Join(""); var v = Convert.ToInt32(str, 16); for (var j = 0; j < 8; j++) { if (DeviceData.ins.Count >= InNum) { break; } var temp1 = (byte)((v & 0xff) << (7 - j)); var temp2 = (byte)((temp1 >> 7) & 0x01); DeviceData.ins.Add(temp2); } } //O口数据 //O1~O8(1bytes) //O9~O17 //… //ON~O(N + 8) trueData = trueData.Skip(i); for (i = 0; i < trueData.Count(); i++) { if (DeviceData.outs.Count >= OutNum) { break; } var str = trueData.Skip(i).Take(1).Join(""); var v = Convert.ToInt32(str, 16); for (var j = 0; j < 8; j++) { if (DeviceData.outs.Count >= OutNum) { break; } var temp1 = (byte)((v & 0xff) << (7 - j)); var temp2 = (byte)((temp1 >> 7) & 0x01); DeviceData.outs.Add(temp2); } } //CRC校验 2bytes //trueData = trueData.Skip(i); //var crc = CrcHelper.GetCrc16(datas.Take(datas.Length - 2)); return(DeviceData.ToJSON()); } catch (Exception e) { return("解析错误" + DataStrList.Join(",")); } }