public static GJResult Create(string str, out string err) { GJResult re = new GJResult(); //if (str.Length < 50 || str.Length > 75)//数据接收没有完成 //{ // err = "设备数据长度不正确:" + str.Length; // return null; //} int int_temp = 0; //int int_temp = str.IndexOf("#"); //if (int_temp == -1) //{ // err = "设备数据不以#开始无法解析"; // return null; //} switch (str.Substring(int_temp + 7, 1)) { case "1": re.OKRe = "Lo NG"; re.OK = false; break; case "2": re.OKRe = "GOOD"; re.OK = true; break; case "4": re.OKRe = "Hi NG"; re.OK = false; break; case "9": re.OKRe = "LL NG"; re.OK = false; break; case "C": re.OKRe = "HH NG"; re.OK = false; break; case "D": re.OKRe = "Hi NG"; re.OK = false; break; default: err = "设备数据异常无法正常解析"; break; } re.XLZ = str.Substring(int_temp + 9, 8).ToDouble(); re.Hi = str.Substring(int_temp + 18, 8).ToDouble(); re.Lo = str.Substring(int_temp + 27, 8).ToDouble(); re.DP = str.Substring(int_temp + 36, 8).ToDouble(); err = ""; return(re); }
private void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { //if (e.EventType == System.IO.Ports.SerialData.Eof) //{ LastCommcationTime = DateTime.Now; byte[] b = new byte[sp.BytesToRead]; sp.Read(b, 0, b.Length); AppMessage.Add("接收干检数据", AppMessage.MsgType.干检, false, AppMessage.ImportantEnum.Normal, b.ToStandardString(false, b.Length)); ReceDataCache += System.Text.Encoding.ASCII.GetString(b); if (ReceDataCache.Length > 10000)//防止异常情况下的内存爆炸 { ReceDataCache = ReceDataCache.Substring(0, ReceDataCache.Length); } var ms = System.Text.RegularExpressions.Regex.Matches(ReceDataCache, "[#].+?[\r]"); if (ms.Count == 0) { return; } ReceDataCache = ""; var str = ms[ms.Count - 1].Value; if (str.Length < 50 || str.Length > 75) { return;//向干检仪发送启动或停止指令的时候对方可能会做简短的应答 } GJResult re = GJResult.Create(str, out string err); if (err == "") { OnGetData_Event(re); //AddReceData(re); } else { OnMsg_Event(err + " | " + b.ToStandardString(false, b.Length)); } //} }