Modbus通讯协议的C语言实现

刚写完一个modbus通讯协议,调试完,整理出来了,软件代码只能为大家提供一个思路,仅供参考。

//communication.h
#include "H01_Global\_Define.h"
#include "H01_Global\base_types.h"

#define SIZE_BUF_RECE 100
#define SIZE_BUF_TRAN 100
	 
#define TRANS_TIMER_DELAY_1MS    1
#define TRANS_TIMER_DELAY_10MS   10
#define TRANS_TIMER_DELAY_100MS  100
#define TRANS_TIMER_DELAY_1S   1000
	 
typedef union
{
	uint16_t word;
	struct 
	{
		uint8_t low;
		uint8_t high;
	}byte;
	struct
	{
		uint8_t bit0:1;
		uint8_t bit1:1;
		uint8_t bit2:1;
		uint8_t bit3:1;
		uint8_t bit4:1;
		uint8_t bit5:1;
		uint8_t bit6:1;
		uint8_t bit7:1;
		uint8_t bit8:1;
		uint8_t bit9:1;
		uint8_t bit10:1;
		uint8_t bit11:1;
		uint8_t bit12:1;
		uint8_t bit13:1;
		uint8_t bit14:1;
		uint8_t bit15:1;
	}BIT;
}WORD_BYTE;

typedef struct 
{
	uint32_t MODBUS_Reg_Set_Speed;
	uint32_t MODBUS_Reg_Set_Enable_VSP;
	uint32_t MODBUS_Reg_Set_Dir;
	uint32_t MODBUS_Reg_Force_Stop;
}MODBUS_HOLDING_REGISTORS;

typedef struct
{
	uint32_t MODBUS_Reg_Get_Motor_Type;
	uint32_t MODBUS_Reg_Get_Software_Version;
	uint32_t MODBUS_Reg_Get_Running_Status;
	uint32_t MODBUS_Reg_Get_Running_Speed;
	uint32_t MODBUS_Reg_Get_Phase_Current;
	uint32_t MODBUS_Reg_Get_IPM_Temperature;
	uint32_t MODBUS_Reg_Get_DC_Voltage;
	uint32_t MODBUS_Reg_Get_Running_Dir;
	uint32_t MODBUS_Reg_Get_Errors;
}MODBUS_INPUT_REGISTORS;

typedef struct
{
	uint32_t dev_comm;
	uint32_t delay_tran;
	uint32_t Function_Code;
	uint32_t flag_state;
	uint32_t addr_dev;
	uint32_t pt_tran;
	uint32_t pt_rece;
	uint32_t len_tran;
	uint32_t len_rece;
	uint32_t xorsum_rece;
	uint32_t addsum_rece;
	uint32_t xorsum_tran;
	uint32_t addsum_tran;
	uint32_t flag_trans_start;
	uint32_t flag_trans_end;
	uint32_t flag_trans_timer_ON;
	uint32_t count_trans_timer_1ms;
	uint32_t count_trans_timer_10ms;
	uint32_t count_trans_timer_100ms;
	uint32_t count_trans_timer_1s;
	WORD_BYTE address_reg;
	WORD_BYTE num_reg;
	uint32_t buf_rece[SIZE_BUF_RECE];
	uint32_t buf_tran[SIZE_BUF_TRAN];
	MODBUS_HOLDING_REGISTORS Modbus_Holding_Reg ;
	MODBUS_INPUT_REGISTORS Modbus_Input_Reg;
}MODBUS_COMM;


extern void Uart_Trans(void);
extern void Uart_Receive(void);
extern void Init_Modbus(void);
extern void Timer_Task(void);
extern void Proc_Modbus_Data(void);
extern uint32_t Read_Reg_Modbus(MODBUS_COMM *modbus);
void Set_Reg_Modbus(MODBUS_COMM *modbus, WORD_BYTE data);
extern void CRC_Rece_Check(void);
extern uint32_t Flag_Trans_End;
extern uint32_t Timer_Count;
extern uint32_t Timer_1s;
// communication.c
#include "H05_User\AllInOne.h"
/*****************************************************************************/
/* Local pre-processor symbols/macros ('#defin
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

INFiniteCoding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值