怎样实现这个程序所描述的串口通信?(200分)

Y

yilijun

Unregistered / Unconfirmed
GUEST, unregistred user!
这个程序实在unix下实现的,是电信局的一个网管程序.大体的意思是,
先初始化串口,通过函数initport()来实现.再通过一定的协议来实现与交换
机的通信.我想请问的是,如何用delphi来描述函数initport()里的参数设置.
为何我用comm32.zip的控件,总是不能实现呢?
#include "spcir.h"
#define V_SIZE 70
#define MAXFILES 12 /* maxcell of traffic files */
char passwd[18]; /* password buffer */
char nmc_buf[8], jn_buf[8], jbn[8]; /* JOB NO buffer */
char rdstrb[V_SIZE][L_SIZE]; /* read EX buffer */
char filenam[MAXFILES][20]; /* REC TRAFFIC files buffer */
int baud; /* ttyport baud */
int commcount; /* amount of traffic files */
int freeflag=0; /* ready command, =1 wait send command to Ex */
int time_flag=0; /* clock signal flag */
int nmc_end=1; /* Ex free flag, =1 free */
int nmc_nub=0; /* Have send GETTRAFFIC command count */
int ffd1; /* handler of traffic save file */
int trafd1,trafd2; /* a012 nad a034 save-file handler */

char *weekname[]={"SU","MO","TU","WE","TH","FR","SA"};
char *comstr[]={"GETTRAFILE:"};
char ivstr[50],combuf[300],asktm[100];
int three=0x03,four=0x04,sev=0x07,six=0x06;
char str[L_SIZE];
char f_name[30],f_time[4],f_name1[70];
int t_count=0,d_count=0,c_count=0,cnt=0,j=0;
int func(),funcal();
int n,fd1,fd2,fd3;
char *word(),*nwords();

main(argc,argv)
int argc;
char *argv[];
{
int i,dirfd;
char ttynu[3],s_dir[70],cmd[70],compath[80],comname[80];
setbuf(stdout,0);
if(argc<2||argc>4){
printf("Usage : %s 1a 2a/n",argv[0]);
exit(1);
}
if(argc==3){
strcpy(ttynu,argv[2]);
if((fd2=initport(ttynu))<=0) exit(1);
fd3=0;
}
else{
fd2=0;
fd3=0;
}
if(readparam()<=0) exit(1); /* read password &amp; port baud */
strcpy(ttynu,argv[1]);
if((fd1=initport(ttynu))<=0) exit(1); /* initiate ttyport */
init(); /* initiate savedata file */
init_time(); /* count alarm time , set alarm clock */
sprintf(asktm,"/etc/asktime<%s/tmp/time>/dev/null/0",MPATH);
for(;;){
if(time_flag==1){ /* clock ok, ready to get traffic data */
chg_name();
time_flag=0;
freeflag=1;
}
if(freeflag==1&amp;&amp;nmc_end==1){
if(nmc_nub>commcount){
freeflag=0;
nmc_nub=0;
init_time();
}
else{
nmc_end=0;
write(fd1,&amp;four,1);
sleep(4);
write(fd1,&amp;six,1);
}
}
rdtty();
}
}

initport(ttynu)
char *ttynu;
{
struct termio t;
int nn;
int fdd;
char ttyname[20];
sprintf(ttyname,"/dev/tty%s",ttynu);
if((fdd=open(ttyname,O_RDWR))<0){
perror("Open");
return(-1);
}
if((nn=ioctl(fdd,TCGETA,&amp;t))<0){
perror("Ioctl");
close(fdd);
return(-1);
}
/*
t.c_cflag = B2400 | CS7 | CREAD | CLOCAL | PARENB ;
t.c_iflag = BRKINT | IGNPAR | IGNCR | IXON | IXANY | IXOFF ;
t.c_oflag = OPOST | ONLCR ;
t.c_lflag = 0 ;
t.c_line = 0 ;
t.c_cc[4] = 80;
t.c_cc[5] = 1;
*/
t.c_cflag = CS7 | CREAD | CLOCAL | PARENB ;
t.c_iflag = 016006;
t.c_lflag = 060;
t.c_line = 0 ;
t.c_cc[4]=1;
switch(baud){
case 1200:
t.c_cflag = t.c_cflag | B1200;
break;
case 2400:
t.c_cflag = t.c_cflag | B2400;
break;
case 4800:
t.c_cflag = t.c_cflag | B4800;
break;
default:
t.c_cflag = t.c_cflag | B9600;
}
if((nn=ioctl(fdd,TCSETA,&amp;t))<0) {
perror("Ioctl");
close(fdd);
return(-1);
}
return(fdd);
}

