string parse_hdlc_bytes(byte[] hdlc_bytes) { const byte CTRL_U_FRAME_SNRM = 0x10; //置正常响应模式 const byte CTRL_U_FRAME_SARM_DM = 0x03; //置异步响应模式/断开方式 const byte CTRL_U_FRAME_SABM = 0x07; //置异步平衡模式 const byte CTRL_U_FRAME_SNRME = 0x1B; //置扩充正常响应模式 const byte CTRL_U_FRAME_SARME = 0x0b; //置扩充异步响应模式 const byte CTRL_U_FRAME_SABME = 0x0f; //置扩充异步平衡模式 const byte CTRL_U_FRAME_DISC_RD = 0x08; //断链/请求断链 const byte CTRL_U_FRAME_SIM_RIM = 0x01; //置初始化方式/请求初始化方式 const byte CTRL_U_FRAME_UP = 0x04; //无编号探询 const byte CTRL_U_FRAME_UI = 0x00; //无编号信息 const byte CTRL_U_FRAME_XID = 0x17; //交换识别 const byte CTRL_U_FRAME_RESET = 0x13; //复位 const byte CTRL_U_FRAME_FRMR = 0x11; //帧拒绝 const byte CTRL_U_FRAME_UA = 0x0C; //无编号确认 string show_info = "地址:0x{0:X02}\r\n" + "类型:{1}帧 CTRL:0x{2:X02} {3}"; byte[] hdlc = Assist.HdlcDecode(hdlc_bytes); if (hdlc == null) { return(string.Empty); } byte ctrl = hdlc[1]; string frame_type; string frame_ctrl_info; if ((ctrl & 0x01) == 0) { int ns = (ctrl & 0x0e) >> 1; int nr = (ctrl & 0xe0) >> 5; frame_type = "I"; frame_ctrl_info = string.Format("N(S)={0},N(R)={1}", ns, nr); } else if ((ctrl & 0x03) == 1) { byte s = (byte)((ctrl & 0x0C) >> 2); frame_type = "S"; string type; switch (s) { case 0: type = "RR"; break; case 1: type = "RNR"; break; case 2: type = "REJ"; break; case 3: default: type = "SREJ"; break; } frame_ctrl_info = string.Format("S={0}({1}),N(R)={2}", s, type, (ctrl & 0xe0) >> 5); } else { frame_type = "U"; byte cmd = (byte)((((ctrl) & 0xE0) >> 3) | (((ctrl) & 0x0c) >> 2)); frame_ctrl_info = string.Format("CMD=0x{0:X02} ", cmd); switch (cmd) { case CTRL_U_FRAME_SNRM: frame_ctrl_info += "SNRM"; break; case CTRL_U_FRAME_SARM_DM: frame_ctrl_info += "SARM_DM"; break; case CTRL_U_FRAME_SABM: frame_ctrl_info += "SABM"; break; case CTRL_U_FRAME_SNRME: frame_ctrl_info += "SNRME"; break; case CTRL_U_FRAME_SARME: frame_ctrl_info += "SARME"; break; case CTRL_U_FRAME_SABME: frame_ctrl_info += "SAME"; break; case CTRL_U_FRAME_DISC_RD: frame_ctrl_info += "DISC_RD"; break; case CTRL_U_FRAME_SIM_RIM: frame_ctrl_info += "SIM_RIM"; break; case CTRL_U_FRAME_UP: frame_ctrl_info += "UP"; break; case CTRL_U_FRAME_UI: frame_ctrl_info += "UI"; break; case CTRL_U_FRAME_XID: frame_ctrl_info += "XID"; break; case CTRL_U_FRAME_RESET: frame_ctrl_info += "RESET"; break; case CTRL_U_FRAME_FRMR: frame_ctrl_info += "FRMR"; break; case CTRL_U_FRAME_UA: frame_ctrl_info += "UA"; break; default: frame_ctrl_info += "未知指令"; break; } } string gap; if (checkBoxGap.Checked) { gap = " "; } else { gap = ""; } return(Assist.ToHexString(hdlc, gap) + "\r\n" + String.Format(show_info, hdlc[0], frame_type, ctrl, frame_ctrl_info)); }