瀏覽代碼

修改bug 0F和10功能码计算写入字节数无效

Modbus_RTU
zcn1123 4 年之前
父節點
當前提交
dd4d45c402
共有 1 個檔案被更改,包括 59 行新增9 行删除
  1. +59
    -9
      Modbus_communication/Modbus_RTU_Salve/RTU_Salve.cpp

+ 59
- 9
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;
}


Loading…
取消
儲存