⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbus_console.c

📁 modbus调试助手
💻 C
字号:

#include<stdio.h>

unsigned char ReadBuff[1024],WriteBuff[1024],TxBuff[300];

unsigned int crc_check(unsigned char byte,unsigned int crc)
{     auto unsigned char i,crc_last;
      crc=crc^byte;
	  for(i=0;i<8;i++)
	     {
		   crc_last=crc%2;
		   crc=crc>>1;
		   if(crc_last==1)
		     {crc=crc^0xA001;}
		  }
	  return(crc);
}

unsigned int crc_result(unsigned char *ptr,unsigned int len)
{
     unsigned int crc,i;
	 crc=0xffff;
	 for(i=0;i<len;i++)
	 {
	    crc=crc_check(*ptr,crc);
		ptr++;
	 }
     return(crc);
}

int just_crc(unsigned char *ptr,unsigned int len)
{
    unsigned int RxCrc;
	RxCrc=*(ptr+len-2) + (*(ptr+len-1)*256);
	if(RxCrc==crc_result(ptr,len-2)) return(0);
	else return(-1);
}

int answer_modbus(unsigned char *ptr,unsigned int len)
{
	struct modbus_tx34_t
	{
	       unsigned char slaver;
		   unsigned char function;
		   unsigned char byte_count;
		   unsigned char data[256+2];
	} *ptr2_modbus_tx34_t;

	unsigned char *ptr5;
	unsigned int temp_crc;
	int i;

	if(-1==just_crc(ptr,len)) return(-1);

	ptr2_modbus_tx34_t=(struct modbus_tx34_t *)TxBuff;//empty

	if(0x04==(*(ptr+1)))
	{   //origer struct
	    ptr2_modbus_tx34_t->slaver=(*(ptr+0));
		ptr2_modbus_tx34_t->function=(*(ptr+1));	
	    ptr5=ReadBuff+((*(ptr+2))*256+(*(ptr+3)))*2;
		ptr2_modbus_tx34_t->byte_count=(*(ptr+5)) * 2;
		for(i=0;i<ptr2_modbus_tx34_t->byte_count;i++)
		{   ptr2_modbus_tx34_t->data[i]=*ptr5;
			ptr5++;
		}
		temp_crc=crc_result((unsigned char *) &ptr2_modbus_tx34_t->slaver,3+ptr2_modbus_tx34_t->byte_count);
		ptr2_modbus_tx34_t->data[ptr2_modbus_tx34_t->byte_count]= temp_crc &0xff;
		ptr2_modbus_tx34_t->data[ptr2_modbus_tx34_t->byte_count+1]=(temp_crc >>8)&0xff;

		return(3+2+ptr2_modbus_tx34_t->byte_count);
	}

	if(0x03== (*(ptr+1)))
	{   //origer struct
	    ptr2_modbus_tx34_t->slaver=(*(ptr+0));
		ptr2_modbus_tx34_t->function=(*(ptr+1));	
	    ptr5=WriteBuff+((*(ptr+2))*256+(*(ptr+3)))*2;
		ptr2_modbus_tx34_t->byte_count=(*(ptr+5)) * 2;
		for(i=0;i<ptr2_modbus_tx34_t->byte_count;i++)
		{   ptr2_modbus_tx34_t->data[i]=*ptr5;
			ptr5++;
		}
		temp_crc=crc_result((unsigned char *) &ptr2_modbus_tx34_t->slaver,3+ptr2_modbus_tx34_t->byte_count);
		ptr2_modbus_tx34_t->data[ptr2_modbus_tx34_t->byte_count]= temp_crc &0xff;
		ptr2_modbus_tx34_t->data[ptr2_modbus_tx34_t->byte_count+1]=(temp_crc >>8)&0xff;
        
		return(3+2+ptr2_modbus_tx34_t->byte_count);
	}

	if(0x06==(*(ptr+1)))
	{    
        ptr5=WriteBuff+((*(ptr+2))*256+(*(ptr+3)))*2;
        *(ptr5+0)=(*(ptr+4));
		*(ptr5+1)=(*(ptr+5));

		for(i=0;i<8;i++)
		{ TxBuff[i]=*ptr;
		   ptr++;
		}
		return(0x08);
	}
	return(0);
}

int main(void)
{
    unsigned int crc_temp;
    int i,j;
    unsigned char RxBuff[100];
    printf("                       欢迎使用MODBUS调试助手1.0                   作者:李杨明\r\n\r\n");
	printf("版本说明:当前版本支持MODBUS的0X03,0X04,0X06功能\r\n");
	printf("         0X03,0X06 功能访问WriteBuff[1024]\r\n");
	printf("         0X04 功能访问ReadBuff[1024]\r\n");
	printf("         系统初始化数据:for(i=0;i<200;i++)\r\n");
	printf("                        { WriteBuff[i]=i;\r\n");
	printf("                          ReadBuff[i]=i+1;}\r\n");
	printf("         请输入不含RCR的MODBUS帧,字节间隔用空格符号区分.\r\n");
	printf("         EXMPLE FOR: 01 04 00 00 00 01 <回车>\r\n");
	for(i=0;i<200;i++)
	{
	    ReadBuff[i]=i+1;
	    WriteBuff[i]=i;
	}
	while(1)
	{    //input data
		 
		 printf("\r\n\r\n输入MODBUS帧: ");
		 scanf("%x%x%x%x%x%x",&RxBuff[0],&RxBuff[1],&RxBuff[2],&RxBuff[3],&RxBuff[4],&RxBuff[5]);
         //make crc
         crc_temp=crc_result(RxBuff,6);
         RxBuff[6]=crc_temp&0xff;
         RxBuff[7]=(crc_temp&0xff00)>>8;
		 //printf modbus frame of ask
		 printf("生成MODBUS帧: ");
		 for(i=0;i<8;i++)
		 {  
	        if(RxBuff[i]>15) printf("%x ",RxBuff[i]);
	        else printf("0%x ",RxBuff[i]);
		 }
	     printf("\r\n");
		 //deal with modbus and printf modbus frame of answer
         j=answer_modbus(RxBuff,8);
         printf("MODBUS回应数: %d\r\n",j);
		 printf("MODBUS回应帧: ");
         for(i=0;i<j;i++)
		 {if(TxBuff[i]>15) printf("%x ",TxBuff[i]);
          else printf("0%x ",TxBuff[i]);
		 }
         printf("\r\n");
         
	}
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -