- 设计任务
- 用RS-232C的零MODEM的连接法连好两机的连线;
- 用DOS的MODE命令设置好两机的通讯格式,两机的通讯必须一致;
- 和DEBUG的O命令将一数发送到串行口(2F8H-3F8H),然后在另一台机上用I 命令读入串行口的内容。如果发送的内容与接收的内容一致,说明两机已接好线,否则必须检查连线,直到两可通讯为止;
- 编一程序,将一台机的键盘输入的键值通过RS-232C口送到另一台机,并在CRT上显示键值;
- 编一程序,通过RS-232C口进行一台机到另一台机的文件复制。
- 基本实现方法
1.此设计是利用接口RS-232C来实现两机通讯。通过8250芯片来控制COM1和COM2端口来传输和接收数据。(在IBM-PC中,COM1与COM2都是RS-232C接口)
2.9芯RS-232C接口标准如下:
- 引脚1:CD,载体检测;
- 引脚2:RXD,接收数据;
- 引脚3:TXD,发送数据;
- 引脚4:DTR,终端准备好;
- 引脚5:信号地;
- 引脚6:DSR,DODEM准备好;
- 引脚7:RTS:请求发送;
- 引脚8:CTS:清除发送;
- 引脚9:RI:响玲指示;
3.当通信距离较近时,可不需要Modem,通信双方可以直接连接,这种情况下,只需使用少数几根信号线。最简单的情况,在通信中根本不需要RS-232C的控制联络信号,只需三根线(发送线、接收线、信号地线)便可实现全双工异步串行通信。下面是零MODEM的最简单接法。
- 最简单接法(3线接法)
图中的2号线与3号线交叉连接是因为在直连方式时,把通信双方都当作数据终端设备看待,双方都可发也可收。在这种方式下,通信双方的任何一方,只要请求发送RTS有效和数据终端准备好DTR有效就能开始发送和接收。

4.设计所需的设备有IBM-PC机,RS-232C插座与连线。
- 程序结构说明(最后附源程序与注解)
- 程序说明
此程序由C语言实现,一个主程序中实现了发送与接收的功能,其中包括字符和文件
的发送与接收。它是通过查询方式来实现两机之间的通讯,COM1端口来发送数据,COM2来接收数据。
程序主要流程
a.发送数据
b.接收数据
5.心得体会 ......
6.参考资料
1.现代计算机接口技术 洪志全、洪学海 电子工业出版社
2.C高级实用程序设计 王士元 清华大学出版社
附录:源程序与注解
#include <sys\stat.h>
#include <string.h>
#include <fcntl.h>
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <CONIO.H>
#define COM1 0x2f8
#define COM2 0x2f8
void SendCh() {
unsigned char status;
int i,c;
int flag=1;
outportb(COM1+1,0x00);
outportb(COM1+1,0x40);
outportb(COM1+1,0xcf);
outportb(COM1+1,0x37);
printf("Input a character:");
while(flag) {
c=getch();
putchar(c);
if (c==27) flag=0;
for (i=0;i<=1000;i++);
do {
status=inportb(0x2f9);
status=status & 0x01;
}while (status==0);
outportb(COM1,c);
}
printf("complete\n");
}
void goon()
{
printf("Press any key to continue...\n");
while (!kbhit()) ;
getch();
}
void ReceiveCh() {
int i;
char ch=0;
unsigned char status;
outportb(COM2+1,0xAA);
outportb(COM2+1,0x50);
outportb(COM2+1,0xcf);
outportb(COM2+1,0x14);
printf("Receiving ...\n");
while(ch!=27) {
for (i=0;i<=1000;i++);
do {
status=inportb(COM2+5);
status=status & 0x01;
}while (status==0);
ch=inportb(COM2);
printf("%c",ch);
}
}
void Receivefile() {
FILE *fp;
int handle;
int flag=1;
char c;
int i;
unsigned char status;
char fname[]="receive.txt";
outportb(COM2+1,0xAA);
outportb(COM2+1,0x50);
outportb(COM2+1,0xcf);
outportb(COM2+1,0x14);
handle=creat(fname, S_IREAD|S_IWRITE);
if(handle==-1) {
printf("Creat file Faild.\n");
exit(0);
}
if((fp=fopen(fname,"w"))==NULL) {
printf("Open file Faild.\n");
exit(0);
}
printf("Receiving file(rename:receive.txt)...\n\n");
while(flag) {
do {
status=inportb(COM2+5);
status=status & 0x01;
}while (status==0);
c=inportb(COM2);
for (i=0;i<=1000;i++);
if(c==27) {
fclose(fp);
flag=0;
printf("%c",c);
break;
}
printf("%c",c);
fputc(c,fp);
}
close(handle);
printf("\n\n ok \n");
}
void main(){
char ch=0;
while(ch!='3')
{ printf("\n");
printf("1.send!\n");
printf("2.recieve!\n");
printf(“3.quit!\n”);
printf("Enter your choice :");
ch=getchar();
getchar();
switch(ch)
{
case'1': send();break;
case'2':recieve();break;
case'3':break;
default: printf("Error!!!\n");
}
}
}