串口一例

请教如何用pc104实现波特率为115200,端口为com2程序,要求用tc3。0,实施同步数据接受、显示和保存为文件。急!谢谢

我用bc3.1试过的。
#include   <dos.h>
#include   <iostream.h>
#include   <conio.h>
#include   <stdio.h>
#include   <stdlib.h>
#define   RXD   0
#define   TXD   0
#define   LSB   0
#define   MSB   1
#define   IER   1
#define   IIR   2
#define   LCR   3
#define   MCR   4
#define   LSR   5
#define   MSR   6
#define   IERV   1
#define   OUT2   0x08
#define   ERTS   2
#define   EDTR   1
#define   EMPTY   0X20
#define   READY   0X30
#define   ICREG   0X20
#define   IMASKREG   0X21
#define   EOI   0X20
#define   WAITCOUNT   5000
#define   BUFFLEN   2048
#define   ALTE   0X12
#define   ALTQ   0X10
int   port;
unsigned   portaddr;
unsigned   portf;
unsigned   int   baudtable[]={0x180,0xc0,0x60,0x30,0x18,0x0c,0x06};
unsigned   char   paritytable[]={0x08,0x18,0x00,0x28,0x38};
unsigned   char   buffer[BUFFLEN];//recv   buf
int   buffin=0;
int   buffout=0;
int   incount=0;
int   outcount=0;
void   interrupt(*vect_com)(...);
void   putb(unsigned   char   ch)//write   a   char   to   the   recvbuf
{
int   temp;
temp=buffin;
if(++buffin==BUFFLEN)
buffin=0;
if(buffin!=buffout)
buffer[buffin]=ch;
else
buffin=temp;
};
unsigned   char   getb()//read   a   char   from   the   recvbuf
{
if(buffout!=buffin)
{
if(++buffout==BUFFLEN)
buffout=0;
return(buffer[buffout]);
}
else
return(0xff);
};
unsigned   char   sender(unsigned   char   ch)
{
/*
int   wait=0;
//get   the   line   ready   signal
for(wait=0;wait<WAITCOUNT;wait++)
if((inportb(portaddr+MSR)&READY)==READY)
break;
if(wait==WAITCOUNT)
return(0);
*/
while(!(inportb(portaddr+LSR)&EMPTY));//get   the   place   ready   signal
outportb(portaddr+TXD,ch);
outcount++;
return(1);
};
void   interrupt   receiver(...)
{
unsigned   char   ch;
ch=inportb(portaddr+RXD);
putb(ch);
incount++;
outportb(ICREG,EOI);
};
void   SerInit(int   baud,int   datab,int   stopb,int   parity)
{
unsigned   char   lcr;
disable();
outportb(portaddr+LCR,0x80);
outportb(portaddr+LSB,baudtable[--baud]&0xFF);
outportb(portaddr+MSB,baudtable[baud]>>8);
lcr=paritytable[--parity];
lcr|=datab-5;
lcr|=(stopb-1)<<1;
outportb(portaddr+LCR,lcr);
enable();
};
void   SerOpen(void)
{
vect_com=getvect(portf+8);
disable();
inportb(portaddr+RXD);
inportb(portaddr+MSR);
inportb(portaddr+LSR);
inportb(portaddr+IIR);
outportb(portaddr+IER,IERV);
outportb(portaddr+MCR,OUT2|ERTS|EDTR);
outportb(IMASKREG,inportb(IMASKREG)&(~(1<<portf)));
setvect(portf+8,receiver);
enable();
};
void   SerClose(void)
{
disable();
outportb(portaddr+IER,0);
outportb(portaddr+MCR,0);
outportb(IMASKREG,inportb(IMASKREG)|(1<<portf));
enable();
setvect(portf+8,vect_com);
};
void   Getportaddr(int   port)
{
portaddr=peek(0X40,port*2);
portf=(port==0)?4:3;
};
void   CmdLineHelp()
{
printf("usage:   TERMINAL   com   baud   datab   stopb   parity/n");
printf("com:   1=COM1,2=COM2/n");
printf("baud:   1=300bps,2=600bps,3=1200bps,4=2400bps,5=4800bps,6=9600bps,7=19Kbps/n");
printf("datab(data   bits):5,6,7,8/n");
printf("stopb(stop   bits):1,2/n");
printf("parity:1=odd,2=even,3=none,4=mark,5=space/n/n");
};
int   CheckArgv(int   port,int   baud,int   datab,int   stopb,int     parity)
{
if(port<1||port>2)
return(1);
if(baud<1||baud>7)
return(1);
if(datab<5||datab>8)
return(1);
if(stopb<1||stopb>2)
return(1);
if(parity<1||parity>5)
return(1);
return(0);
};
void   main(int     argc,char   *argv[])
{
unsigned   char   key;
char   echoflag=0;
if(argc<6)
{
printf("指定的参数个数不正确./n");
CmdLineHelp();
exit(1);
};
if(CheckArgv(atoi(argv[1]),atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5])))
{
printf("命令行参数不正确./n");
CmdLineHelp();
exit(1);
};
port=atoi(argv[1])-1;
if(peek(0x40,port*2)==0)
{
printf("无指定的串行口./n");
CmdLineHelp();
exit(1);
};
Getportaddr(port);
SerInit(atoi(argv[2]),atoi(argv[3]),atoi(argv[4]),atoi(argv[5]));
SerOpen();
printf("ALT+E   显示开/关   ALT+Q   结束/n");
printf("OK/n");
while(1)
{
if(kbhit())
{
key=getch();
if(!key)
{
key=getch();
if(key==ALTE)
echoflag=~echoflag;
if(key==ALTQ)
break;
}
else
{
if(echoflag)
putch(key);
if(!sender(key))
printf("(Time   out!)");
};
};
key=getb();
if(key!=0xff)
putch(key);
if(key=='!'&&argc>=7)
{
FILE   *thandle;
printf("/nbegin   to   send     file   %s/n",argv[6]);
if((thandle=fopen(argv[6],"rb"))!=NULL)
{
int   mychar;
fseek(thandle,0,SEEK_SET);
while((mychar=fgetc(thandle))!=EOF)
{
                                                                                delay(1);
if(echoflag)
putch(mychar);
if(!sender(mychar))
printf("(Time   out!)");
}
}
fclose(thandle);
}
};
SerClose();
printf("%d   char   has   been   received/n",incount);
printf("%d   char   has   been   sended/n",outcount);
printf("/n/nOVER/n");
exit(0);
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值