stm32移植modbus

1.去官网下载两个文件夹

后续我把这两个文件夹打包放在百度云,会有连接。

2.把这两个文件夹放在程序文档中。

复制过来先不要添加路径

3.

初始化时钟和串口1(我用的串口1和定时器2)

在串口初始化程序添加

_ttywrch(int ch)

{

ch = ch;

}不然编译会报错。串口1 的中断服务函数文件夹里有,所以不需要写。

4.把头文件和。c文件添加进程序

添加完成后再主函数设置地址(我用的保持寄存器)

#define REG_INPUT_START 0x03E8

//输入寄存器数量

#define REG_INPUT_NREGS 8

//保持寄存器起始地址

#define REG_HOLDING_START 0x03E8

//保持寄存器数量

#define REG_HOLDING_NREGS 30

//线圈起始地址

#define REG_COILS_START 0x0000

//线圈数量

#define REG_COILS_SIZE 16

//开关寄存器起始地址

#define REG_DISCRETE_START 0x0000

//开关寄存器数量

#define REG_DISCRETE_SIZE 16

/* ----------------------- Static variables ---------------------------------*/

static USHORT usRegInputStart = REG_INPUT_START;

static USHORT usRegInputBuf[REG_INPUT_NREGS];

static USHORT usRegHoldingStart = REG_HOLDING_START;

static USHORT usRegHoldingBuf[REG_HOLDING_NREGS];

/****************************************************************************

* 名 称:eMBRegInputCB

* 功 能:读取输入寄存器,对应功能码是 04 eMBFuncReadInputRegister

* 入口参数:pucRegBuffer: 数据缓存区,用于响应主机

* usAddress: 寄存器地址

* usNRegs: 要读取的寄存器个数

* 出口参数:

* 注 意:上位机发来的 帧格式是: SlaveAddr(1 Byte)+FuncCode(1 Byte)

* +StartAddrHiByte(1 Byte)+StartAddrLoByte(1 Byte)

* +LenAddrHiByte(1 Byte)+LenAddrLoByte(1 Byte)+

* +CRCAddrHiByte(1 Byte)+CRCAddrLoByte(1 Byte)

* 3 区

****************************************************************************/

eMBErrorCode

eMBRegInputCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs )

{

eMBErrorCode eStatus = MB_ENOERR;

int iRegIndex;

if( ( usAddress >= REG_INPUT_START )

&& ( usAddress + usNRegs <= REG_INPUT_START + REG_INPUT_NREGS ) )

{

iRegIndex = ( int )( usAddress - usRegInputStart );

while( usNRegs > 0 )

{

*pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] >> 8 );

*pucRegBuffer++ = ( UCHAR )( usRegInputBuf[iRegIndex] & 0xFF );

iRegIndex++;

usNRegs--;

}

}

else

{

eStatus = MB_ENOREG;

}

return eStatus;

}

/****************************************************************************

* 名 称:eMBRegHoldingCB

* 功 能:对应功能码有:06 写保持寄存器 eMBFuncWriteHoldingRegister

*16 写多个保持寄存器 eMBFuncWriteMultipleHoldingRegister

*03 读保持寄存器 eMBFuncReadHoldingRegister

*23 读写多个保持寄存器 eMBFuncReadWriteMultipleHoldingRegister

* 入口参数:pucRegBuffer: 数据缓存区,用于响应主机

* usAddress: 寄存器地址

* usNRegs: 要读写的寄存器个数

* eMode: 功能码

* 出口参数:

* 注 意:4 区

****************************************************************************/

eMBErrorCode

eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs, eMBRegisterMode eMode )

{

eMBErrorCode eStatus = MB_ENOERR;

int iRegIndex;

if((usAddress >= REG_HOLDING_START)&&\

((usAddress+usNRegs) <= (REG_HOLDING_START + REG_HOLDING_NREGS)))

{

iRegIndex = (int)(usAddress - usRegHoldingStart);

switch(eMode)

{

case MB_REG_READ://读 MB_REG_READ = 0

while(usNRegs > 0)

{

*pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] >> 8);

*pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] & 0xFF);

iRegIndex++;

usNRegs--;

}

break;

case MB_REG_WRITE://写 MB_REG_WRITE = 0

while(usNRegs > 0)

{

usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;

usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;

iRegIndex++;

usNRegs--;

}

break;

}

}

else//错误

{

eStatus = MB_ENOREG;

}

return eStatus;

}

/****************************************************************************

* 名 称:eMBRegCoilsCB

* 功 能:对应功能码有:01 读线圈 eMBFuncReadCoils

* 05 写线圈 eMBFuncWriteCoil

* 15 写多个线圈 eMBFuncWriteMultipleCoils

* 入口参数:pucRegBuffer: 数据缓存区,用于响应主机

* usAddress: 线圈地址

* usNCoils: 要读写的线圈个数

* eMode: 功能码

* 出口参数:

* 注 意:如继电器

* 0 区

****************************************************************************/

eMBErrorCode

eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )

{

eMBErrorCode eStatus = MB_ENOERR;

int iRegIndex;

if((usAddress >= REG_HOLDING_START)&&\

((usAddress+usNCoils) <= (REG_HOLDING_START + REG_HOLDING_NREGS)))

{

iRegIndex = (int)(usAddress - usRegHoldingStart);

switch(eMode)

{

case MB_REG_READ://读 MB_REG_READ = 0

while(usNCoils > 0)

{

*pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] >> 8);

*pucRegBuffer++ = (u8)(usRegHoldingBuf[iRegIndex] & 0xFF);

iRegIndex++;

usNCoils--;

}

break;

case MB_REG_WRITE://写 MB_REG_WRITE = 1

while(usNCoils > 0)

{

// usRegHoldingBuf[iRegIndex] = *pucRegBuffer++ << 8;

// usRegHoldingBuf[iRegIndex] |= *pucRegBuffer++;

iRegIndex++;

usNCoils--;

}

}

}

else//错误

{

eStatus = MB_ENOREG;

}

return eStatus;

}

/****************************************************************************

* 名 称:eMBRegDiscreteCB

* 功 能:读取离散寄存器,对应功能码有:02 读离散寄存器 eMBFuncReadDiscreteInputs

* 入口参数:pucRegBuffer: 数据缓存区,用于响应主机

* usAddress: 寄存器地址

* usNDiscrete: 要读取的寄存器个数

* 出口参数:

* 注 意:1 区

****************************************************************************/

eMBErrorCode

eMBRegDiscreteCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNDiscrete )

{

( void )pucRegBuffer;

( void )usAddress;

( void )usNDiscrete;

return MB_ENOREG;

}

添加完函数后在主函数调用就可以了

ok完事

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值