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