init()
{
char a0name[40];
strcpy(f_name,"FIRSTFILE");
sprintf(f_name1,"%s/spcdata/%s",MPATH,f_name);
ffd1=open(f_name1,O_CREAT|O_RDWR|O_APPEND,0777);
sprintf(a0name,"%s/raw/a012",MPATH);
trafd1=open(a0name, O_CREAT|O_TRUNC|O_RDWR,0777);
sprintf(a0name,"%s/raw/a034",MPATH);
trafd2=open(a0name, O_CREAT|O_TRUNC|O_RDWR,0777);
signal(SIGALRM,funcal);
/*
signal(SIGCLD,SIG_IGN);
*/
}

readrecname()
{
int dst;
FILE *fl;
char readbuf[30],readbuf1[30],nb[10];
sprintf(f_name,"%s/tab/recname",MPATH);
if((fl=fopen(f_name,"r"))==NULL){
printf("Read recname file error/n");
exit(0);
}
commcount=0;
for(;!feof(fl);){
memset(readbuf,'/0',sizeof(readbuf));
fgets(readbuf,sizeof(readbuf),fl);
sscanf(readbuf,"%s",readbuf1);
if(strlen(readbuf)<11)
break;
sprintf(filenam[commcount],"FILE=%s,/0",readbuf1);
commcount++;
}
fclose(fl);
return(1);
}

readparam()
{
FILE *fl;
char readbuf[80];
sprintf(f_name,"%s/tab/recparam",MPATH);
if((fl=fopen(f_name,"r"))==NULL){
printf("read recparam file error/n");
exit(0);
}
fgets(readbuf,sizeof(readbuf),fl);
sscanf(readbuf,"%*s%*s%s",passwd);
strcat(passwd,&amp;three);
fgets(readbuf,sizeof(readbuf),fl);
sscanf(readbuf,"%*s%*s%d",&amp;baud);
fclose(fl);
return(1);
}

init_time()
{
struct tm *st;
long t,time(),n;
t=time(&amp;t)-60;
st=localtime(&amp;t);
/* printf("min=%d sec=%d/n",st->tm_min,st->tm_sec);*/
if(st->tm_min%15==0&amp;&amp;st->tm_sec==0) n=8;
else n=(st->tm_min/15+1)*15*60-st->tm_min*60-st->tm_sec;
/* printf("init_time n=%d/n",n);*/
alarm(n);
}

rdtty()
{
int m,n;
int p;
char c,strr[L_SIZE];
for(;;){
if((n=read(fd1,str,1))>0)
for(m=0;m<n;++m){
printf("%c",str[m]);
rdstrb[cnt][j++]=str[m];
if(str[m]=='/n'){
for(;j<L_SIZE;++j) rdstrb[cnt][j]=0;
++cnt;
j=0;
}
else if(str[m]==0x03){
write(fd1,&amp;sev,1);
for(;j<L_SIZE;++j) rdstrb[cnt][j]=0;
if(traffic())
write_file();
else if(alrm()) alarm_handle();
else if(rdstrb[0][0]==0x06&amp;&amp;freeflag==1)
jn_pas();
else write_omt(fd2);
if(end_job()){
end_handle();
rundapma();
cnt=0;
j=0;
return(0);
}
cnt=0;
j=0;
}
}
else break;
}
}

