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

📄 testcom.c

📁 一个与GP-proface人机界面通讯的上位机程序
💻 C
字号:
#include "stdio.h"
#include "dos.h"
#include "string.h"
#include "conio.h"
int  InitCom(int,int,int);
int  SetComFormat(int,int,int,int);
int  WriteCmdToGP(int,int,int,int);
void CnvtDataToHexStr(char *, int);
int  SendCharToPort(int,char);
int  SendStringToPort(int,unsigned char *,int);
int  ReadFromGP(int,int,int,char *);
char ReadCharFromPort(int,int);
int  ReadStringFromPort(int,int,int,char *);

void main()
{
   char data_from_GP[5];
   int i,ip,ibr,ctw,addr,data_to_GP,*Result,data_num=4;
   int rw,flag; // 0:read 1:write
   addr=1000;data_to_GP=100;
   ip=2;ibr=9600;

 { ctw=0x03;  //COM2: none check,1 stop,8 bit
   printf("\nBegin Init Com2 at:baudrate 9600,no parity,1 stop,8 bit...\n");
   InitCom(ip,ibr,ctw);
 }

do{
   printf("\nPlease Input Your Select: 0=read|1=write: ");
   scanf("%d",&rw);

   printf("\nPlease Input GP377L Memory Address: ");
   scanf("%d",&addr);
   if(rw)
   {
     printf("\nPlease Input Data: ");
     scanf("%d",&data_to_GP);
     printf("\nNow write %d from PC into GP memory addr %d\n",data_to_GP,addr);
     flag=1;   //flag=0:read command,flag=1:write command
     WriteCmdToGP(flag,ip,addr,data_to_GP);
   }
   printf("\nNow read data from GP memory addr %d to PC\n",addr);

   ReadFromGP(ip,addr,data_num,data_from_GP);
   printf("\nHex Data= ");
   for(i=0;i<data_num;i++)
     printf("%c",data_from_GP[i]);

   sscanf(data_from_GP,"%x",Result);
   printf("\nDec Data= %d \n",*Result);

   printf("\nPress ESC to return...");
   printf("\nAny key else to continue...\n");
  }while(getch()!=0x1b);
}
/**********************************************/
int InitCom(int iPort,int iBaudVal,int CtrlWord)
{
   int PortAddr,BaudPort,IntEnbPort;
   int CtrlPort,ModemCtrlPort;

   if(iPort==1)
   {
     PortAddr=0x3f8;//COM1
   }
   else if(iPort==2)
   {
     PortAddr=0x2f8;//COM2
   }
   else
   {
     printf("Serial port number must be 1 or 2.");
     return 0;
   }
   BaudPort=PortAddr;      //nF8
   IntEnbPort=PortAddr+1;  //nF9
   CtrlPort=PortAddr+3;    //nFB
   ModemCtrlPort=PortAddr+4; //nFC

   SetComFormat(BaudPort,CtrlPort,iBaudVal,CtrlWord);

   outp(CtrlPort,0x7f&inp(CtrlPort)); //set DLAB=0
   outp(IntEnbPort,0x0); //Disable all interrupt
   outp(ModemCtrlPort,0x03); //Set UART in search I/O status

   return 1;
}
/***************************************/
int WriteCmdToGP(int flag,int ip,int addr,int data)
{
   char cmd[3],addr_str[5], data_str[5];
   cmd[0]=0x1b;                  //"ESC"
   if(flag==1) cmd[1]=0x57;        //"W"
   else if(flag==0) cmd[1]=0x52;   //"R"
   cmd[2]=0x0D;                  //"CR"

// output write-command's start code "ESC";
   SendCharToPort(ip,cmd[0]);

// output the write-command word "W" or "R";
   SendCharToPort(ip,cmd[1]);

   CnvtDataToHexStr(addr_str,addr);
   SendStringToPort(ip,addr_str,4);

   CnvtDataToHexStr(data_str,data);
   SendStringToPort(ip,data_str,4);

// output the end_code "CR";
   SendCharToPort(ip,cmd[2]);
   return 1;
}

