From dd4d45c402a9d55fd6ed74b5d588905bcfb625d3 Mon Sep 17 00:00:00 2001 From: zcn1123 <2363211205@qq.com> Date: Thu, 3 Sep 2020 20:31:15 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9bug=200F=E5=92=8C10=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E7=A0=81=E8=AE=A1=E7=AE=97=E5=86=99=E5=85=A5=E5=AD=97?= =?UTF-8?q?=E8=8A=82=E6=95=B0=E6=97=A0=E6=95=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modbus_RTU_Salve/RTU_Salve.cpp | 68 ++++++++++++++++--- 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.cpp b/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.cpp index d5514c6..c68824c 100644 --- a/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.cpp +++ b/Modbus_communication/Modbus_RTU_Salve/RTU_Salve.cpp @@ -246,11 +246,26 @@ void Create_0x10_Response_Message(UINT8 *Requst_Message, UINT8 *Response_Message * 输入 : *Requst_Message 请求报文 *Response_Message响应报文 * 返回值 : 无 **********************************************************************************************/ -void Create_Abnormal_Function_Code_Response_Message(UINT8 *Requst_Message, UINT8 *Response_Message) +void Create_Abnormal_Code_01_Response_Message(UINT8 *Requst_Message, UINT8 *Response_Message) { Response_Message[0] = Device_ID; Response_Message[1] = Requst_Message[1] + 0x80; Response_Message[2] = 0x01; + Response_Message_Len = 3; +} + +/********************************************************************************************* +* 功能     :  生成异常码03响应报文 +* 描述    : 对不支持的功能码生成对应的异常响应报文 +* 输入 : *Requst_Message 请求报文 *Response_Message响应报文 +* 返回值 : 无 +**********************************************************************************************/ +void Create_Abnormal_Code_03_Response_Message(UINT8 *Requst_Message, UINT8 *Response_Message) +{ + Response_Message[0] = Device_ID; + Response_Message[1] = Requst_Message[1] + 0x80; + Response_Message[2] = 0x03; + Response_Message_Len = 3; } /********************************************************************************************* @@ -270,11 +285,11 @@ bool Check_Requst_Message_CRC(UINT8 *Requst_Message, DWORD Read_len) } /********************************************************************************************* -* 功能     :  CRC校验 -* 描述    : 对请求报文中的数据进行CRC校验 +* 功能     :  异常码03判定--请求报文长度校验 +* 描述    : 对请求报文的字节长度进行计算校验 * 输入 : *Requst_Message 请求报文 Read_len 接收到到的字节数 -* 返回值 : true CRC校验通过 -* false CRC校验不通过 +* 返回值 : true 长度校验通过 +* false 长度校验不通过 **********************************************************************************************/ bool Check_Requst_Message_Len(UINT8 *Requst_Message, DWORD Read_len) { @@ -293,6 +308,38 @@ bool Check_Requst_Message_Len(UINT8 *Requst_Message, DWORD Read_len) return true; } +/********************************************************************************************* +* 功能     :  异常码03判定--请求报文中的操作数量判定 +* 描述    : 对请求报文中的操作数量进行判定 +* 输入 : *Requst_Message 请求报文 Read_len 接收到到的字节数 +* 返回值 : true 校验通过 +* false 校验不通过 +**********************************************************************************************/ +bool Check_Operation_Number_Requst_Message(UINT8 *Requst_Message) +{ + unsigned int Operation_Number = Requst_Message[4] << 8 | Requst_Message[5]; + if (Requst_Message[1] == 0x01) + { + if (Operation_Number == 0 || Operation_Number > 2000) + return false; + } + if (Requst_Message[1] == 0x03) + { + if (Operation_Number == 0 || Operation_Number > 125) + return false; + } + if (Requst_Message[1] == 0x0F) + { + if (Operation_Number < 2 || Operation_Number > 1968) + return false; + } + if (Requst_Message[1] == 0x10) + { + if (Operation_Number < 2 || Operation_Number > 123) + return false; + } + return true; +} /********************************************************************************************* * 功能     :  生成响应报文 * 描述    : 检查设备请求报文来生成对应功能的响应报文 @@ -302,19 +349,22 @@ bool Check_Requst_Message_Len(UINT8 *Requst_Message, DWORD Read_len) **********************************************************************************************/ bool Create_Response_Message(UINT8 *Requst_Message, UINT8 *Response_Message, DWORD Read_len) { - if (!Check_Requst_Message_Len(Requst_Message, Read_len))//检查请求报文长度是否正确 + if (Requst_Message[0] != Device_ID) //检查设备ID一致 return false; if (!Check_Requst_Message_CRC(Requst_Message, Read_len))//CRC校验报文是否正确 return false; - if (Requst_Message[0] != Device_ID) //检查设备ID一致 - return false; + if (!Check_Requst_Message_Len(Requst_Message, Read_len) || !Check_Operation_Number_Requst_Message(Requst_Message))//检查请求报文长度是否正确 + { + Create_Abnormal_Code_03_Response_Message(Requst_Message, Response_Message); + return true; + } switch (Requst_Message[1]) { case 0x01:Create_0x01_Response_Message(Requst_Message, Response_Message); break; case 0x03:Create_0x03_Response_Message(Requst_Message, Response_Message); break; case 0x0F:Create_0x0F_Response_Message(Requst_Message, Response_Message); break; case 0x10:Create_0x10_Response_Message(Requst_Message, Response_Message); break; - default: Create_Abnormal_Function_Code_Response_Message(Requst_Message, Response_Message); + default: Create_Abnormal_Code_01_Response_Message(Requst_Message, Response_Message); } return true; }