/* Traffic() function is designed to jugge the received information is
nmc command response or not. The nmc commands response has two kinds:
(1)TAFFIC MEASUREMENT.(2)END JOB. The way of distinguish nmc response
from OMT response lies in that their jobno if different */

traffic()
{
int i,nn,endkey;
char keystr[200];
for(i=0;i<=cnt;++i)
if(have_key(rdstrb)||(endkey=end_key(rdstrb))) break;
if(i<=cnt){
if(endkey==1){ /* is end of buff END JOB XXXX */
nmc_end=1; /* set Ex free */
return(1);
}else{
getjn(); /* is head of buff , Get JOB NO to jn_buf*/
if(strcmp(jn_buf,nmc_buf)==0){
word(rdstrb[i+2],keystr); /* TRAKEY6='JOBNO' */
if(strcmp(keystr,TRAKEY6)==0);
else{ /* is effective traffic */
nwords(3,rdstrb,keystr);
if(strcmp(keystr,TRAKEY3)==0){ /*TRUNK*/
gettime('t',i);
t_count=1;
}
else if(strcmp(keystr,TRAKEY4)==0){
/* DESTINATION */
/*
gettime("d",i);
*/
d_count=1;
}
else if(strcmp(keystr,TRAKEY5)==0){
/* CP */
/*
gettime("c",i);
*/
c_count=1;
}
}
return(1);
}
else return(0);
}
}
return(0);
}
/* get jobno of a01,a03 ora04 . For a01,a03 jobno is in the line begin with
"INTERRUPTION" (TRAKEY10). For a04 it is in the line begin with "END TEXT". */

getjn()
{
int i;
char key[200];
for(i=cnt;i>=0;i--){
word(rdstrb,key); /* TRAKEY10 = 'INTERRUPTION' */
if(strcmp(key,TRAKEY10)==0||strcmp(key,END)==0)
break;
}
sscanf(rdstrb,"%*s%*s%*s%s",jn_buf);
}

end_key(strd)
char strd[L_SIZE];
{
int i;
char *point,key[200],jn[8];
point=word(strd,key);
if(strcmp(key,"END")==0){
point=word(point,key);
if(strcmp(key,"JOB")==0){
word(point,jn);
if(strcmp(jn,nmc_buf)==0) return(1);
}
}
return(0);
}

have_key(strc)
char strc[L_SIZE];
{
char *buf;
char key[200];
buf=word(strc,key);
if(strcmp(key,TRAKEY1)==0){ /* TRAKEY1 = 'TRAFFIC' */
buf=word(buf,key); /* TRAKEY2 = 'MEASUREMENT' */
if(strcmp(key,TRAKEY2)==0) return(1);
}
return(0);
}

gettime(st,i)
char st;
int i;
{
char tmp1[10],tmp2[10];
char tdate[18],tyear[4],tmonth[4],tday[4],thour[4],tmin[4];
int rftime,rfmin;
switch (st) {
case 't':
sscanf(rdstrb,"%*s %*s %*s %*s %*s %s %s",tmp1,tmp2);
break;
case 'd':
sscanf(rdstrb[i-3],"%*s %s %s",tmp1,tmp2);
break;
case 'c':
sscanf(rdstrb,"%*s %*s %*s %*s %s %s",tmp1,tmp2);
break;
default:
return(0);
}
sscanf(tmp1,"%2c%*c%2c%*c%2c",tyear,tmonth,tday);
sscanf(tmp2,"%2c%*c%2c",thour,tmin);
tyear[2]=tmonth[2]=tday[2]=0;
thour[2]=tmin[2]=0;
rftime=atoi(thour);
rfmin=atoi(tmin);
strcpy(tdate,tyear);
strcat(tdate,tmonth);
strcat(tdate,tday);
if(strcmp(f_name,tdate)!=0){
if(rftime==0&amp;&amp;rfmin<15);
else{
if(ffd1>0) close(ffd1);
strcpy(f_name,tdate);
sprintf(f_name1,"%s/spcdata/tr%s",MPATH,f_name);
ffd1=open(f_name1,O_CREAT|O_RDWR|O_APPEND,0777);
}
}
}

