/// <summary> /// 向下封装PC-RSU数据帧,返回的是FF转义后的STX||RSCTL||DATA||BCC||ETX /// </summary> /// <param name="src">PC-RSU数据帧,RSCTL||DATA||BCC</param> /// <param name="offSet">起始位置</param> /// <param name="size">长度</param> /// <param name="dest">返回的是FF转义后的STX||RSCTL||DATA||BCC||ETX</param> protected void PcRsuFrameDown(byte[] src, int offSet, int size, out byte[] dest) { List <byte> _pcrsu_frame_down_temp = new List <byte>(); _pcrsu_frame_down_temp.Add(0XFF); _pcrsu_frame_down_temp.Add(0XFF); //矫正BCC src[offSet + size - 1] = ViaHere.BccCalc(src, offSet, size - 1); for (int i = offSet; i < offSet + size; i++) { switch (src[i]) { case 0xFF: _pcrsu_frame_down_temp.Add(0xfe); _pcrsu_frame_down_temp.Add(0x01); break; case 0xFE: _pcrsu_frame_down_temp.Add(0xfe); _pcrsu_frame_down_temp.Add(0x00); break; default: _pcrsu_frame_down_temp.Add(src[i]); break; } } _pcrsu_frame_down_temp.Add(0XFF); dest = _pcrsu_frame_down_temp.ToArray(); }
/// <summary> /// 返回FALSE,表示该帧无效 /// </summary> /// <param name="bx"></param> /// <returns></returns> protected bool BxFrameCheck(byte[] bx) { if (bx == null) { return(false); } if (bx.Length <= 2) { return(false); } bool rt = true; //帧长度以及帧头标识的检查 switch (bx[1]) { case 0xB0: if (bx.Length != 29 && bx.Length != 28) { rt = false; } break; case 0xB1: if (bx.Length != 5) { rt = false; } break; case 0xB2: if (bx.Length >= 7 && bx[6] == 0x80) { break; } else if (bx.Length != 35) { rt = false; } break; case 0xB3: if (bx.Length != 24) { rt = false; } break; case 0xB4: if (bx.Length != 98 && bx.Length != 101) { rt = false; } break; case 0xB5: if (bx.Length != 18 && bx.Length != 40 && bx.Length < 8 //仅检查到status字段 ) { rt = false; } break; default: rt = false; break; } //BCC CHECK if (bx[bx.Length - 1] != ViaHere.BccCalc(bx, 0, bx.Length - 1)) { rt = false; } return(rt); }