public BCP_FrameHandler(BCPHeader head, byte length_H, byte length_L) //无数据,但数据长度由用户指定 { CRC16 crc6_modbus = new CRC16(); this.bcp_ProcessedFrame = new byte[14]; this.bcp_ProcessedFrame[0] = head.Frame_Head; this.bcp_ProcessedFrame[1] = head.Protocal_Num; this.bcp_ProcessedFrame[2] = head.Version_Num; this.bcp_ProcessedFrame[3] = head.Target_Addr; this.bcp_ProcessedFrame[4] = head.Source_Addr; this.bcp_ProcessedFrame[5] = head.Port_Num; this.bcp_ProcessedFrame[6] = head.Control_Code; this.bcp_ProcessedFrame[7] = 0x00; //保留 this.bcp_ProcessedFrame[8] = head.StartReg_Addr_L; this.bcp_ProcessedFrame[9] = head.StartReg_Addr_H; this.bcp_ProcessedFrame[10] = length_L; //数据长度由用户指定 this.bcp_ProcessedFrame[11] = length_H; byte[] arrayForCRC = new byte[this.bcp_ProcessedFrame.Length - 2]; //不包括 CRC_L,CRC_H for (int i = 0; i < arrayForCRC.Length; i++) { arrayForCRC[i] = this.bcp_ProcessedFrame[i]; } crc6_modbus.CRC16_modbus(arrayForCRC, arrayForCRC.Length); //计算出CRC校验码 this.bcp_ProcessedFrame[this.bcp_ProcessedFrame.Length - 2] = crc6_modbus.getCRC16_L(); this.bcp_ProcessedFrame[this.bcp_ProcessedFrame.Length - 1] = crc6_modbus.getCRC16_H(); }
public bool enterData(BCPHeader h, byte length_H, byte length_L) { BCP_FrameHandler bcp_frame = new BCP_FrameHandler(h, length_H, length_L); bcp_frame.getBCP_Frame(ref this.IAP_frame); //将结果复制出来 this.currentCRC[0] = this.IAP_frame[this.IAP_frame.Length - 2]; this.currentCRC[1] = this.IAP_frame[this.IAP_frame.Length - 1]; return(true); }
/*重新载入第一帧*/ public bool reloadFirstFrame(byte targetAddr, byte srcAddr) { if (this.config_data == null) { return(false); } setCurrentFrameNum(0); if (this.currentFrameNum == totalFrameNum) { return(false); } int leftBytesNum = this.config_data.Length - this.currentFrameNum * frameDataSize; //剩余的字节数 byte[] rawData = null; if (leftBytesNum < frameDataSize) { rawData = new byte[leftBytesNum]; for (int i = 0; i < leftBytesNum; i++) { rawData[i] = this.config_data[currentFrameNum * frameDataSize + i]; } } else { rawData = new byte[frameDataSize]; this.currentFrame.IAP_frame = new byte[frameDataSize]; //下一帧满2k for (int i = 0; i < 1024; i++) { rawData[i] = this.config_data[currentFrameNum * frameDataSize + i]; } } BCPHeader h = new BCPHeader(); h.Frame_Head = 0x7e; h.Protocal_Num = 0x00; h.Version_Num = 0x00; h.Target_Addr = targetAddr; h.Source_Addr = srcAddr; h.Port_Num = 0x00; h.Control_Code = 0x11; h.StartReg_Addr_L = (byte)((this.currentFrameNum + 1) & 0x0f); h.StartReg_Addr_H = (byte)((this.currentFrameNum + 1) & 0xf0); this.currentFrame.enterData(h, rawData); currentFrameNum++; //当前帧数加1 return(true); }
/*获取下一帧*/ public bool loadNextFrame(byte targetAddr, byte srcAddr) { if (this.config_data == null) { return(false); } if (this.currentFrameNum == totalFrameNum) { return(false); } int leftBytesNum = this.config_data.Length - this.currentFrameNum * frameDataSize; //剩余的字节数 byte[] rawData = null; //需要传送的裸数据 if (leftBytesNum < frameDataSize) //下一帧的大小不足文本框中设定的一帧的大小 { rawData = new byte[leftBytesNum]; for (int i = 0; i < leftBytesNum; i++) { rawData[i] = this.config_data[currentFrameNum * frameDataSize + i]; } } else { rawData = new byte[frameDataSize]; this.currentFrame.IAP_frame = new byte[frameDataSize]; //下一帧的大小为文本框中设定的一帧的大小 for (int i = 0; i < frameDataSize; i++) { rawData[i] = this.config_data[currentFrameNum * frameDataSize + i]; } } BCPHeader h = new BCPHeader(); h.Frame_Head = 0x7e; h.Protocal_Num = 0x00; h.Version_Num = 0x00; h.Target_Addr = targetAddr; h.Source_Addr = srcAddr; h.Port_Num = 0x00; h.Control_Code = 0x11; h.StartReg_Addr_L = (byte)((this.currentFrameNum + 1) & 0x00ff); h.StartReg_Addr_H = (byte)(((this.currentFrameNum + 1) & 0xff00) >> 8); this.currentFrame.enterData(h, rawData); //将数据按照BCP协议写入一帧 currentFrameNum++; //当前帧数加1 return(true); }
public BCP_FrameHandler(BCPHeader head, byte[] data) //数据长度自动计算 { CRC16 crc6_modbus = new CRC16(); if (data == null) //不携带数据 { this.bcp_ProcessedFrame = new byte[14]; this.bcp_ProcessedFrame[0] = head.Frame_Head; this.bcp_ProcessedFrame[1] = head.Protocal_Num; this.bcp_ProcessedFrame[2] = head.Version_Num; this.bcp_ProcessedFrame[3] = head.Target_Addr; this.bcp_ProcessedFrame[4] = head.Source_Addr; this.bcp_ProcessedFrame[5] = head.Port_Num; this.bcp_ProcessedFrame[6] = head.Control_Code; this.bcp_ProcessedFrame[7] = 0x00; //保留 this.bcp_ProcessedFrame[8] = head.StartReg_Addr_L; this.bcp_ProcessedFrame[9] = head.StartReg_Addr_H; this.bcp_ProcessedFrame[10] = 0x00; //数据长度为0 this.bcp_ProcessedFrame[11] = 0x00; byte[] arrayForCRC = new byte[this.bcp_ProcessedFrame.Length - 2]; //不包括 CRC_L,CRC_H for (int i = 0; i < arrayForCRC.Length; i++) { arrayForCRC[i] = this.bcp_ProcessedFrame[i]; } crc6_modbus.CRC16_modbus(arrayForCRC, arrayForCRC.Length); //计算出CRC校验码 this.bcp_ProcessedFrame[12] = crc6_modbus.getCRC16_L(); this.bcp_ProcessedFrame[13] = crc6_modbus.getCRC16_H(); } else { this.bcp_ProcessedFrame = new byte[14 + data.Length]; this.bcp_ProcessedFrame[0] = head.Frame_Head; this.bcp_ProcessedFrame[1] = head.Protocal_Num; this.bcp_ProcessedFrame[2] = head.Version_Num; this.bcp_ProcessedFrame[3] = head.Target_Addr; this.bcp_ProcessedFrame[4] = head.Source_Addr; this.bcp_ProcessedFrame[5] = head.Port_Num; this.bcp_ProcessedFrame[6] = head.Control_Code; this.bcp_ProcessedFrame[7] = 0x00; //保留 this.bcp_ProcessedFrame[8] = head.StartReg_Addr_L; this.bcp_ProcessedFrame[9] = head.StartReg_Addr_H; int data_length = data.Length; this.bcp_ProcessedFrame[10] = (byte)(data_length); //数据长度L this.bcp_ProcessedFrame[11] = (byte)(data_length >> 8); //数据长度H for (int i = 0; i < data.Length; i++) //载入数据 { this.bcp_ProcessedFrame[12 + i] = data[i]; } byte[] arrayForCRC = new byte[this.bcp_ProcessedFrame.Length - 2]; //不包括 CRC_L,CRC_H for (int i = 0; i < arrayForCRC.Length; i++) { arrayForCRC[i] = this.bcp_ProcessedFrame[i]; } crc6_modbus.CRC16_modbus(arrayForCRC, arrayForCRC.Length); //计算出CRC校验码 this.bcp_ProcessedFrame[this.bcp_ProcessedFrame.Length - 2] = crc6_modbus.getCRC16_L(); this.bcp_ProcessedFrame[this.bcp_ProcessedFrame.Length - 1] = crc6_modbus.getCRC16_H(); } }