|
|
@@ -62,7 +62,7 @@ void Create_0x01_Response_Message(UINT8 *Requst_Message, UINT8 *Response_Message |
|
|
|
if (Address_range < MAX_Address)//判断地址是否超限 |
|
|
|
{ |
|
|
|
unsigned int Read_Number = Requst_Message[4] << 8 | Requst_Message[5];//要读取的位数 |
|
|
|
unsigned int Read_Len = Count_Read_date_number(Requst_Message[0], Read_Number); //要读取的字节数 |
|
|
|
unsigned int Read_Len = Count_Read_date_number(Requst_Message[1], Read_Number); //要读取的字节数 |
|
|
|
for (unsigned int i = 3; i < Read_Len + 3; i++) |
|
|
|
{ |
|
|
|
Response_Message[i] = Bitset_to_Uint8(Start_Address, Read_Number); |
|
|
@@ -102,7 +102,8 @@ void Create_0x03_Response_Message(UINT8 *Requst_Message, UINT8 *Response_Message |
|
|
|
if (Address_range < MAX_Address) //判断地址是否超限 |
|
|
|
{ |
|
|
|
unsigned int Read_Number = Requst_Message[4] << 8 | Requst_Message[5];//要读取的寄存器数量 |
|
|
|
unsigned int Read_Len = Count_Read_date_number(Requst_Message[0], Read_Number); //要读取的字节数 |
|
|
|
unsigned int Read_Len = Count_Read_date_number(Requst_Message[1 |
|
|
|
], Read_Number); //要读取的字节数 |
|
|
|
for (unsigned int i = 3; i < Read_Len + 3; i= i + 2) |
|
|
|
{ |
|
|
|
Response_Message[i] = Register[Start_Address] >> 8; |
|
|
@@ -240,7 +241,7 @@ void Create_0x10_Response_Message(UINT8 *Requst_Message, UINT8 *Response_Message |
|
|
|
} |
|
|
|
|
|
|
|
/********************************************************************************************* |
|
|
|
* 功能 : 生成异常功能码响应报文 |
|
|
|
* 功能 : 生成异常码01响应报文 |
|
|
|
* 描述 : 对不支持的功能码生成对应的异常响应报文 |
|
|
|
* 输入 : *Requst_Message 请求报文 *Response_Message响应报文 |
|
|
|
* 返回值 : 无 |
|
|
@@ -251,14 +252,14 @@ void Create_Abnormal_Function_Code_Response_Message(UINT8 *Requst_Message, UINT8 |
|
|
|
Response_Message[1] = Requst_Message[1] + 0x80; |
|
|
|
Response_Message[2] = 0x01; |
|
|
|
} |
|
|
|
|
|
|
|
/********************************************************************************************* |
|
|
|
* 功能 : 生成响应报文 |
|
|
|
* 描述 : 检查设备请求报文来生成对应功能的响应报文 |
|
|
|
* 输入 : *Requst_Message 请求报文 *Response_Message响应报文 |
|
|
|
* 返回值 : true 生成响应报文 |
|
|
|
* false 不生成响应报文 |
|
|
|
* 功能 : CRC校验 |
|
|
|
* 描述 : 对请求报文中的数据进行CRC校验 |
|
|
|
* 输入 : *Requst_Message 请求报文 Read_len 接收到到的字节数 |
|
|
|
* 返回值 : true CRC校验通过 |
|
|
|
* false CRC校验不通过 |
|
|
|
**********************************************************************************************/ |
|
|
|
|
|
|
|
bool Check_Requst_Message_CRC(UINT8 *Requst_Message, DWORD Read_len) |
|
|
|
{ |
|
|
|
UINT16 CRC_data = CRC_16(Requst_Message, Read_len-2); |
|
|
@@ -267,8 +268,42 @@ bool Check_Requst_Message_CRC(UINT8 *Requst_Message, DWORD Read_len) |
|
|
|
return false; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
/********************************************************************************************* |
|
|
|
* 功能 : CRC校验 |
|
|
|
* 描述 : 对请求报文中的数据进行CRC校验 |
|
|
|
* 输入 : *Requst_Message 请求报文 Read_len 接收到到的字节数 |
|
|
|
* 返回值 : true CRC校验通过 |
|
|
|
* false CRC校验不通过 |
|
|
|
**********************************************************************************************/ |
|
|
|
bool Check_Requst_Message_Len(UINT8 *Requst_Message, DWORD Read_len) |
|
|
|
{ |
|
|
|
if (Requst_Message[1] == 0x01 || Requst_Message[1] == 0x03) |
|
|
|
{ |
|
|
|
if (Read_len != 8) |
|
|
|
return false; |
|
|
|
} |
|
|
|
if (Requst_Message[1] == 0x0F || Requst_Message[1] == 0x10) |
|
|
|
{ |
|
|
|
unsigned int Number = Requst_Message[4] << 8 | Requst_Message[5]; |
|
|
|
unsigned int Count_len = Count_Read_date_number(Requst_Message[1], Number) + 9; |
|
|
|
if (Read_len != Count_len) |
|
|
|
return false; |
|
|
|
} |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
/********************************************************************************************* |
|
|
|
* 功能 : 生成响应报文 |
|
|
|
* 描述 : 检查设备请求报文来生成对应功能的响应报文 |
|
|
|
* 输入 : *Requst_Message 请求报文 *Response_Message响应报文 |
|
|
|
* 返回值 : true 生成响应报文 |
|
|
|
* false 不生成响应报文 |
|
|
|
**********************************************************************************************/ |
|
|
|
bool Create_Response_Message(UINT8 *Requst_Message, UINT8 *Response_Message, DWORD Read_len) |
|
|
|
{ |
|
|
|
if (!Check_Requst_Message_Len(Requst_Message, Read_len))//检查请求报文长度是否正确 |
|
|
|
return false; |
|
|
|
if (!Check_Requst_Message_CRC(Requst_Message, Read_len))//CRC校验报文是否正确 |
|
|
|
return false; |
|
|
|
if (Requst_Message[0] != Device_ID) //检查设备ID一致 |
|
|
@@ -303,6 +338,8 @@ int Modbus_RTU_Salve(void) |
|
|
|
getchar(); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
else |
|
|
|
printf("初始化串口成功"); |
|
|
|
Init_Coil_Register(); |
|
|
|
DWORD Read_len; |
|
|
|
while (true) |
|
|
@@ -313,7 +350,7 @@ int Modbus_RTU_Salve(void) |
|
|
|
{ |
|
|
|
if (Create_Response_Message(Requst_Message, Response_Message, Read_len)) |
|
|
|
{ |
|
|
|
while (SendData(Handle_Com, (char*)Response_Message, Response_Message_Len)) |
|
|
|
while (!SendData(Handle_Com, (char*)Response_Message, Response_Message_Len)) |
|
|
|
{ |
|
|
|
printf("发送失败,重新发送"); |
|
|
|
} |
|
|
|