wrtorp(cptr)
char *cptr;
{
int m,pifd;
char rpname[PIPENUM][30];
for(m=0;m<PIPENUM;m++){
if((pifd=open(rpname[m],O_WRONLY|O_NDELAY))>0){
write(pifd,cptr,1);
close(pifd);
}
}
}

write_file()
{
int i;
if(t_count==1||d_count==1||c_count==1){
for(i=1;i<=cnt;i++) /* save traffic data to TRYYMMDD */
if(write(ffd1,rdstrb,strlen(rdstrb))<0)
printf("Write spcdata/trxxxx error/n");
}
if(t_count==1){ /* is TGRP data , save to 'a012' */
t_count=0;
for(i=1;i<=cnt;++i)
if(write(trafd1,rdstrb,strlen(rdstrb))<0){
printf("Write raw/rawtraff error/n");
exit(0);
}
}
else if(d_count==1||c_count==1){ /* is DEST or CP, save to 'a034' */
d_count=0; c_count=0;
for(i=1;i<=cnt;++i)
if(write(trafd2,rdstrb,strlen(rdstrb))<0){
printf("Write raw/rawtraff error/n");
exit(0);
}
}
}

rundapma()
{
if(nmc_nub>=commcount){ /* finished command and run dapma */
close(trafd1);
sprintf(f_name,"%s/bin/dapma %s/raw/a012",MPATH,MPATH);
system(f_name);
sprintf(f_name,"%s/raw/a012",MPATH);
trafd1=open(f_name,O_CREAT|O_TRUNC|O_RDWR,0777);
close(trafd2);
sprintf(f_name,"%s/bin/dapma %s/raw/a034",MPATH,MPATH);
system(f_name);
sprintf(f_name,"%s/raw/a034",MPATH);
trafd2=open(f_name,O_CREAT|O_TRUNC|O_RDWR,0777);
}
}

alrm()
{
return(0);
}

alarm_handle()
{
;
}

write_omt(fd)
int fd;
{
int i;
if(fd<=0) return;
for(i=0;i<=cnt;++i)
write(fd,rdstrb,strlen(rdstrb));
}

char *word(lp,stri)
char *lp,*stri;
{
while(*lp&amp;&amp;(*lp==' '||*lp==':'||*lp=='-'||*lp=='/t'||*lp=='/r'))
lp++;
while(*lp&amp;&amp;*lp!=' '&amp;&amp;*lp!='-'&amp;&amp;*lp!=':'&amp;&amp;*lp!='/t'&amp;&amp;*lp!='/n'&amp;&amp;*lp!='/r')
*stri++=*lp++;
*stri='/0';
if(*lp) return(lp);
else return(0);
}

/*
char *word(lp,stri)
char *lp,*stri;
{
while(*lp&amp;&amp;(*lp==' '||*lp=='/t'||*lp=='/n'||*lp=='/r'))
lp++;
while(*lp&amp;&amp;*lp!=' '&amp;&amp;*lp!='/t'&amp;&amp;*lp!='/n'&amp;&amp;*lp!='/r')
*stri++=*lp++;
*stri='/0';
if(*lp) return(lp);
else return(0);
}
*/

char *nwords(n,lp,stri)
int n;
char *lp,*stri;
{
int i;
char *p;
p=word(lp,stri);
for(i=0;i<n-1;i++)
p=word(p,stri);
}

end_job()
{
int i;
for(i=cnt;i>=0;--i)
if(have_endkey(i)==1) return(1);
return(0);
}

have_endkey(i)
int i;
{
char *buf,keystr[200];
buf=word(rdstrb,keystr);
if(strcmp(keystr,END)==0){
buf=word(buf,keystr);
if(strcmp(keystr,JOB)==0){
word(buf,jbn);
return(1);
}
}
return(0);
}

end_handle()
{
if(strcmp(nmc_buf,jbn)==0) nmc_end=1;
}

