目录
一、基础信息
1.1、适用场景
1.2、变量类型
1.3、调用非本文函数
二、主要程序内容
2.1、头文件声明内容
2.2、子函数
三、使用示例
3.1、STM32的HAL库串口1发送响应数据
3.2、STC单片机串口1发送响应数据
C程序Modbus-RTU模式,主机发指令给从机,从机解码出错时,生成错误响应数据。
错误判断及响应数据参照GB-T19582.1-2008《基于Modbus协议的工业自动化网络规范 第1部分:Modbus应用协议》。
uint8_t,为8位无符号整形变量;
uint16_t,为16位无符号整形变量。
ModbusCRC:
Modbus查表法CRC校验程序_VIFIN的博客-CSDN博客C程序编写Modbus查表法的CRC校验。https://blog.csdn.net/VIFIN/article/details/125788125
enum ReadOrWriteRegisterErrorType //读写寄存器错误类型
{
FunctionCodeError = 1, //错误功能码
RegisterAddressError, //寄存器地址错误
RegisterNumberOrDataError, //寄存器读取数量或写入值错误
ReadOrWriteError, //读写结果错误
};
typedef enum
{
Modbus_OK, //执行完成
Modbus_ERROR, //执行错误
Modbus_NOP, //空操作
}ModbusResult_TypeDef; //Modbus程序执行结果
/******************************************
* 功能:Modbus错误时的响应数据
* 输入:
* @error_type:错误类型
* @p_error_buffer:错误数据缓存的首指针地址
* @p_creat_buffer:生成的错误响应数据缓存的首指针地址
* @p_creat_size:生成错误响应数据字节长度的存放地址
* 返回:Modbus函数执行结果
******************************************/
ModbusResult_TypeDef ModbusError(uint8_t error_type, uint8_t* p_error_buffer, uint8_t* p_creat_buffer, uint8_t* p_creat_size)
{
uint16_t crc_buffer;
*(p_creat_buffer + 0) = *(p_error_buffer + 0); //从机地址
*(p_creat_buffer + 1) = *(p_error_buffer + 1) + 0x80; //错误功能码
*(p_creat_buffer + 2) = error_type; //错误类型
crc_buffer = ModbusCRC(3, p_creat_buffer); //计算CRC
*(p_creat_buffer + 3) = crc_buffer % 256;
*(p_creat_buffer + 4) = crc_buffer / 256;
*p_creat_size = 5;
return Modbus_OK;
}
error_type:错误类型,根据错误类型,对应填写头文件定义的枚举“ ReadOrWriteRegisterErrorType”的对应内容。
p_error_buffer:错误数据缓存的首指针地址,一般填写串口接收缓存的数组名;
p_creat_buffer:生成的错误响应数据缓存的首指针地址,一般填写串口发送缓存的数组名;
p_creat_size:生成错误响应数据字节长度的存放地址,一般填写uint8_t类型的变量。
返回值:Modbus函数执行结果。
示例:错误功能码函数及其参数的使用。
Receive_buffer:串口接收数据缓存的数组;
Transmit_buffer:串口发送数据缓存的数组;
Transmit_size:串口发送数据字节长度。
ModbusError(FunctionCodeError, Receive_buffer, Transmit_buffer, &Transmit_size);
HAL_UART_Transmit(&huart1, Transmit_buffer, Transmit_size, 5);
STC单片机发送函数引用博客STC单片机串口无阻塞发送函数_VIFIN的博客-CSDN博客的串口无阻塞发送函数。
U1Transimt(Transmit_buffer,Transmit_size);