public void Test_Sending_Multiple_Data_02() { InitialiseCRCProvider(); var tool = new UsePackageToolExample(); var msg = GetLongMessage(0); var n = msg.Length / 3; var msg1 = new byte[n]; var msg2 = new byte[n]; var msg3 = new byte[msg.Length - msg1.Length - msg2.Length]; Buffer.BlockCopy(msg, 0, msg1, 0, msg1.Length); Buffer.BlockCopy(msg, msg1.Length, msg2, 0, msg2.Length); Buffer.BlockCopy(msg, msg1.Length + msg2.Length, msg3, 0, msg3.Length); tool.Run(msg); tool.Results.Count.Should().Be(1); tool.Run(msg1); tool.Results.Count.Should().Be(1); tool.Run(msg2); tool.Results.Count.Should().Be(1); tool.Run(msg3); tool.TrueCount.Should().Be(2); tool.TrueAtLastast.Should().BeTrue(); tool.Results.Count.Should().Be(2); }
public void Test_Sending_Multiple_Data_09() { InitialiseCRCProvider(); var tool = new UsePackageToolExample(); var msg1 = new byte[] { 0xAA, 0xEE, 0x04, 0x00 }; //头部是正确的 var msg2 = new byte[] { 0x01, 0x02, 0x03, 0x04, 0x64, 0x89 }; var msg3 = new byte[] { 0xCC }; tool.Run(msg1); tool.Results.Count.Should().Be(0); tool.Run(msg2); tool.Results.Count.Should().Be(0); tool.Run(msg3); tool.TrueCount.Should().Be(1); tool.TrueAtLastast.Should().BeTrue(); tool.Results.Count.Should().Be(1); tool.Results[0].Item1.Should().Be(0xEE); tool.Results[0].Item2.Count.Should().Be(4); for (int i = 0; i < tool.Results[0].Item2.Count; i++) { tool.Results[0].Item2[i].Should().Be((byte)(i + 1)); } }
public void Test_Impurities_InTheFrontAndBack_2() { InitialiseCRCProvider(); var tool = new UsePackageToolExample(); var msg1 = new byte[] { 0xAA }; //只有起始字符 var msg2 = new byte[] { 0xEE, 0x04, 0x00, 0x01, 0x02 }; var msg3 = new byte[] { 0x03, 0x04, 0x64, 0x89, 0xCC }; tool.Run(Guid.NewGuid().ToByteArray());//杂质 tool.Results.Count.Should().Be(0); tool.Run(msg1); tool.Results.Count.Should().Be(0); tool.Run(msg2); tool.Results.Count.Should().Be(0); tool.Run(msg3); tool.Results.Count.Should().Be(1); tool.TrueCount.Should().Be(1); tool.TrueAtLastast.Should().BeTrue(); tool.Run(Guid.NewGuid().ToByteArray());//杂质 tool.Results.Count.Should().Be(1); tool.Results[0].Item1.Should().Be(0xEE); tool.Results[0].Item2.Count.Should().Be(4); for (int i = 0; i < tool.Results[0].Item2.Count; i++) { tool.Results[0].Item2[i].Should().Be((byte)(i + 1)); } }
public void Test_01() { InitialiseCRCProvider(); var tool = new UsePackageToolExample(); var msg01 = new byte[] { 0xFF, 0xAA }; var msg02 = new byte[] { 0xEE }; var msg03 = new byte[] { 0x04 }; var msg04 = new byte[] { 0x00 }; var msg05 = new byte[] { 0x01 }; var msg06 = new byte[] { 0x02 }; var msg07 = new byte[] { 0x03 }; var msg08 = new byte[] { 0x04 }; var msg09 = new byte[] { 0x64 }; var msg10 = new byte[] { 0x89 }; var msg11 = new byte[] { 0xCC, 0xBB }; tool.Run(msg01); tool.Results.Count.Should().Be(0); tool.Run(msg02); tool.Results.Count.Should().Be(0); tool.Run(msg03); tool.Results.Count.Should().Be(0); tool.Run(msg04); tool.Results.Count.Should().Be(0); tool.Run(msg05); tool.Results.Count.Should().Be(0); tool.Run(msg06); tool.Results.Count.Should().Be(0); tool.Run(msg07); tool.Results.Count.Should().Be(0); tool.Run(msg08); tool.Results.Count.Should().Be(0); tool.Run(msg09); tool.Results.Count.Should().Be(0); tool.Run(msg10); tool.Results.Count.Should().Be(0); tool.Run(msg11); tool.Results.Count.Should().Be(1); tool.TrueCount.Should().Be(1); tool.TrueAtLastast.Should().BeTrue(); tool.Results[0].Item1.Should().Be(0xEE); tool.Results[0].Item2.Count.Should().Be(4); for (int i = 0; i < tool.Results[0].Item2.Count; i++) { tool.Results[0].Item2[i].Should().Be((byte)(i + 1)); } }
public void Test_Full_06() { var msg = new byte[] { 0xAA, 0xFE, //命令字 0x02, 0x00, //数据域长度 0x88, 0x89, //数据域 0x97, 0xDB, //CRC 0xCC, // 0xAA, 0xCD, //命令字 0x02, 0x00, //数据域长度 0x77, 0x78, //数据域 0x13, 0xAB, //CRC 0xCC }; var tool = new UsePackageToolExample(); tool.Run(msg); tool.Results.Count.Should().Be(2); var result0 = tool.Results[0]; result0.Item1.Should().Be(0xFE); var pk1 = result0.Item2; pk1.Count.Should().Be(2); pk1[0].Should().Be(0x88); pk1[1].Should().Be(0x89); var result1 = tool.Results[1]; result1.Item1.Should().Be(0xCD); var pk2 = result1.Item2; pk2.Count.Should().Be(2); pk2[0].Should().Be(0x77); pk2[1].Should().Be(0x78); }
public void Test_Multithreading_01() { InitialiseCRCProvider(); const int COUNT = 100; var tool = new UsePackageToolExample(); for (int i = 0; i < COUNT; i++) { var msg = GetAnIndexInTheDataFieldForMessage(i); tool.Run(msg); Thread.Sleep(_Random.Next(3, 8)); } tool.Results.Count.Should().Be(COUNT); for (int i = 0; i < COUNT; i++) { var n = BitConverter.ToInt32(tool.Results[i].Item2); n.Should().Be(i); } }
//https://www.cnblogs.com/myzony/p/10897895.html /* * FE FE FE FE 68 10 44 33 22 11 00 33 78 81 16 1F 90 00 00 77 66 55 2C 00 77 66 55 2C 31 01 22 11 05 15 20 21 84 08 16 * 说明如下: * FE FE FE FE >--->协议头(1-4组)。 * 68 >------------>帧起始符。 * 10 >------------>仪表类型。 * 44 33 22 11 00 >>倒序为0011223344(以BCD码形式看待),表示表号。 * 33 78 >--------->倒序为7833 (以BCD码形式看待),表示厂家代码。 * 81 >------------>实际为控制码+80,我们可以简单认为只有81正确,非81均为异常,不进行解析。 * 16 >------------>数据域长度,为十进制22,表示后面有22个有效数据。 * 1F 90 >--------->数据标识 (固定)。 * 00 >------------>序列号(固定)。 * 00 77 66 55 >--->倒序为556677.00 (以BCD码形式看待),表示 累计用量。 * 2C >------------>立方米,其它单位见附1。 * 00 77 66 55 >--->倒序为556677.00 (以BCD码形式看待),表示 本月用量。 * 2C >------------>立方米,其它单位见附1。 * 31 01 22 11 05 15 20:2015-05-11 22:01:31,表示实时时间。 * 21 84 >--------->状态,两字节,第1字节定义如下,第2字节由厂家自定义。 * 68:累加和,68+10+44+33+22+11+00+33+78+81+16+1F+90+00+00+77+66+55+2C+00+77+66+55+2C+31+01+22+11+05+15+20+21+84=08 * 16;结束符。 */ private static UsePackageToolExample GetTool() { var upte = new UsePackageToolExample(); //下面是比较复杂的情况。在可能的出现的情况下最完整的协议。 upte.FieldConfig = new FieldConfig( new byte[] { 0xFE, 0xEE, 0xFE, 0xEE, 0x68 }, //起始符 new byte[] { 0x16 }, //结尾符 CRCProviderMode.CRC32, Endianness.BigEndian, 1024 * 8, (0, 5), //起始符 (5, 1), //属性 (6, 7), //地址 (13, 1), //命令字 (14, 1), //数据长度 1, //CRC 1 //结尾符//CRC ); return(upte); }
private static UsePackageToolExample GetTool() { var upte = new UsePackageToolExample(); //下面是比较复杂的情况。在可能的出现的情况下最完整的协议。 upte.FieldConfig = new FieldConfig( new byte[] { 0xFE, 0xEE, 0xFE, 0xEE }, //起始符 new byte[] { 0xCC, 0xDD }, //结尾符 CRCProviderMode.CRC32, Endianness.BigEndian, 1024 * 8, (0, 4), //起始符 (4, 2), //属性 (6, 2), //地址 (8, 2), //命令字 (10, 4), //数据长度 4, //CRC 2 //结尾符//CRC ); return(upte); }