资源描述:
《c语言实现串行通信接口程序论文》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、C语言实现串行通信接口程序论文摘要:本文说明了异步串行通信(RS-232)的工作方式,探讨了查询和中断两种软件接口利弊,并给出两种方式的C语言源程序的I/O通道之一,以最简单方式组成的串行双工线路只需两条信号线和一条公共地线,因此串行通信既有线路简单的优点同时也有它的缺点,即通信速率无法同并行通信相比,实际上EIARS-232C在标准条件下的最大通信速率仅为20Kb/S。尽管如此,大多数外设都提供了串行口接口.freeldata()用于发送和接收数据串;1()和2()为中断例程,二者均调用fax2()函数,fax2()
2、函数为实际处理数据接收和发送的例程。明确了串行口的工作原理,就不难理解其具体程序。3.结论上述程序采用C语言编写,在BORLANDC++2.0集成环境中调试通过,为简单起见,只考虑了使用发送/接收两条信号线的情况,并未考虑使用握手信号线。在实际应用中这两组程序尚有一些可修改之处。比如,中断接收程序中的缓冲区可改为循环表,以防数据溢出,尽可能保留最新数据。由于笔者水平所限,文中不足疏漏之处尚希行家指正。程序1:staticintreceive_delay=10000;intmay(unsignedpar,char*m,c
3、har*ss){intcs=0,j=0;char*p;bios(0,par,0);//1loop:p=m;inportb(0x3f8);//resetdo{andos=0;j=0;do{if((inportb(0x3fd)0x01)==0)if(os〉receive_delay)break;else{cs++;continue;}ssj++=inportb(0x3f8);cs=0;}axsize4096#defineSEND2#defineRECEIVE1#define10#define21staticunsigned
4、charHardinterrupt=0;structInterrupt{intportadd;intintbit;charbufmaxsize,*m;intbufh,recount,sendcount;}2={{0x3f8,0x0c,,.freel);voidsetinterrupt(intnum);voidclearinterrupt(intnum);voidinit(intnum,intpara,intinterruptmark);voidsenddata(intnum,char*mand);intgetdata(
5、intnum,char*buf);voidinterrupt1(void){fax2(0);}voidinterrupt2(void){fax2(1);}//setinterrupt,num0=1,1=2voidsetinterrupt(intnum){old_num=getvect(num.intbit);if(!oomnum)setvect(num.intbit,l);//1elsesetvect(num.intbit,2);//2//sethardintHardinterrupt=inportb(0x21);if
6、(num)outportb(0x21,Hardinterrupt0xf7);//2,0elseoutportb(0x21,Hardinterrupt0xef);//10,}voidclearinterrupt(intnum){if(num)outportb(0x21,Hardinterrupt
7、0x08);//2elseoutportb(0x21,Hardinterrupt
8、0x10);//1setvect(num.intbit,old_num);for(i=0;imaxsize;i++)num.bufi=/0;num
9、.sendcount=num.recount=num.bufh=0;outportb(num.portadd+1,0);outportb(num.portadd+4,0x0);}voidfax2(inti)//i=o,1;i=1,2{unsignedcharmark;mark=inport(i.portadd+2);do{if(mark0x4)//receivedata{if(i.bufh==maxsize)i.bufh=0;i.bufi.bufh++=inportb(i.portadd);i.recount++;}e
10、lseif(mark0x2)//sendmand{if(*i.m)outportb(i.portadd,*i.m++);i,sendcount++;}elseoutportb(i.portadd+1,1);}}ark=inport(1.portadd+2))!=1);outportb(ox20,0x20);//hardintret