jn_pas()
{
if(digit(rdstrb[1])==1){
if(password(1)==0){ /* =0 mean is not PASSWORD */
if(rdstrb[2][0]=='<')
put_jn(1);
else sendpwd();
}
else sendpwd();
}
else
if(rdstrb[1][0]==0x0d){
chg_name();
mod_time();
put_jn(cnt-3);
}
else sendpwd();
}

mod_time() /* make clock between Ex and PC same */
{
char date[12],time[12];
char pyear[4],pmon[4],pday[4],phr[4],pmin[4];
FILE *fp;
sprintf(f_name,"%s/tmp/time",MPATH);
fp=fopen(f_name,"w");
sscanf(rdstrb[cnt-4],"%*s%s%s",date,time);
sscanf(date,"%2c%*c%2c%*c%2c",pyear,pmon,pday);
sscanf(time,"%2c%*c%2c",phr,pmin);
pyear[2]=pmon[2]=pday[2]=phr[2]=pmin[2]=0;
fprintf(fp,"%s%s%s%s%s",pyear,pmon,pday,phr,pmin);
fclose(fp);
system(asktm);
}

put_jn(i)
int i;
{
int c,jb;
if(freeflag==1){
sscanf(rdstrb,"%s",nmc_buf);
mkcom(nmc_nub);
printf("%s",combuf);
write(fd1,combuf,strlen(combuf));
if(nmc_nub>commcount) nmc_nub=0;
else nmc_nub++;
}
}

sendpwd()
{
if(freeflag==1)
write(fd1,passwd,strlen(passwd));
}


digit(strjn)
char strjn[L_SIZE];
{
int i;
for(i=0;strjn!=0x0d;++i)
if((strjn<'0')||(strjn>'9')) return(0);
if(strjn[0]==0x0a||strjn[0]==0x0d) return(0);
else return(1);
}

password(m) /* is PASSWORD< ? . Because JOBNO of PASSWORD = 0000 */
int m; /* Yes return 1 , No return 0; */
{
int i;
for(i=0;rdstrb[m]!=0x0d;++i)
if(rdstrb[m]!='0') break;
if(i<4) return(0);
return(1);
}

chg_name()
{
int i;
struct tm *st;
long t,time();
t=time(&amp;t)+60;
st=localtime(&amp;t);

readrecname();
if(st->tm_hour!=0||((st->tm_hour==0)&amp;&amp;(st->tm_min>15))){
for(i=0;i<commcount;++i){
filenam[13]=weekname[st->tm_wday][0];
filenam[14]=weekname[st->tm_wday][1];
}
if(st->tm_min<15) sprintf(ivstr,"IV=%d-%d-%d-%d;",st->tm_hour-1,45,st->tm_hour,0);
else sprintf(ivstr,"IV=%d-%d-%d-%d;",st->tm_hour,(st->tm_min/15-1)*15,st->tm_hour,(st->tm_min/15)*15);
}
else {
for(i=0;i<commcount;++i){
filenam[13]=weekname[st->tm_wday-1][0];
filenam[14]=weekname[st->tm_wday-1][1];
}
sprintf(ivstr,"IV=%d-%d-%d-%d;",23,45,0,0);
}
}

mkcom(k)
int k;
{
if(k==commcount){
strcpy(combuf,"GETTRAFILE:");
strcat(combuf,&amp;three);
return(0);
}
else{
strcpy(combuf,"GETTRAFILE:");
strcat(combuf,filenam[k]);
strcat(combuf,ivstr);
}
}

funcal()
{
signal(SIGALRM,funcal);
time_flag=1;
alarm(15*60); /* set next quarter alarm clock */
}
 
这么长的程序!!!头都昏了.
 
你的程序有些奇怪,握手信号是怎样建立的,我一直看不懂。

要了解ioctl函数才能作出更进一步的处理。

你的问题应该比较简单
注意:struct termio t; 用Delphi时把它作为16进制的串。
跟踪调试一次C程序,记录需要传递的到串口参数,
把这些参数用Delphi的控件按照C的流程进行发送和接收处理就行了。

可能有误,只做参考。
 
意外收获,我一定好好研究VC
 
接受答案了.
 
顶部