/// <summary> /// 查找是否包含头部,返回头部所在的下标。 /// </summary> /// <param name="reversedBinStrs"></param> /// <returns></returns> private static int SearchHeaderV2(List <string> reversedBinStrs) { int headerIndex = -1; for (int i = 0; i < reversedBinStrs.Count - 5; i++) { var prevSix = reversedBinStrs[i]; // 拼接24个,好取补码 var current24 = reversedBinStrs[i + 1] + reversedBinStrs[i + 2] + reversedBinStrs[i + 3] + reversedBinStrs[i + 4]; //是否取补码 //判断是否取补码 //(3) 字节取补码 //按上述步骤处理连续5 个RTCM 字节后,将每个字节的低6 位连接起来, //得到一个完整的RTCM 字。与GPS导航电文类似,若前一个字的最后一个bit d30 为1 , //则当前字的前24 位d1 ~ d24 需要取补码;若d30 为0 ,则当前字保持不变。 if (prevSix.EndsWith("1")) { current24 = GetComplementCode(current24); } if (current24.StartsWith(Rtcm2Header1.Preamble_2)) { //找到了。//拼接一个 30 位的字节测试,是否是头部 var headString = current24 + reversedBinStrs[i + 5]; Gnsser.Ntrip.Rtcm.Rtcm2Header1 header1 = Gnsser.Ntrip.Rtcm.Rtcm2Header1.Parse(headString); //29,30校验码 bool bit29 = prevSix[4].ToString() == "1"; bool bit30 = prevSix[5].ToString() == "1"; if (header1.Check(bit29, bit30)) { headerIndex = i + 1; break; } } } return(headerIndex); }
List <string> tailReversedBinStrs = new List <string>(); //上一次处理剩下的 /// <summary> /// 接收数据流 /// </summary> /// <param name="inbytes"></param> public void Receive(byte[] inbytes) { //下面进行解码工作 //下面进行解码工作 //(1) 字节扫描,过滤掉无效数据 List <byte> filteredBytes = FilterExtraBytes(inbytes); //数量是否足够 //(2) 字节滚动,且组成 rtcm 字 //由于UART 为异步通信,优先发送或接收低位数据,接收到RTCM 字节后必须进行“字节滚动”, 1-6,2-5,3-4. List <string> reversedBinStrs = ReverseLowerSixBitOrder(filteredBytes); //上次余下的 if (tailReversedBinStrs.Count != 0) { reversedBinStrs.InsertRange(0, tailReversedBinStrs); } //遍历查找每一个是否匹配 int headerIndex = SearchHeaderV2(reversedBinStrs); if (headerIndex != -1) { // var prevSix = reversedBinStrs[headerIndex - 1]; //移除前面的无效数据 reversedBinStrs.RemoveRange(0, headerIndex); //转换为30位一组(5个8位字节(取6位))的列表。 List <string> rtcmWords = GetRtcm2BinWords(ref reversedBinStrs); //剩下的不足一字的。用于下一次? tailReversedBinStrs.AddRange(reversedBinStrs); //是否取补码 string headerString = rtcmWords[0]; if (prevSix.EndsWith("1")) { headerString = GetComplementCode(headerString.Substring(0, 24)) + headerString.Substring(24); } //解析 Gnsser.Ntrip.Rtcm.Rtcm2Header1 header1 = Gnsser.Ntrip.Rtcm.Rtcm2Header1.Parse(headerString); //29,30校验码 bool bit29 = prevSix[4].ToString() == "1"; bool bit30 = prevSix[5].ToString() == "1"; if (header1.Check(bit29, bit30)) { // MessageBox.Show("测试1通过啦!!!"); if (rtcmWords.Count > 1) { headerString = rtcmWords[1]; prevSix = rtcmWords[0].Substring(24); if (prevSix.EndsWith("1")) { headerString = GetComplementCode(headerString.Substring(0, 24)) + headerString.Substring(24); } var header2 = Gnsser.Ntrip.Rtcm.Rtcm2Header2.Parse(rtcmWords[1]); if (header2.Check(bit29, bit30)) { // MessageBox.Show("测试2通过啦!!!"); } } // Gnsser.Ntrip.Rtcm.RtcmHeader header = new RtcmHeader(); } } }