stm32,modbus

文章详细描述了如何在通用从机上实现MODBUS协议的两个功能码(3和4)处理,包括读取HOLD和输入IN_HOLD寄存器,以及使用中断方式接收数据,并涉及CRC校验。内容强调了代码的可移植性和中断机制的应用。
摘要由CSDN通过智能技术生成

通用从机MODBUS,可移植

// 功能码3处理
 void  MODBUS_RD_HOLD(volatile MODBUS_Define *mv,u16 Adrr,u16 RegNum,u8 ADDRESS )
 {
	u8	i = 0,LenCNT=0;	
	s32 data = 0;
	u16  TEMPCRC = 0;
	 
	 
	 switch(ADDRESS)//串口号
	{
		 case 1:
			 mv->txBuf[LenCNT++] = MODBUS__ADDRESS;//0x02
			 break;
		 case 2:
			 mv->txBuf[LenCNT++] = MODBUS__ADDRESS2;//0x03
			 break;
		 case 3:
			 mv->txBuf[LenCNT++] = MODBUS__ADDRESS3;//0x04
			 break;
		 default :
			 break;
	}
	mv->txBuf[LenCNT++]=MODBUS_RD_HOLD_REG;//0x03
	mv->txBuf[LenCNT++]=0;//数据长度
	switch(ADDRESS)
	{
		case 1:
			for(i=Adrr;i<((Adrr+RegNum));i++)
			{
				data = * HoldReg_4xxxx[i];
				mv->txBuf[LenCNT++] = data>>8;
				mv->txBuf[LenCNT++] = data&0xFF;
			}
			break;
		case 2:
			for(i=Adrr;i<((Adrr+RegNum));i++)
			{
				data = * HoldReg_4xxxx[i];
				mv->txBuf[LenCNT++] = data>>8;
				mv->txBuf[LenCNT++] = data&0xFF;
			}
			break;
		case 3:
			for(i=Adrr;i<((Adrr+RegNum));i++)
			{
				data = * HoldReg_4xxxx[i];
				mv->txBuf[LenCNT++] = data>>8;
				mv->txBuf[LenCNT++] = data&0xFF;
			}
			break;
		default :
			break;
		
	
	}
	mv->txBuf[2] = LenCNT - 3;
	TEMPCRC = ModbusCRC(mv->txBuf,LenCNT);
	mv->txBuf[LenCNT++] =  LBYTE(TEMPCRC); 							
	mv->txBuf[LenCNT++] =  HBYTE(TEMPCRC);							
	mv->txLen = LenCNT;
 }  
  
// 功能码4处理
 void MODBUS_IN_HOLD(volatile MODBUS_Define *mv,u16 Adrr,u16 RegNum,u8 ADDRESS)    
{
	u8	i = 0,LenCNT=0;	
	s32 data = 0;
	u16  TEMPCRC = 0;
	switch(ADDRESS)//串口号
	{
		 case 1:
			 mv->txBuf[LenCNT++] = MODBUS__ADDRESS;//0x01
			 break;
		 case 2:
			 mv->txBuf[LenCNT++] = MODBUS__ADDRESS2;//
			 break;
		 case 3:
			 mv->txBuf[LenCNT++] = MODBUS__ADDRESS3;//0x04
			 break;
		  case 4:
			 mv->txBuf[LenCNT++] = MODBUS__ADDRESS4;//0x05
			 break;
		 default :
			 break;
	}
	mv->txBuf[LenCNT++]=MODBUS_RD_IN_REG;//0x04
	mv->txBuf[LenCNT++]=0;//数据长度
	switch(ADDRESS)//串口号
	{
		case 1:
			for(i=Adrr;i<((Adrr+RegNum));i++)
			{
				data = *InputReg_3xxxx[i];
				mv->txBuf[LenCNT++] = data>>8;
				mv->txBuf[LenCNT++] = data&0xFF;
			}
			break;
		case 2:
			if((Adrr<=0x01DA)&&(Adrr>0))
			{
				for(i=Adrr;i<((Adrr+RegNum));i++)
				{
					data = *InputReg_3xxxx[i];
					mv->txBuf[LenCNT++] = data>>8;
					mv->txBuf[LenCNT++] = data&0xFF;
				}
			}else if((Adrr>0x01DA)&&(Adrr<=0x031E)&&(Adrr>0))//SOC
			{
				for(i=(Adrr-0x01DB);i<((Adrr+RegNum)-0x01DB);i++)
				{
					mv->txBuf[LenCNT++] = li_battery_.Cell_SOC[i]>>8;
					mv->txBuf[LenCNT++] = li_battery_.Cell_SOC[i]&0xFF;
				}
			}
			else if((Adrr<=0x462)&&(Adrr>0x031E)&&(Adrr>0))//SOH
			{
				for(i=(Adrr -0x031F);i<((Adrr+RegNum)-0X031F);i++)
				{
					mv->txBuf[LenCNT++] = li_battery_.Cell_SOH[i]>>8;
					mv->txBuf[LenCNT++] = li_battery_.Cell_SOH[i]&0xFF;
				}
			}
			
			break;
		case 3:
			for(i=Adrr;i<((Adrr+RegNum));i++)
			{
				data = *InputReg_3xxxx[i];
				mv->txBuf[LenCNT++] = data>>8;
				mv->txBuf[LenCNT++] = data&0xFF;
			}
			break;
		case 4:
			if(Adrr<0x01C5)
			{
				for(i=Adrr;i<((Adrr+RegNum));i++)
				{
					data = *InputReg_3xxxx[i];
					mv->txBuf[LenCNT++] = data>>8;
					mv->txBuf[LenCNT++] = data&0xFF;
				}
			}
			else if((Adrr>=0x01C5)&&(Adrr<0x02E5))//SOC
			{
				for(i=(Adrr-0x01C5);i<((Adrr+RegNum)-0x01C5);i++)
				{
					mv->txBuf[LenCNT++] = li_battery_.Cell_SOC[i]>>8;
					mv->txBuf[LenCNT++] = li_battery_.Cell_SOC[i]&0xFF;
				}
			}
			else if((Adrr<0x405)&&(Adrr>=0x02E5))//SOH
			{
				for(i=(Adrr -0x02DD);i<((Adrr+RegNum)-0X02DD);i++)
				{
					mv->txBuf[LenCNT++] = li_battery_.Cell_SOH[i]>>8;
					mv->txBuf[LenCNT++] = li_battery_.Cell_SOH[i]&0xFF;
				}
			}
			break;
		default :
			break ;		
	}
	mv->txBuf[2] = LenCNT - 3;
	TEMPCRC = ModbusCRC(mv->txBuf,LenCNT);
	mv->txBuf[LenCNT++] =  LBYTE(TEMPCRC); 							
	mv->txBuf[LenCNT++] =  HBYTE(TEMPCRC);
	mv->txLen = LenCNT;	
}

好用可移植,接收数据采用中断方式

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值