📄 modbus_console.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 + -