/**********************************************/
int SetComFormat(int BaudPort,int CtrlPort,int iBaudVal,int CtrlWord)
{
   int DiviValue;
//set baudrate
   DiviValue=115200L/iBaudVal;
   outp(CtrlPort,0x80);
   outpw(BaudPort,DiviValue);
//set comm word
   outp(CtrlPort,0x00);
   outp(CtrlPort,CtrlWord);
   return 1;
}
/************************/
int SendStringToPort(int iPort,unsigned char *pString,int iLen)
{
   int DataPort,StatePort,i;
   if(iPort==1)
   {
     DataPort=0x3f8;
     StatePort=0x3fd;
   }
   else if(iPort==2)
   {
     DataPort=0x2f8;
     StatePort=0x2fd;
   }
   else
   {
     printf("Serial port number must be 1 or 2.");
     return 0;
   }
   while((inp(StatePort)&0x20)==0) ; //LSR D5 ?=1
   for(i=0;i<iLen;i++)
   {
     while((inp(StatePort)&0x20)==0) ; //LSR D5 ?=1
     outp(DataPort,pString[i]);
     delay(100);
   }
   return 1;
}
/**********************/
void  CnvtDataToHexStr(char *hexstr, int  data)
{   int  i, len;
    char  tmp_str[25];

    sprintf(tmp_str, "%-X", data);
    len=strlen(tmp_str);
    for(i=0; i<4-len; i++)  hexstr[i]='0';
    for(i=4-len; i<4; i++)  hexstr[i]=tmp_str[i-(4-len)];
    hexstr[4]='\0';

    return;
}
/***************************/
int SendCharToPort(int iPort,char c)
{
   int DataPort,StatePort,i;
   if(iPort==1)
   {
     DataPort=0x3f8;
     StatePort=0x3fd;
   }
   else if(iPort==2)
   {
     DataPort=0x2f8;
     StatePort=0x2fd;
   }
   else
   {
     printf("Serial port number must be 1 or 2.");
     return 0;
   }
   while((inp(StatePort)&0x20)==0) ; //LSR D5 ?=1
   outp(DataPort,c);
   return 1;
}

/*********************************************/
int ReadFromGP(int iPort,int addr,int data_num,char *data)
{
   int i,DataPort,StatePort;
   char cmd[3];
   if(iPort==1)
   {
     DataPort=0x3f8;
     StatePort=0x3fd;
   }
   else if(iPort==2)
   {
     DataPort=0x2f8;
     StatePort=0x2fd;
   }
   else
   {
     printf("Serial port number must be 1 or 2.");
     return 0;
   }

  if( (data_num<0)||(data_num>2047) )  return  0;     // too many data!;

  WriteCmdToGP(0,iPort,addr,data_num);  //write "R" command to GP

  while((cmd[0]=ReadCharFromPort(DataPort,StatePort))!=0x1b) ;  //read "ESC"
  while((cmd[1]=ReadCharFromPort(DataPort,StatePort))!=0x41) ;  //read  "A"
  ReadStringFromPort(DataPort,StatePort,data_num,data);

  while((cmd[2]=ReadCharFromPort(DataPort,StatePort))!=0x0D) ;  //read  "CR"
  printf("\n*COM Read OK: command= %x  %c  %x",cmd[0],cmd[1],cmd[2]);
  return 1;
}

/*********************************************/
char ReadCharFromPort(int DataPort,int StatePort)
{
    if((inportb(StatePort)&0x01)!=0x01) return 0; //LSR D0= ? 1
    return (inportb(DataPort));
}
/**************************************************/
int ReadStringFromPort(int DataPort,int StatePort,int data_num,char *str_data)
{
  int i;
  for(i=0;i<data_num;i++)
  {
     while((inportb(StatePort)&0x01)!=0x01) ; //LSR D0= ? 1
     str_data[i]=inportb(DataPort);
  }
  str_data[i]='\0';
  return 1;
}

⌨️ 快捷键说明

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