1、两机串口通讯课程设计报告以及代码。代码在下面 课程设计 一、设计目的:了解机串行口的使用。二、设计所需设备:机,插座及连线。三、设计任务:用的零的连线法连好两机的连线;用的命令将一数发送到串行口(),然后在另一台机上用命令读入串行口的内容。如果发送的内容与接收的内容一致,说明两机已经连好线,否则必须检查连线,直到两机可通讯为止;编一程序,将一台机的键值通过口送到另一台机,并在上显示键值;编一程序,通过口进行一台机到另一台机的文件复制。四、串行口的有关硬件资料:RS-232-C 详解串行通信接口标准经过使用和发展,目前已经有几种。但都是在RS-232标准的基础上经过改进而形成的。所以,以RS-2
2、32C为主来讨论。RS-323C 标准是美国EIA(电子工业联合会)与BELL等公司一起开发的1969 年公布的通信协议。它适合于数据传输速率在020000b/s 范围内的通信。这个标准对串行通信接口的有关问题,如信号线功能、电器特性都作了明确规定。由于通行设备厂商都生产与RS-232C制式兼容的通信设备,因此,它作为一种标准,目前已在微机通信接口中广泛采用。RS-232C 标准(协议)的全称是EIA-RS-232C 标准,其中EIA(Electronic IndustryAssociation)代表美国电子工业协会,RS(ecommeded standard)代表推荐标准,232是标识号,C
3、代表RS232 的最新一次修改(1969),在这之前,有RS232B、RS232A。它规定连接电缆和机械、电气特性、信号功能及传送过程。常用物理标准还有有EIARS-232-C、EIARS-422-A、EIARS-423A、EIARS-485。这里只介绍EIARS-232-C(简称232,RS232)。例如,目前在IBM PC 机上的COM1、COM2 接口,就是RS-232C接口。9芯接口标准()引脚:,载体检测;()引脚:,接收数据;()引脚:,发送数据;()引脚:,终端准备好;()引脚:信号地;()引脚:,准备好;()引脚:,请求发送;()引脚:,
4、清除发送;()引脚:,响铃指示。29芯的零的连接方法3线路控制寄存器(端口地址3FBH/2FBH) 其中:奇偶校验停止位 字长无效验 奇效验.5(字长为位时) 6 1 1 偶效验(字长为6,7,8位时) 1 0 71 1 8 4.可编程波特率发生器(3F9H,3F8H,或2F9,2F8H)时,向(高八位),(低八位)写入位数,即可对1.8432hz的时钟分频,得到串行口的波特率。公式为:波特率=1846200/(分频值)输入频率1.8432hz波特率分频器分频器60000HC0H120000H60H180000H40H200000H3AH240000H30H360000H20H480000H1
5、8H720000H10H960000H0CH1920000H03H5.线路状态寄存器(3FDH/2FDH)6.中断识别寄存器(3FAH/2FAH)其中:D2 D1 D0 中断来源 NONE1 1 0 线路故障1 0 接收数据准保好发送保持寄存器ODEM中断7.中断允许寄存器(3F9H/2F9H,且DLAB=0)8.MODEM控制寄存器(3FEH/2FEH)9.MODEM控制寄存器 (3FEH/2FEH )8250内部寄存器端口地址及读写情况端口地址寄存器名称读写3F8H发送保持寄存器3F8H接收数据寄存器3F8H波特率分频器3F9H波特率分频器3F9H中断允许寄存器3FAH中断标识寄存器3FB
6、H线路控制寄存器3FHMODEM控制寄存器3FDH线路状态控制器3FEHMODEM状态寄存器10.以上四.3四.4介绍的寄存器中7的各位均为有效,无效。五、程序流程图如下:六、 代码与分析#include#include#include#define SIZE 1024*8 /*定义发送级冲区大小*/int flag=1;unsigned char state;/*状态字*/union char csizeof(long); long length;len; /*用联合体表示文件的长度*/void initInquire();/*初始化COM1端口,查询方式初始化*/void initInte
7、rrupt();/*初始化COM1端口,中断方式初始化*/void sendwait();/*发送等待*/void receivewait(); /*接收等待*/void interrupt(* asyncvect)(void); void interrupt far asyncint(void); /*接收中断服务程序中断服务程序*/void closeInterrupt(void); /*关中断*/long getsize(FILE *fp);/*计算文件大小*/void sendstring();/*发送字符,字符串*/void sendfile(); /*发送文件*/void gets
8、tring();/*中断接收字符串*/void getfile();/*查询接收文件*/void initInquire() /*初始化COM2端口,查询方式初始化*/ outportb(0x3fb,0x80); /*线路控制寄存器最高位为1*/ outportb(0x3f8,0x0c); outportb(0x3f9,0x00); /*除数寄存器,波特率为9600b/s*/ outportb(0x3fb,0x0b); /*8数据位,一个停止位*/ outportb(0x3fc,0x03); /*设置3FC端口MODEM控制寄存器,使8250输出DTR(数据终端准备好)和RTS(请求发送)送*
9、/ outportb(0x3f9,0x00); /*关闭所有中断*/void initInterrupt() /*初始化COM2端口,中断方式初始化*/ outportb(0x3fb,0x80); /*线路控制寄存器最高位为1*/ outportb(0x3f8,0x0c); outportb(0x3f9,0x00); /*除数寄存器,波特率为9600b/s*/ outportb(0x3fb,0x0b); /*8数据位,一个停止位*/ outportb(0x3fc,0x0b); /*打开中断开关out2,这样8250产生的中断信号可以通过系统总线送给8259中断控制器*/ outportb(0x
10、3f9,0x01); /*允许接收中断*/void sendwait()/*发送等待*/ do state=inportb(0x3fd);/*线路状态寄存器*/ state=state&0x20; /*00100000发送保持寄存器为空*/ while(!state);void receivewait() /*接收等待*/ do state=inportb(0x3fd);/*线路状态寄存器*/ state=state&0x01;/*00000001数据准备好*/ while(!state);void closeInterrupt(void) /*关中断*/ unsigned char i; d
11、isable(); outportb(0x3f9,0x00);/*关中断*/ outportb(0x3fc,0x03);/*请求发送,打开OUT1*/ i=inportb(0x21); i=i|0x10; /*8259复位*/ outportb(0x21,i); enable();/*开中断*/ setvect(0x0c,asyncvect);/*恢复原来中断向量*/void interrupt far asyncint(void) /*接收中断服务程序中断服务程序*/ state=inportb(0x3f8); if(state=) getfile(); flag=0; closeInter
12、rupt(); printf(n); else if(state=0xff) flag=0; closeInterrupt(); printf(n); /*关中断*/ else putchar(state); outportb(0x20,0x20);void sendstring() /*发送字符,字符串*/ unsigned char ch; printf(Please input the String :(end by ESC)n); printf(-Send-n); do sendwait(); /*发送之前查询发送寄存器是否为空*/ ch=getch(); printf(%c,ch);
13、 outportb(0x3f8,ch); if(ch=0x1b) flag=0; /*1b是ESC的ascii值,接收到ESC就退出*/ while(flag=1); flag=1;void getstring() unsigned char ch; printf(Begin to receive string.n); do do state=inportb(0x3fd)&0x01; /*判断接收数据是否准备好*/ while(state!=0x01); ch=inportb(0x3f8); /*接收数据*/ printf(%c,ch); while(ch!=0x1b); printf(n r
14、eceive string complete! n); init();long getsize(FILE *fp)/*计算文件大小*/ long filesize; fseek(fp,0,SEEK_END); filesize=ftell(fp); fseek(fp,0,SEEK_SET); return filesize; /*返回文件大小*/void sendfile() FILE *temp; char stringSIZE;char ch;char filename20; long size;/*还没发送的文件长度*/ int i=0; int j=1; initInquire();
15、printf(Please input the filename:n); scanf(%s,filename); if(temp=fopen(filename,rb+)=NULL)/*以二进制方式打开文件*/ printf(can not open the file!n); return; len.length=getsize(temp); /*获得文件长度*/ printf(File size : %ldn,len.length); sendwait(); outportb(0x3f8,); /*发送开始字符*/ /* 开始发送文件长度*/ for(i=0;i) printf(connect
16、 error!n);/*连接失败*/ return; printf(-The end string %c had receive!-n,state); size = len.length; printf(File size : %ldn,size); i=0; /* 开始发送文件,每发2K字节发一个效验和字节*/ while(sizeSIZE) fread(string,SIZE,1,temp); /*从temp所指定的文件中读取长度为SIZE的1个数据项,存到string所指向的内存区*/ for(i=0;i0) fread(string,size,1,temp); for(i=0;isiz
17、e;i+) sendwait(); outportb(0x3f8,stringi); printf(File send sucessfully!n); fclose(temp);/*关闭文件*/void getfile() unsigned char i; char ch; char stringSIZE; char filepath20; FILE *temp; int j=0; int k=1; long time1,time2; long site; long quick;initInquire(); for(j=0;j);site=len.length/1024;printf(-beg
18、in-n);time1=clock();while(len.lengthSIZE)for(j=0;j0)for(j=0;jlen.length;j+)receivewait();stringj=inportb(0x3f8);fwrite(string,j,1,temp);time2=clock();printf(nFile size : %ldKn,site);printf(Use time : %ldsecondn,time2-time1);quick=site/(time2-time1);printf(Chuan song su du : %ldkbsn,quick);printf(rec
19、eive sucessfully end!n);fclose(temp);printf(ncontinue ?( y:YES ; otherkeys:NO )n);ch=getch();getchar();if(ch=y|ch=Y) init();init_file() initInterrupt();/*中断方式初始化*/ asyncvect = getvect(0x0c); /*获8259 IRQ4中断类型*/ disable(); state=inport(0x21); state=state&0xef; /*开8259 IRQ4中断*/ outportb(0x21,state); se
20、tvect(0x0c,asyncint); /*置中断向量类型asyncint*/ enable(); while(flag) init() int i; char ch=y; while(ch=y|ch=Y) clrscr(); printf(*nn); printf(1.send string 2.receive stringn); printf(3.send file 4.receive filen); printf(5.exitnn); printf(*n); printf(please choose(1-5):); scanf(%d,&i); printf(n); getchar()
21、; switch(i) case 1:initInquire();sendstring();break; /*发送字符*/ case 2:initInterrupt();getstring();break; /*接收字符*/ case 3:initInquire();sendfile();break; /*发送文件*/ case 4:initInterrupt();init_file();getfile();break; /*接收文件*/ case 5:break; /*退出操作界面*/ default:printf(Error!n); printf(ncontinue ?( y:YES ;
22、otherkeys:NO )n); ch=getch(); getchar(); void main() init();七、运行效果图如下:执行文件后进入下面的界面:输入字符串和接受字符串输入文件yunfei.txt接受文件,保存为guowei.txt。八、 心得体会: 通过这次“两机通讯”的课程设计让我了解到了有关于计算机的下面几个内容:我对串行口的插座及连线有进一步的了解,他们各个引脚的作用现在也有了进一步的了解,他们各个寄存器的作用以及控制方式现在都有所掌握,通过这次这是一个让我对串口知识在编程上的应用的启蒙,也是对书本知识的加深。通过这次的设计,使我对接口知识有了加深,而且对我的编程知识也得到了提高。 这次的课程设计,让我对计算机的基本原理了解得更多,更清晰。我很高兴能够完成这次课程设计,在这过程中,我遇到了一些技术上的问题是我自己无法解决的,通过查找资料,同时通过与同学的合作探讨,对c应用于接口通信编程和接口与通信这门课程有了更加深刻的了解。附录: 参考文献: 1、余永权、汤荣江 计算机接口与通信 华南理工大学出版社 2、区明明、陈恩孝、王丽仪 计算机接口与通讯实验指导书 3、网络上一些电子书籍、资料等。 .