private void Port_DataReceived(object sender, SerialDataReceivedEventArgs e) { int n = ListenPort.BytesToRead; byte[] buf = new byte[n]; ListenPort.Read(buf, 0, n); m_inputBuffer.AddRange(buf); //获取结束符号的位置 var count = (from r in m_inputBuffer where (r == 59) select r).Count(); Debug.WriteLine(count + " ----- " + Encoding.ASCII.GetString(buf)); string tmp = Encoding.ASCII.GetString(m_inputBuffer.ToArray <byte>()); WriteToFileClass writeClass = new WriteToFileClass("ReceivedLog"); Thread t = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile)); t.Start("GPRS: " + "长度:" + tmp.Length + " " + tmp + "\r\n"); if (tmp.Contains("$")) { string data = Encoding.ASCII.GetString(m_inputBuffer.ToArray <byte>()); //判定短信接收的标志符号 if (data.Contains("CMT")) { if (data.EndsWith("\r\n")) { string[] a = new string[] { "CMT" }; //按CMT划分字符串 string[] ArrData = data.Split(a, StringSplitOptions.None); for (int i = 1; i < ArrData.Count(); i++) { //增加一层调用,支持多线程 Thread t1 = new Thread(new ParameterizedThreadStart(parse_Updata)); t1.Start(ArrData[i]); } //如果判定到结束符号,则清空缓冲区 m_inputBuffer.Clear(); } } } }
// 处理COUT类型数据 private void DealCOUT(string msg) // private String DealCOUT(string msg) { string result = null; InvokeMessage("通信输出 " + msg, "接收"); SendBackTTCAString = msg; if (msg.Contains("COUT")) { if (msg.Contains("COUT")) { num = num + 1; FileStream fs = new FileStream("numbd.txt", FileMode.Create); StreamWriter sw = new StreamWriter(fs); //开始写入 sw.Write(num); //清空缓冲区 sw.Flush(); //关闭流 sw.Close(); fs.Close(); } } // InvokeString(msg); var cout = BeidouHelper.GetCOUTInfo(msg); if (cout == null) { return; } // return result; // 发送COSS指令 // 必须在1秒内发送给卫星终端,否则会重新发送“通信输出” var coss = new CCOSSStruct(); coss.SuccessStatus = true; // 终端接收到外设通信申请,并校验成功 SendCOSS(coss); // 发送CACA指令 // 每隔一分钟发送回执$CACA // 65秒左右发一条 var caca = new CCACAStruct(); caca.SenderID = "1"; // 发信方ID为1,表示本机ID,默认 caca.RecvType = cout.SenderType; // 回执的收信方类型 == 通信输出中的发信方类型 caca.RecvAddr = cout.SenderAddr; // 回执的收信方地址 == 通信输出中的发信方地址 caca.Requirements = "1"; // 不保密 caca.ReceiptMsgSequenceNum = cout.MsgSequenceNum; // 回执的报文顺序号 == 通信输出中的报文顺序号 caca.ReceiptContent = "1"; SendCACA(caca); // 解析通信输出中的内容 string content = cout.MsgContent; //通信输出gm8 $60131G2201161111040003046112271367 try { string rawMsg = content; string sid = null; string dealMsg = ProtocolHelpers.dealBCD(rawMsg); WriteToFileClass writeClass = new WriteToFileClass("ReceivedLog"); Thread t = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile)); t.Start("COUT Message: " + " " + dealMsg + "\r\n"); string bdid = cout.SenderAddr; //InvokeMessage("gm3 " + content, "接收"); //sid需要根据北斗卫星号获取 try { sid = Manager.XmlStationDataSerializer.Instance.GetStationByBDID(bdid); } catch (Exception e) { sid = "5712"; Debug.WriteLine("获取站号失败" + e.Message); } EMessageType type = ProtocolMaps.MessageTypeMap.FindKey(dealMsg.Substring(0, 2)); string reportType = dealMsg.Substring(0, 2); if (reportType == "21" || reportType == "22") // 定时报,加报 { // YAC设备的墒情协议: string stationType = dealMsg.Substring(2, 2); switch (stationType) { // 站类为04时墒情站 05墒情雨量站 06,16墒情水位站 07,17墒情水文站 case "04": case "05": case "06": case "07": case "17": { // var station = FindStationByBeidouID(cout.SenderAddr); // string currentMsg = rawMsg.Insert(0, "$" + station.StationID + "1G"); // CEntitySoilData soil = new CEntitySoilData(); // CReportStruct soilReport = new CReportStruct(); // if (Soil.Parse(currentMsg, out soil, out soilReport)) // { // soil.ChannelType = EChannelType.BeiDou; // if (null != this.SoilDataReceived) // this.SoilDataReceived(null, new CEventSingleArgs<CEntitySoilData>(soil)); // if (null != soilReport && null != this.UpDataReceived) // { // soilReport.ChannelType = EChannelType.BeiDou; // soilReport.ListenPort = "COM" + this.Port.PortName; // this.UpDataReceived(null, new UpEventArgs() { RawData = rawMsg, Value = soilReport }); // } // } //} //1111gm string newMsg = dealMsg.Substring(1, dealMsg.Length - 1); CEntitySoilData soil = new CEntitySoilData(); CReportStruct soilReport = new CReportStruct(); if (Soil.Parse(newMsg, out soil, out soilReport)) { soilReport.ChannelType = EChannelType.BeiDou; if (null != this.SoilDataReceived) { this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil)); } if (null != soilReport && null != this.UpDataReceived) { soilReport.ChannelType = EChannelType.GPRS; soilReport.ListenPort = "COM" + this.Port.PortName; soilReport.flagId = bdid; this.UpDataReceived(null, new UpEventArgs() { RawData = newMsg, Value = soilReport }); } } } break; // 站类为01,02,03,12,13时,不是墒情站 case "01": case "02": case "03": case "12": case "13": { //1111gm //string newMsg = dealMsg.Substring(1, dealMsg.Length - 1); //CReportStruct report = new CReportStruct(); //if (Up.Parse(newMsg, out report)) //{ // //6013 $60131G2201161111040003046112271367 // report.ChannelType = EChannelType.BeiDou; // report.ListenPort = "COM" + this.Port.PortName; // if (this.UpDataReceived != null) // { // this.UpDataReceived.Invoke(null, new UpEventArgs() { Value = report, RawData = newMsg }); // } //} CReportStruct report = new CReportStruct(); UpParser Up1 = new UpParser(); if (Up1.Parse_beidou(sid, type, rawMsg, out report)) { //InvokeMessage("gm6 " + rawMsg, "接收"); //$60131G2201161111040003046112271367 report.ChannelType = EChannelType.BeiDou; report.ListenPort = "COM" + this.Port.PortName; report.flagId = bdid; if (this.UpDataReceived != null) { //InvokeMessage("gm7 " + rawMsg, "接收"); this.UpDataReceived.Invoke(null, new UpEventArgs() { Value = report, RawData = rawMsg }); } } } break; default: break; } } else if (reportType == "11") // 人工水位 { } else if (reportType == "23") // 人工流量 { } else if (reportType == "25") { var station = FindStationByBeidouID(cout.SenderAddr); string currentMsg = dealMsg.Insert(0, "$" + station.StationID + "1G"); CEntitySoilData soil = new CEntitySoilData(); CReportStruct soilReport = new CReportStruct(); if (Soil.Parse(currentMsg, out soil, out soilReport)) { soil.ChannelType = EChannelType.BeiDou; if (null != this.SoilDataReceived) { this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil)); } if (null != soilReport && null != this.UpDataReceived) { soilReport.ChannelType = EChannelType.BeiDou; soilReport.ListenPort = "COM" + this.Port.PortName; soilReport.flagId = bdid; this.UpDataReceived(null, new UpEventArgs() { RawData = dealMsg, Value = soilReport }); } } } } catch (Exception exp) { System.Diagnostics.Debug.WriteLine("Beidou 数据解析出错 !" + content + "\r\n" + exp.Message); } //result = msg; //return result; }
// 处理缓冲区中的数据 private void DealData() { while (true) { try { m_semephoreData.WaitOne(); m_mutexListByte.WaitOne(); //等待内存互斥量 var count = (from r in m_inputBuffer where (r == 13) select r).Count(); if (count == 0) { m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 continue; } //xcj 180407 m_mutexListByte.ReleaseMutex(); // gm 1117 List <byte> inputBytes = m_inputBuffer; StringBuilder sb = new StringBuilder(); foreach (byte b in inputBytes) { int i = (int)b; String s = ""; s += (char)i; sb.Append(s); } string flag = sb.ToString(); //1119 WriteToFileClass writeClass = new WriteToFileClass("ReceivedLog"); Thread t = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile)); t.Start("Beidou: " + "长度:" + flag.Length + " " + flag + "\r\n"); Debug.WriteLine("接收消息: " + flag); if (flag.Contains(CCASSStruct.CMD_PREFIX) || flag.Contains(CTSTAStruct.CMD_PREFIX) || flag.Contains(CTTCAStruct.CMD_PREFIX) || flag.Contains(CCOUTStruct.CMD_PREFIX) || flag.Contains(CTINFStruct.CMD_PREFIX)) { if (flag.Contains("?\n")) { flag = flag.Replace("?\n", "?\r\n"); } if (flag.EndsWith("\r\n")) { int indexOfFirstCASS = 0; int indexOfFirstTSTA = 0; int indexOfFirstTTCA = 0; int indexOfFirstCOUT = 0; int indexOfFirstTINF = 0; string[] a = new string[] { "\r\n" }; string[] ArrData = flag.Split(a, StringSplitOptions.None); for (int i = 0; i < ArrData.Count(); i++) { if (ArrData[i].Contains(CCASSStruct.CMD_PREFIX)) { indexOfFirstCASS = ArrData[i].IndexOf("CASS"); string msg = ArrData[i].Substring(indexOfFirstCASS); DealCASS(msg); } if (ArrData[i].Contains(CTSTAStruct.CMD_PREFIX)) { indexOfFirstTSTA = ArrData[i].IndexOf("TSTA"); string msg = ArrData[i].Substring(indexOfFirstTSTA); DealTSTA(msg); } if (ArrData[i].Contains(CTTCAStruct.CMD_PREFIX)) { indexOfFirstTSTA = ArrData[i].IndexOf("TTCA"); string msg = ArrData[i].Substring(indexOfFirstTTCA); DealTTCA(msg); } //顶时报待测 if (ArrData[i].Contains(CCOUTStruct.CMD_PREFIX)) { indexOfFirstTSTA = ArrData[i].IndexOf("COUT"); string msg = ArrData[i].Substring(indexOfFirstCOUT); DealCOUT(msg); } if (ArrData[i].Contains(CTINFStruct.CMD_PREFIX)) { indexOfFirstTSTA = ArrData[i].IndexOf("TINF"); string msg = ArrData[i].Substring(indexOfFirstTINF); DealTAPP(msg); } } m_inputBuffer.Clear(); } } //int indexOfFirst13 = 0; // // int indexOfFirst13 = 0; // //indexOfFirst13 = m_inputBuffer.IndexOf(13); // //var msgBytes = m_inputBuffer.GetRange(0, indexOfFirst13 + 1); // //this.m_inputBuffer.RemoveRange(0, indexOfFirst13 + 1); // m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 // //string msg = System.Text.Encoding.Default.GetString(msgBytes.ToArray()); // int indexOfDollar = msg.IndexOf('$'); // string tag = msg.Substring(indexOfDollar + 1, 4); // msg = msg.Replace("\r", "").Replace("\n", ""); // Debug.WriteLine("接收消息: " + msg); //// InvokeMessage("dealdata " + msg.Trim().Length, ",,,接收"); // switch (tag) // { // case CCASSStruct.CMD_PREFIX: DealCASS(msg); break; // case CTSTAStruct.CMD_PREFIX: DealTSTA(msg); break; // case CTTCAStruct.CMD_PREFIX: DealTTCA(msg); break; // case CCOUTStruct.CMD_PREFIX: { DealCOUT(msg); break; } // case CTINFStruct.CMD_PREFIX: { DealTAPP(msg); InvokeMessage("TAPP...", "接收"); break; } // default: break; // } } catch (Exception exp) { Debug.WriteLine(exp.Message); } }//end of while }
private void DealData() { while (true) { try { m_semephoreData.WaitOne(); Thread.Sleep(1000); string data = string.Empty; string rawdata = System.Text.Encoding.ASCII.GetString(m_inputBuffer.ToArray()); WriteToFileClass writeClass = new WriteToFileClass("ReceivedLog"); Thread t = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile)); t.Start("GPRS: " + "长度:" + rawdata.Length + " " + rawdata + "\r\n"); //InvokeMessage(rawdata, "原始数据"); if (rawdata == null || rawdata == "") { continue; } if (!rawdata.EndsWith(";") && !rawdata.Contains(";") && !rawdata.Contains(";") && !rawdata.Contains(";")) { InvokeMessage("未包含结束符号", "输出"); continue; } m_inputBuffer.Clear(); string temp = rawdata.Trim(); string result = string.Empty; //InvokeMessage(temp, "原始数据"); //TODO 判定结束符 if (rawdata.Contains("$")) { data = rawdata; string[] dataList = data.Split('$'); //上行报文接收需回复TRU //数据解析 for (int i = 0; i < dataList.Count(); i++) { string oneGram = dataList[i]; CReportStruct report = new CReportStruct(); Protocol.Data.ZFXY.UpParse up1 = new Data.ZFXY.UpParse(); //UpPaser up = new UpPaser(); if (up1.Parse(oneGram, out report)) { report.ChannelType = EChannelType.Cable; report.ListenPort = "COM" + this.Port.PortName; if (this.UpDataReceived != null) { InvokeMessage(oneGram, "[CABLE]接收"); this.UpDataReceived.Invoke(null, new UpEventArgs() { Value = report, RawData = oneGram }); } } } } } catch (Exception exp) { Debug.WriteLine(exp.Message); m_inputBuffer.Clear(); //InvokeMessage(rawdata, "接收"); } }//end of while }
// 处理缓冲区中的数据 //private void DealData() //{ // while (true) // { // try // { // m_semephoreData.WaitOne(); // m_mutexListByte.WaitOne(); //等待内存互斥量 // var count = (from r in m_inputBuffer where (r == 13) select r).Count(); // if (count == 0) // { // m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 // continue; // } // int indexOfFirst13 = 0; // indexOfFirst13 = m_inputBuffer.IndexOf(13); // var msgBytes = m_inputBuffer.GetRange(0, indexOfFirst13 + 1); // this.m_inputBuffer.RemoveRange(0, indexOfFirst13 + 1); // m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 // string msg = System.Text.Encoding.Default.GetString(msgBytes.ToArray()); // // InvokeMessage(msg.ToString()+"..."+msg.Length,"测试"); // int indexOfDollar = msg.IndexOf('$'); // string tag = msg.Substring(indexOfDollar + 1, 4); // msg = msg.Replace("\r", "").Replace("\n", ""); // Debug.WriteLine("接收消息: " + msg); // switch (tag) // { // case CBeiDouBJXX.CMD_PREFIX: DealBJXX(msg); break; // case CBeiDouZTXX.CMD_PREFIX: DealZTXX(msg); break; // case CBeiDouSJXX.CMD_PREFIX: DealSJXX(msg); break; // case CBeiDouCOUT.CMD_PREFIX: DealCOUT(msg); break; // default: break; // } // } // catch (Exception exp) // { // Debug.WriteLine(exp.Message); // } // }//end of while //} // 处理本机信息 BJXX数据类型 private void DealData() { while (true) { try { m_semephoreData.WaitOne(); m_mutexListByte.WaitOne(); //等待内存互斥量 var count = (from r in m_inputBuffer where (r == 13) select r).Count(); if (count == 0) { m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 continue; } m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 //gm1118 string flag = Encoding.ASCII.GetString(m_inputBuffer.ToArray <byte>()); //1119 WriteToFileClass writeClass = new WriteToFileClass("ReceivedLog"); Thread t = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile)); t.Start("Beidou500: " + "长度:" + " " + flag + "\r\n"); Debug.WriteLine("接收消息: " + flag); if (flag.Contains(CBeiDouBJXX.CMD_PREFIX) || flag.Contains(CBeiDouZTXX.CMD_PREFIX) || flag.Contains(CBeiDouSJXX.CMD_PREFIX) || flag.Contains(CBeiDouCOUT.CMD_PREFIX)) { if (flag.EndsWith("\r\n")) { int indexOfFirstBJXX = 0; int indexOfFirstZTXX = 0; int indexOfFirstSJXX = 0; int indexOfFirstCOUT = 0; string[] a = new string[] { "\r\n" }; string[] ArrData = flag.Split(a, StringSplitOptions.None); for (int i = 0; i < ArrData.Count(); i++) { if (ArrData[i].Contains(CBeiDouBJXX.CMD_PREFIX)) { indexOfFirstBJXX = ArrData[i].IndexOf("BJXX"); string msg = ArrData[i].Substring(indexOfFirstBJXX); DealBJXX(msg); } if (ArrData[i].Contains(CBeiDouZTXX.CMD_PREFIX)) { indexOfFirstZTXX = ArrData[i].IndexOf("ZTXX"); string msg = ArrData[i].Substring(indexOfFirstZTXX); DealZTXX(msg); } if (ArrData[i].Contains(CBeiDouSJXX.CMD_PREFIX)) { indexOfFirstSJXX = ArrData[i].IndexOf("SJXX"); string msg = ArrData[i].Substring(indexOfFirstSJXX); DealSJXX(msg); } //顶时报待测 if (ArrData[i].Contains(CBeiDouCOUT.CMD_PREFIX)) { indexOfFirstCOUT = ArrData[i].IndexOf("COUT"); string msg = ArrData[i].Substring(indexOfFirstCOUT); DealCOUT(msg); } } m_inputBuffer.Clear(); } } } catch (Exception exp) { Debug.WriteLine(exp.Message); } }//end of while }
// 处理通信输出 COUT类型数据 public void DealCOUT(string msg) { InvokeMessage("通信输出 " + msg, "接收"); string str = msg.Trim(); if (str.Contains("COUT")) { if (str.Contains("COUT")) { num = num + 1; FileStream fs = new FileStream("numbd.txt", FileMode.Create); StreamWriter sw = new StreamWriter(fs); //开始写入 sw.Write(num); //清空缓冲区 sw.Flush(); //关闭流 sw.Close(); fs.Close(); } } var cout = Beidou500Helper.GetCOUTInfo(msg); //InvokeMessage("gm1 " + "通过截取", "接收"); if (cout == null) { //InvokeMessage("gm2 " + "通过截取", "接收"); return; } //TODO //需要处理dealbcd码的走这里 // 解析通信输出中的内容 string content = cout.MsgContent; UpParser up = new UpParser(); List <CUpReport> reports = new List <CUpReport>(); //TODO //添加调用代码 try { string rawMsg = content; string sid = null; string dealMsg = ProtocolHelpers.dealBCD(rawMsg); WriteToFileClass writeClass = new WriteToFileClass("ReceivedLog"); Thread t = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile)); t.Start("COUT Message: " + " " + dealMsg + "\r\n"); //InvokeMessage("gm3 " + content, "接收"); //sid需要根据北斗卫星号获取 try { string bdid = cout.SenderAddr; sid = Manager.XmlStationDataSerializer.Instance.GetStationByBDID(bdid); } catch (Exception e) { sid = "5712"; Debug.WriteLine("获取站号失败" + e.Message); } EMessageType type = ProtocolMaps.MessageTypeMap.FindKey(dealMsg.Substring(0, 2)); string reportType = dealMsg.Substring(0, 2); //InvokeMessage("gm4 " + reportType, "接收"); if (reportType == "21" || reportType == "22") // 定时报,加报 { // YAC设备的墒情协议: string stationType = dealMsg.Substring(2, 2); //InvokeMessage("gm5 " + stationType, "接收"); switch (stationType) { // 站类为04时墒情站 05墒情雨量站 06,16墒情水位站 07,17墒情水文站 case "04": case "05": case "06": case "07": case "17": { //var station = FindStationByBeidouID(cout.SenderAddr); //string currentMsg = rawMsg.Insert(0, "$" + station.StationID + "1G"); //CEntitySoilData soil = new CEntitySoilData(); //CReportStruct soilReport = new CReportStruct(); //if (Soil.Parse(currentMsg, out soil, out soilReport)) //{ // soil.ChannelType = EChannelType.BeiDou; // if (null != this.SoilDataReceived) // this.SoilDataReceived(null, new CEventSingleArgs<CEntitySoilData>(soil)); // if (null != soilReport && null != this.UpDataReceived) // { // soilReport.ChannelType = EChannelType.BeiDou; // soilReport.ListenPort = "COM" + this.Port.PortName; // this.UpDataReceived(null, new UpEventArgs() { RawData = rawMsg, Value = soilReport }); // } //} // string newMsg = rawMsg.Substring(1, rawMsg.Length - 1); CEntitySoilData soil = new CEntitySoilData(); CReportStruct soilReport = new CReportStruct(); if (Soil.Parse(rawMsg, out soil, out soilReport)) { soilReport.ChannelType = EChannelType.BeiDou; if (null != this.SoilDataReceived) { this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil)); } if (null != soilReport && null != this.UpDataReceived) { soilReport.ChannelType = EChannelType.GPRS; soilReport.ListenPort = "COM" + this.Port.PortName; this.UpDataReceived(null, new UpEventArgs() { RawData = rawMsg, Value = soilReport }); } } } break; // 站类为01,02,03,12,13时,不是墒情站 case "01": case "02": case "03": case "12": case "13": { //var station = FindStationByBeidouID(cout.SenderAddr); //rawMsg = rawMsg.Insert(0, station.StationID + " "); //CReportStruct report = new CReportStruct(); //if (Up.Parse(rawMsg, out report)) //{ // report.ChannelType = EChannelType.BeiDou; // report.ListenPort = "COM" + this.Port.PortName; // if (this.UpDataReceived != null) // this.UpDataReceived.Invoke(null, new UpEventArgs() { Value = report, RawData = msg }); //} //string newMsg = rawMsg.Substring(1, rawMsg.Length - 1); CReportStruct report = new CReportStruct(); UpParser Up1 = new UpParser(); if (Up1.Parse_beidou(sid, type, rawMsg, out report)) { //InvokeMessage("gm6 " + rawMsg, "接收"); //$60131G2201161111040003046112271367 report.ChannelType = EChannelType.BeiDou; report.ListenPort = "COM" + this.Port.PortName; if (this.UpDataReceived != null) { //InvokeMessage("gm7 " + rawMsg, "接收"); this.UpDataReceived.Invoke(null, new UpEventArgs() { Value = report, RawData = rawMsg }); } } } break; default: break; } } else if (reportType == "11") // 人工水位 { } else if (reportType == "23") // 人工流量 { } else if (reportType == "25") { var station = FindStationByBeidouID(cout.SenderAddr); string currentMsg = rawMsg.Insert(0, "$" + station.StationID + "1G"); CEntitySoilData soil = new CEntitySoilData(); CReportStruct soilReport = new CReportStruct(); if (Soil.Parse(currentMsg, out soil, out soilReport)) { soil.ChannelType = EChannelType.BeiDou; if (null != this.SoilDataReceived) { this.SoilDataReceived(null, new CEventSingleArgs <CEntitySoilData>(soil)); } if (null != soilReport && null != this.UpDataReceived) { soilReport.ChannelType = EChannelType.BeiDou; soilReport.ListenPort = "COM" + this.Port.PortName; this.UpDataReceived(null, new UpEventArgs() { RawData = rawMsg, Value = soilReport }); } } } } catch (Exception exp) { System.Diagnostics.Debug.WriteLine("北斗卫星指挥机 数据解析出错 !" + content + "\r\n" + exp.Message); } }
// 处理缓冲区中的数据 //private void DealData() //{ // while (true) // { // try // { // m_semephoreData.WaitOne(); // m_mutexListByte.WaitOne(); //等待内存互斥量 // var count = (from r in m_inputBuffer where (r == 13) select r).Count(); // if (count == 0) // { // m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 // continue; // } // int indexOfFirst13 = 0; // indexOfFirst13 = m_inputBuffer.IndexOf(13); // var msgBytes = m_inputBuffer.GetRange(0, indexOfFirst13 + 1); // this.m_inputBuffer.RemoveRange(0, indexOfFirst13 + 1); // m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 // string msg = System.Text.Encoding.Default.GetString(msgBytes.ToArray()); // // InvokeMessage(msg.ToString()+"..."+msg.Length,"测试"); // int indexOfDollar = msg.IndexOf('$'); // string tag = msg.Substring(indexOfDollar + 1, 4); // msg = msg.Replace("\r", "").Replace("\n", ""); // Debug.WriteLine("接收消息: " + msg); // switch (tag) // { // case CBeiDouBJXX.CMD_PREFIX: DealBJXX(msg); break; // case CBeiDouZTXX.CMD_PREFIX: DealZTXX(msg); break; // case CBeiDouSJXX.CMD_PREFIX: DealSJXX(msg); break; // case CBeiDouCOUT.CMD_PREFIX: DealCOUT(msg); break; // default: break; // } // } // catch (Exception exp) // { // Debug.WriteLine(exp.Message); // } // }//end of while //} // 处理本机信息 BJXX数据类型 private void DealData() { while (true) { try { m_semephoreData.WaitOne(); m_mutexListByte.WaitOne(); //等待内存互斥量 var count = (from r in m_inputBuffer where (r == 13) select r).Count(); if (count == 0) { m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 continue; } m_mutexListByte.ReleaseMutex(); //内存操作完毕,释放互斥量 //gm1118 //TODO //判定是ascma 还是16进制 //string flag = Encoding.ASCII.GetString(m_inputBuffer.ToArray<byte>()); //StringBuilder flag = new StringBuilder(); //foreach (byte b in m_inputBuffer.ToArray<byte>) //{ // string s = System.Text.Encoding.Default.GetString(b); // flag.Append(s); //} //ASCIIEncoding aSCIIEncoding = new ASCIIEncoding(); //StringBuilder sb = new StringBuilder(); //byte[] bt = m_inputBuffer.ToArray<byte>(); //string flag = aSCIIEncoding.GetString(bt); List <byte> inputBytes = m_inputBuffer; StringBuilder sb = new StringBuilder(); foreach (byte b in inputBytes) { int i = (int)b; String s = ""; s += (char)i; sb.Append(s); } string flag = sb.ToString(); //1119 WriteToFileClass writeClass = new WriteToFileClass("ReceivedLog"); Thread t = new Thread(new ParameterizedThreadStart(writeClass.WriteInfoToFile)); t.Start("Beidou500: " + "Length:" + " " + flag + "\r\n"); Debug.WriteLine("接收消息: " + flag); if (flag.Contains(CBeiDouBJXX.CMD_PREFIX) || flag.Contains(CBeiDouZTXX.CMD_PREFIX) || flag.Contains(CBeiDouSJXX.CMD_PREFIX) || flag.Contains(CBeiDouCOUT.CMD_PREFIX)) { if (flag.Contains("?\n")) { flag = flag.Replace("?\n", "?\r\n"); } if (flag.EndsWith("\r\n")) { //flag = flag.Substring(flag.LastIndexOf("\r\n")); int indexOfFirstBJXX = 0; int indexOfFirstZTXX = 0; int indexOfFirstSJXX = 0; int indexOfFirstCOUT = 0; string[] a = new string[] { "\r\n" }; string[] ArrData = flag.Split(a, StringSplitOptions.None); for (int i = 0; i < ArrData.Count(); i++) { if (ArrData[i].Contains(CBeiDouBJXX.CMD_PREFIX)) { indexOfFirstBJXX = ArrData[i].IndexOf("BJXX"); string msg = ArrData[i].Substring(indexOfFirstBJXX); DealBJXX(msg); } if (ArrData[i].Contains(CBeiDouZTXX.CMD_PREFIX)) { indexOfFirstZTXX = ArrData[i].IndexOf("ZTXX"); string msg = ArrData[i].Substring(indexOfFirstZTXX); DealZTXX(msg); } if (ArrData[i].Contains(CBeiDouSJXX.CMD_PREFIX)) { indexOfFirstSJXX = ArrData[i].IndexOf("SJXX"); string msg = ArrData[i].Substring(indexOfFirstSJXX); DealSJXX(msg); } //顶时报待测 if (ArrData[i].Contains(CBeiDouCOUT.CMD_PREFIX)) { indexOfFirstCOUT = ArrData[i].IndexOf("COUT"); string msg = ArrData[i].Substring(indexOfFirstCOUT); DealCOUT(msg); } } m_inputBuffer.Clear(); } } } catch (Exception exp) { Debug.WriteLine(exp.Message); } }//end of while }