接口通訊課程設計
接口通訊課程設計,接口,通訊,通信,課程設計
設計目的及任務:
了解PC機串行口的使用。
(1) 用RS-232C的零MODEN的連接法連好兩機的連線;
(2) 用DEBUG的O命令將一數發(fā)送到串行口(3F8H/2F8H),然后再另一臺機上用DEBUG的I命令讀入串行口的內容。如果發(fā)送的內容與接受的內容一致,說明兩機已經連好線,否則必須檢查連線,直到兩機可通訊為止;
(3) 編一程序,將一臺機的鍵盤輸入的鍵值通過RS-232C口傳送到另一臺機,并在CRT上顯示鍵值,實現遠程鍵盤功能;
(4) 編一程序,通過RS-232C口進行一臺機到另一臺機的文件復制。(即將一臺機上的文件傳送到另一臺機上)
設計所需設備及環(huán)境:
PC機、RS-232C插座及連線,選擇Win-TC可視化編程環(huán)境
設計概要:
1 首先由主函數輸出初始界面,并提示用戶選擇所需功能。
如下:
2 本設計中通過零MODEM來實現數據的傳輸。
1) 發(fā)送字符串功能由SendString()函數實現:先由鍵盤輸入字符串并以Esc結尾,由putchar(c)將字符c寫到標準輸出設備,之后讀取線路狀態(tài)寄存器并測試發(fā)送保持寄存器是否為空,當為空時發(fā)送一個字符到端口。重復以上過程發(fā)送字符串,直到遇到ESC退出發(fā)送;
2) 接收字符串功能由void ReceiveString()函數實現,與發(fā)送字符串不同的是, 通過讀取線路狀態(tài)寄存器,當接收數據準備好時,從該口讀入數據并以#結束;
3) 發(fā)送文件功能由void Sendfile()函數實現,如果按照用戶輸入的文件路徑和文件名,文件能被成功打開,則把文件的內容逐一讀出,如果查詢到狀態(tài)寄存器的‘發(fā)送保持寄存器空”位的值為真,那么就把數據發(fā)送到寄存器,從文件中讀出要一直讀到文件的結尾為止;
4) 接收文件功能由void Receivefile()函數實現,首先新建文件,再打開此文件,當查詢到狀態(tài)寄存器的‘接收數據準備好’為真,就在文件的當前位置寫入一個字符,最后關閉文件,和文件句柄handle(由open()函數產生)。
printf("\n\n ok! \n");
串行口的有關硬件資料
1.9芯RS-232C接口標準
(1)引腳1:CD,載體檢測;
(2)引腳2:RXD,接收數據;
(3)引腳3:TXD,發(fā)送數據;
(4)引腳4:DTR,終端準備好;
(5)引腳5:信號地;
(6)引腳6:DSR,MODEM準備好;
(7)引腳7:RTS,請求發(fā)送;
(8)引腳8:CTS,清除發(fā)送;
(9)引腳9:R1,響鈴指示。
2.9芯RS-232的零MODEM的連接方法
3.線路控制寄存器(端口地址3FBH/2FBH)
其中:
?。模础。模场∑媾夹r灐。模病⊥V刮弧? D1?。模啊∽珠L
?。亍 。啊 o效驗 ?。啊 。薄 ? 0 0 5
?。啊 。薄 ∑嫘灐 。薄 。?5(字長為5位時)?。啊? 1 6
1 1 偶效驗 1 ?。?字長為6,7,8位時) 1 0 7
1 1 8
4.可編程波特率發(fā)生器(3F9H,3F8H,或2F9H,2F8H)
DLAB=1時,向3F9H/2F9H(高八位),3F8H/2F9H(低八位)寫入16位數,即可對1.8432Mhz的時鐘分頻,得到串行口的波特率。公式為:
波特率=1846200/(分頻值*16)
輸入頻率 1.8432Mhz
波特率
分頻器H
分頻器L
600
00H
C0H
1200
00H
60H
1800
00H
40H
2000
00H
3AH
2400
00H
30H
3600
00H
20H
4800
00H
18H
7200
00H
10H
9600
00H
0CH
19200
00H
03H
5.線路狀態(tài)寄存器(3FDH/2FDH)
6.中斷識別寄存器(3FAH/2FAH)
其中:D2 D1 D0 中斷來源
X?。亍? 1 NONE
1 1 0 線路故障
1 0 0 接收數據準保好
0?。薄 。啊 “l(fā)送保持寄存器
0?。啊 。啊 。蚈DEM中斷
7.中斷允許寄存器(3F9H/2F9H,且DLAB=0)
8.MODEM控制寄存器(3FEH/2FEH)
9.MODEM控制寄存器 (3FEH/2FEH )
8250內部寄存器端口地址及讀寫情況
端口地址
寄存器名稱
讀/寫
3F8H
發(fā)送保持寄存器
OUT
3F8H
接收數據寄存器
IN
3F8H
波特率分頻器L
OUT
3F9H
波特率分頻器H
OUT
3F9H
中斷允許寄存器
OUT
3FAH
中斷標識寄存器
IN
3FBH
線路控制寄存器
OUT
3FCH
MODEM控制寄存器
OUT
3FDH
線路狀態(tài)控制器
IN
3FEH
MODEM狀態(tài)寄存器
IN
10.以上四.3~四.4介紹的寄存器中D7~D0的各位均為1有效,0無效
功能實現:
數據收發(fā)時,一臺機選擇發(fā)送信息,另一臺選擇接收信息。雙方用鍵盤進行輸入,就可以發(fā)送、接收信息。文件收發(fā)時 一臺機選擇發(fā)送文件, 另一臺選擇接收文件。發(fā)送方輸入要發(fā)送的文件的路徑就可以傳送文件,系統將提示接收方輸入所要保存的文件的名稱。
程序代碼:
#include /* creat函數的參數S_IREAD S_IWRITE要用到 */
#include /* for creat (file) function */
#include /* 文件指針結構體FILE的頭文件 || putchar() */
#include /* for outportb function */
void Init(void)
{/*以下為8250的初始化 */
outportb(0x3fb,0x80); /* 波特率的最高位置1 */
outportb(0x3f8,0x0c); /* 除數低位 */
outportb(0x3f9,0x00); /* 除數高位 */
outportb(0x3fb,0x0f); /* 設置幀格式 奇校驗,2停止位, 8字長*/
outportb(0x3f9,0x0f); /* 允許所有中斷 */
outportb(0x3fc,0x0b); /* 由于使用零modem連接使其恒有效 */
}
void SendChar()
{
unsigned char status;
int i,c;
int flag=1;
printf("Input a character:(press ESC to back)\n");
while(flag)
{
c=getch();
putchar(c); /* 將字符顯示輸出 */
if (c==27) flag=0; /* 按esc退出輸入 */
do
{
status=inportb(0x3fd); /* 讀取通信線路狀態(tài)寄存器 */
status=status & 0x20; /* 測試發(fā)送保持寄存器是否為空(第5位) */
}while (status==0); /*直到發(fā)送狀態(tài)寄存器為空*/
outportb(0x3f8,c);/* 發(fā)送字符到端口 */
}
printf("\tsend out successful!\n");
}
void ReceiveChar()
{
int i;
char ch=0;
unsigned char status;
printf("Receiving ......\n");
while(ch!='#')
{
do
{
status=inportb(0x3fd); /* 讀取線路狀態(tài)寄存器 */
status=status & 0x01;
}while (status==0); /* 直到接收數據就緒*/
ch=inportb(0x3f8); /* 從該口讀入數據 */
putchar(ch);
}
}
void Sendfile()
{
FILE *in;
char ch;
char infile[255];
unsigned char status;
int flag=1,i;
printf("Enter the infile name :\n");
scanf("%s",infile);
getchar();
if((in=fopen(infile,"rb"))==NULL)/*無法讀取文件*/
{
printf("cannot open infile\n");
exit(0);
}
printf("Sending file...\n\n");
while(flag)
{
ch=fgetc(in);
putchar(ch);
if(ch==EOF) /* 讀到文件的結束符時退出 */
{
fclose(in); /*關閉文件*/
flag=0; /*標志位改為零*/
}
do
{
status=inportb(0x3fd); /*線路狀態(tài)寄存器*/
status=status & 0x20; /* 測試發(fā)送保持寄存器是否為空 */
}while (status==0);
outportb(0x3f8,ch);/* 發(fā)送字符到端口*/
}
printf("\n\ncomplete\n");
}
void Receivefile()
{
FILE *fp;
int handle;
int flag=1;
char c;
int i;
unsigned char status;
char fname[255]; /* 本地接收文件的名字 */
printf("please enter the file name!\n");
scanf("%s",fname);
getchar();
handle=creat(fname, S_IREAD|S_IWRITE); /* 創(chuàng)建一個文件fname */
if(handle==-1) /*創(chuàng)建失敗*/
{
printf("Creat file Faild.\n");
exit(0);
}
if((fp=fopen(fname,"wb"))==NULL) /*打開文件失敗*/
{
printf("Open file Faild.\n");
exit(0);
}
printf("Receiving file...\n\n");
while(flag)
{
do
{
status=inportb(0x3fd);/* 查詢是否接受到數據 */
status=status & 0x01;
}while (status==0);
c=inportb(0x3f8); /* 從該口讀入數據 */
if(c!=EOF) /*不是最末*/
{
printf("%c",c);
fputc(c,fp); /* 在文件的當前位置寫入一個字符*/
continue;
}
fclose(fp); /* 關閉文件 */
flag=0;
}
close(handle); /* 要關閉的文件句柄handle?創(chuàng)建文件時產生*/
printf("\n\n ok! \n");
}
void main()
{
char ch;
Init();
while(ch!='5')
{
clrscr();
printf("******************************************************************************\n");
printf(" The connection between two PC \n");
printf("******************************************************************************\n");
printf("\n");
printf("******************************************************************************\n");
printf(" PRODUCER \n");
printf(" panxinwei 3106006671 \n");
printf(" AND \n");
printf(" pengbo 3106006672 \n");
printf("******************************************************************************\n");
printf("\n");
printf("******************************************************************************\n");
printf("********************* 1.Send Char ********************\n");
printf("********************* 2.Send File ********************\n");
printf("********************* 3.Receive Char ********************\n");
printf("********************* 4.Receive File ********************\n");
printf("********************* 5.Exit ********************\n");
printf("******************************************************************************\n");
printf(" \n");
printf("Please enter your choice :");
ch=getchar();
getchar();
switch(ch)
{
case'1':SendChar(); break;
case'2':Sendfile(); break;
case'3':ReceiveChar(); break;
case'4':Receivefile(); break;
case'5': break;
default: printf("Error!!!\n");
}
}
}
第9頁
壓縮包目錄 | 預覽區(qū) |
|
請點擊導航文件預覽
|
編號:2680878
類型:共享資源
大?。?span id="aayw0yo" class="font-tahoma">114.05KB
格式:RAR
上傳時間:2019-11-28
15
積分
積分
- 關 鍵 詞:
- 接口 通訊 通信 課程設計
- 資源描述:
-
接口通訊課程設計,接口,通訊,通信,課程設計展開閱讀全文
裝配圖網所有資源均是用戶自行上傳分享,僅供網友學習交流,未經上傳用戶書面授權,請勿作他用。
鏈接地址:http://kudomayuko.com/p-2680878.html