今年年初我们做了一套防窃电的软件,其中通讯采取的是串口方式。前段时间,根据现场的反馈,我们增加了蓝牙通讯的功能。系统界面如下图所示: 今天,现场人员反馈说:“解析的数据出现问题”,所以我在这里把调试代码的过程做个记录,以方便大家的参考。现场发回的数据如下图所示: 我们要做的就是对这些数据进行拆分,得到满足规约的数据,然后进行解析。 本软件所用规约如下图所示: 这个规约比较简单,可以看到以 0x68 0xA5 0x00 0x68 开头,一共170(0xA5 0x00 )个字节,为了验证数据的有效性,对数据做了CRC 校验。 下面是读取数据、拆分数据、显示数据的代码。 //读取数据
public static List<byte> ReadFile(string fileName) { List<byte> lst = new List<byte>();
string[] strs = File.ReadAllLines(fileName);
foreach (string str in strs) { string[] chars = str.Split(' '); foreach (string s in chars) { byte byt = Convert.ToByte("0x" + s, 16); lst.Add(byt); } } return lst; }
//拆分并显示数据
private static int FindPara(List<byte> lst) { byte[] model = new byte[] { 104, 165, 00, 104 }; int count = lst.Count - model.Length; for (int i = 0; i <= count; i++) { if (lst[i] == model[0]) { int j = 1; for (; j < model.Length; j++) { if (lst[i + j] != model[j]) break; } if (j == model.Length) return i; } } return -1; }
private static string PrimaryDataOx(byte[] buf) { string str = string.Empty; for (int i = 0; i < buf.Length; i++) { str += buf[i].ToString("X2") + " "; } return str.Trim(); }
public static void WriteFile(string fileName,List<byte> lst) { StreamWriter sw = File.CreateText(fileName);
int index = FindPara(lst); int len = 170; int count = 1;
while (index != -1) { lst.RemoveRange(0, index); if (lst.Count < len) break;
byte[] buf = lst.GetRange(0, len).ToArray(); string text = count + " -- " + PrimaryDataOx(buf); sw.WriteLine(text);
lst.RemoveRange(0, len); count++; index = FindPara(lst); } sw.Close(); Process.Start(fileName); }
通过以上代码,我们就可以把满足规约的数据拆分出来,根据规约进行解析得到实际的物理量,然后进行分析处理了。 拆分后的数据如下图所示: 最后总结一下,通过这种方式就没有必要每次都等现场人员把设备拿回实验室,或者自己跑现场了,直接让他们把数据导入到文件中,我们在远程就能调试代码解决问题了,是不是很方便。今天就到这里吧!See You! 对了,再多说一句,各位老铁,如果你有项目需要写代码,我们可以合作一起来完成甲方的任务。See You!
参考阅读:
经过8年多的发展,LSGO软件技术团队在地理信息系统、数据统计分析、计算机视觉领域积累了丰富的研发经验,也建立了人才培养的完备体系。 欢迎对算法设计与实现感兴趣的同学加入,与我们共同成长进步。
|