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

📄 modbus.c

📁 modbus通讯协议设计 c语言实现 通过rs232可实现上位机和下位机的通信
💻 C
字号:
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#define BUFFLEN 1024 /*定义缓冲区大小*/
#define len 50
void InitCOM(); /*PC机232串口初始化,设置波特率和缓冲区,然后打开串口开始通讯*/
void OpenPort(); /*开串口*/
void ClosePort();/*关串口*/
void send(char *);/*发送*/
void receive();/*接收*/
void covert_hex_to_binary(char *);/*十六进制转换成二进制*/
void covert_decimal_to_binary(int *);/*   十进制转二进制数   */

/*CRC校验*/





void interrupt far  asyncint(); /*中断响应*/
void interrupt(*asyncoldvect)();
unsigned char Buffer[BUFFLEN]; /*定义缓冲区*/
int buffin=0;
int buffout=0;
/*--------------------------------------------------------------------------------------------------------------*/
main(int argc,char *argv[])
{
 int i;
 char port;/*存地址码*/
 char fuction;/*存功能码*/
 char reg_add_hi[2];/*存起始寄存器地址高8位*/
 char reg_add_lo[2];/*存起始寄存器地址低8位*/
 char reg_dat_hi[2];/*读取数据寄存器高8位*/
 char reg_dat_lo[2];/*读取数据寄存器低8位*/
 char port_link[2];/*用于连接命令串的地址字符*/
 char fuction_link[2];/*用于连接命令串的功能字符*/
 char result[12];/*用于存放各个域合成的总的串,即校验域前的几个域的集合*/
 if(argc==1)
   {
     printf("No parameters value,please type like: Modbus [s]/[r]\n");
     exit(1);
   }
 InitCOM(); 
 OpenPort();
 if(tolower(*argv[1])=='s')
 { 
   {
    printf("   serial port(COM1:0/COM2:1):");

    port=getche();
    printf("\n");
    if(port=='0')
      {
      	port_link[0]='0';
        port_link[1]='0';
    }
    else if(port=='1')
    {
	port_link[0]='0';
	port_link[1]='1';
    }
    printf("   select fuction(read:r/write:w):");
    fuction=getche();
    printf("\n");
    if(fuction=='w')
      {
	fuction_link[0]='0';
	fuction_link[1]='5';
    }
    else if(fuction=='r')
    {
	fuction_link[0]='0';
	fuction_link[1]='3';
    }

    printf("   register address(high):");
    for(i=0;i<2;i++)
      reg_add_hi[i]=getche();
    printf("\n");
    printf("   register address(low):");
    for(i=0;i<2;i++)
      reg_add_lo[i]=getche();
    printf("\n");
   printf("   register data(high):");
    for(i=0;i<2;i++)
    reg_dat_hi[i]=getche();
    printf("\n");
    printf("   register data(low):");
    for(i=0;i<2;i++)
      reg_dat_lo[i]=getche();
    printf("\n");
    if(fuction=='w')
      {
        printf("   type the data:");
        /*接收数据*/
      }
    else if(fuction=='r')
      {
      	/*send();*/
      	}
  }
  
 /*for(i=0;i<2;i++)*/
 /*printf("%c  ",port_link[i]);*/
 /*for(i=0;i<2;i++)*/
 /*printf("%c  ",fuction_link[i]);*/
  /*for(i=0;i<2;i++)*/
  /*printf("%c  ",reg_add_hi[i]);*/
  /*for(i=0;i<2;i++)*/
  /*printf("%c  ",reg_add_lo[i]);*/
  /*for(i=0;i<2;i++)*/
   /*printf("%c  ",reg_cou[i]);*/



  for(i=0;i<2;i++)
  {
   result[i]=port_link[i];
   result[i+2]=fuction_link[i];
   result[i+4]=reg_add_hi[i];
   result[i+6]=reg_add_lo[i];
   result[i+8]=reg_dat_hi[i];
   result[i+10]=reg_dat_lo[i];
   }   
 
  
 /*for(i=0;i<10;i++)*/
   /*printf("%c",result[i]);*/
   /*  printf("\n");*/

  
  send(result);

}
 else if(tolower(*argv[1])=='r')


 receive();

 else
   printf("No parameters value,please type like: Modbus [s]/[r]\n");

/* for(i=1;i<argc;i++)*/
/*   printf("%s",argv[i]);*/
/* return 0;*/
}
/*--------------------------------------------------------------------------------------------------------------*/
void InitCOM()/*初始化COM1为0X3F8(COM2-2F8,COM3-3E8,COM4-2E8)*/
{
outportb(0x3fb,0x80);/*通訊線控制寄存器控制字,訪問波特率除數鎖存器;向0x3fb地址写0x80,outportb()管脚定义函数,0x3f9和0x3fb都是PC里负责*/
outportb(0x3f8,0x0C);/*除數鎖存器控制字低位,定波特率*/
outportb(0x3f9,0x00);/*除數鎖存器控制字高位,定波特率*/
outportb(0x3fb,0x03);
outportb(0x3fc,0x08|0x0b);
outportb(0x3f9,0x01);
}
/*--------------------------------------------------------------------------------------------------------------*/
void OpenPort()
{
unsigned char ucTemp;
InitCOM();
asyncoldvect=getvect(0x0c);
disable();
inportb(0x3f8);
inportb(0x3fe);
inportb(0x3fb);
inportb(0x3fa);
outportb(0x3fc,0x08|0x0b);
outportb(0x3f9,0x01);
ucTemp=inportb(0x21)&0xef;
outportb(0x21,ucTemp);
setvect(0x0c,asyncint);
enable();
}
/*--------------------------------------------------------------------------------------------------------------*/
void interrupt far asyncint()
{
Buffer[buffin++] = inportb(0x3f8);
if (buffin >= BUFFLEN)
buffin=0;
outportb(0x20,0x20);
}
/*--------------------------------------------------------------------------------------------------------------*/
void ClosePort(void)
{
disable();
outportb(0x3f9,0x00);
outportb(0x3fc,0x00);
outportb(0x21,inportb(0x21)&0x10);
enable();
setvect(0x0c,asyncoldvect);
}
/*--------------------------------------------------------------------------------------------------------------*/
void send(char *result_p)
{
  int j;
  unsigned int *p_crc;
  for(j=0; j<12; j++)
     printf("%c",*(result_p++));
  printf("\n");
 /*  for(j=0; j<12; j++)     /*以下5行都是4月12号加的*/*/
/*     result_p+j=(unsigned char)(*(result_p+j));*/
  p_crc=cal_crc(result_p,6);
  for(j=0;j<12;j++)  
    printf("%d",*p_crc++);
}
/*--------------------------------------------------------------------------------------------------------------*/
void receive()
{
}
/*--------------------------------------------------------------------------------------------------------------*/

unsigned int cal_crc(unsigned char *ptr, unsigned int len)     
 {                                                 
    unsigned int crc=0xffff;                         
    unsigned char i;                                
    while(len!=0)                                   
     {   
       crc^=*ptr; 
       for(i=0;i<8;i++) 
         {   
            if((crc&0x0001)==0)
               crc=crc>>1; 
            else  
             { 
               crc=crc>>1; 
               crc^=0xa001;  
             }                     
          }  
       len-=1; 
       ptr++;  
     }   
    return crc; 
 } 

⌨️ 快捷键说明

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