接口通訊課程設(shè)計(jì)
接口通訊課程設(shè)計(jì),接口,通訊,通信,課程設(shè)計(jì)
設(shè)計(jì)目的及任務(wù):
了解PC機(jī)串行口的使用。
(1) 用RS-232C的零MODEN的連接法連好兩機(jī)的連線;
(2) 用DEBUG的O命令將一數(shù)發(fā)送到串行口(3F8H/2F8H),然后再另一臺(tái)機(jī)上用DEBUG的I命令讀入串行口的內(nèi)容。如果發(fā)送的內(nèi)容與接受的內(nèi)容一致,說明兩機(jī)已經(jīng)連好線,否則必須檢查連線,直到兩機(jī)可通訊為止;
(3) 編一程序,將一臺(tái)機(jī)的鍵盤輸入的鍵值通過RS-232C口傳送到另一臺(tái)機(jī),并在CRT上顯示鍵值,實(shí)現(xiàn)遠(yuǎn)程鍵盤功能;
(4) 編一程序,通過RS-232C口進(jìn)行一臺(tái)機(jī)到另一臺(tái)機(jī)的文件復(fù)制。(即將一臺(tái)機(jī)上的文件傳送到另一臺(tái)機(jī)上)
設(shè)計(jì)所需設(shè)備及環(huán)境:
PC機(jī)、RS-232C插座及連線,選擇Win-TC可視化編程環(huán)境
設(shè)計(jì)概要:
1 首先由主函數(shù)輸出初始界面,并提示用戶選擇所需功能。
如下:
2 本設(shè)計(jì)中通過零MODEM來實(shí)現(xiàn)數(shù)據(jù)的傳輸。
1) 發(fā)送字符串功能由SendString()函數(shù)實(shí)現(xiàn):先由鍵盤輸入字符串并以Esc結(jié)尾,由putchar(c)將字符c寫到標(biāo)準(zhǔn)輸出設(shè)備,之后讀取線路狀態(tài)寄存器并測試發(fā)送保持寄存器是否為空,當(dāng)為空時(shí)發(fā)送一個(gè)字符到端口。重復(fù)以上過程發(fā)送字符串,直到遇到ESC退出發(fā)送;
2) 接收字符串功能由void ReceiveString()函數(shù)實(shí)現(xiàn),與發(fā)送字符串不同的是, 通過讀取線路狀態(tài)寄存器,當(dāng)接收數(shù)據(jù)準(zhǔn)備好時(shí),從該口讀入數(shù)據(jù)并以#結(jié)束;
3) 發(fā)送文件功能由void Sendfile()函數(shù)實(shí)現(xiàn),如果按照用戶輸入的文件路徑和文件名,文件能被成功打開,則把文件的內(nèi)容逐一讀出,如果查詢到狀態(tài)寄存器的‘發(fā)送保持寄存器空”位的值為真,那么就把數(shù)據(jù)發(fā)送到寄存器,從文件中讀出要一直讀到文件的結(jié)尾為止;
4) 接收文件功能由void Receivefile()函數(shù)實(shí)現(xiàn),首先新建文件,再打開此文件,當(dāng)查詢到狀態(tài)寄存器的‘接收數(shù)據(jù)準(zhǔn)備好’為真,就在文件的當(dāng)前位置寫入一個(gè)字符,最后關(guān)閉文件,和文件句柄handle(由open()函數(shù)產(chǎn)生)。
printf("\n\n ok! \n");
串行口的有關(guān)硬件資料
1.9芯RS-232C接口標(biāo)準(zhǔn)
(1)引腳1:CD,載體檢測;
(2)引腳2:RXD,接收數(shù)據(jù);
(3)引腳3:TXD,發(fā)送數(shù)據(jù);
(4)引腳4:DTR,終端準(zhǔn)備好;
(5)引腳5:信號(hào)地;
(6)引腳6:DSR,MODEM準(zhǔn)備好;
(7)引腳7:RTS,請求發(fā)送;
(8)引腳8:CTS,清除發(fā)送;
(9)引腳9:R1,響鈴指示。
2.9芯RS-232的零MODEM的連接方法
3.線路控制寄存器(端口地址3FBH/2FBH)
其中:
D4 D3 奇偶校驗(yàn)?。模病⊥V刮弧? D1 D0 字長
?。亍 。啊 o效驗(yàn) ?。啊 。薄 ? 0 ?。啊 。?
0 ?。薄 ∑嫘?yàn) 1 ?。?5(字長為5位時(shí))?。啊? 1 6
1 1 偶效驗(yàn) ?。薄 。?字長為6,7,8位時(shí)) 1 0 7
1 1 8
4.可編程波特率發(fā)生器(3F9H,3F8H,或2F9H,2F8H)
DLAB=1時(shí),向3F9H/2F9H(高八位),3F8H/2F9H(低八位)寫入16位數(shù),即可對(duì)1.8432Mhz的時(shí)鐘分頻,得到串行口的波特率。公式為:
波特率=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.中斷識(shí)別寄存器(3FAH/2FAH)
其中:D2 D1 D0 中斷來源
?。亍。亍? 1 NONE
1 1 0 線路故障
1 0 0 接收數(shù)據(jù)準(zhǔn)保好
0?。薄 。啊 “l(fā)送保持寄存器
0 0 ?。啊 。蚈DEM中斷
7.中斷允許寄存器(3F9H/2F9H,且DLAB=0)
8.MODEM控制寄存器(3FEH/2FEH)
9.MODEM控制寄存器 (3FEH/2FEH )
8250內(nèi)部寄存器端口地址及讀寫情況
端口地址
寄存器名稱
讀/寫
3F8H
發(fā)送保持寄存器
OUT
3F8H
接收數(shù)據(jù)寄存器
IN
3F8H
波特率分頻器L
OUT
3F9H
波特率分頻器H
OUT
3F9H
中斷允許寄存器
OUT
3FAH
中斷標(biāo)識(shí)寄存器
IN
3FBH
線路控制寄存器
OUT
3FCH
MODEM控制寄存器
OUT
3FDH
線路狀態(tài)控制器
IN
3FEH
MODEM狀態(tài)寄存器
IN
10.以上四.3~四.4介紹的寄存器中D7~D0的各位均為1有效,0無效
功能實(shí)現(xiàn):
數(shù)據(jù)收發(fā)時(shí),一臺(tái)機(jī)選擇發(fā)送信息,另一臺(tái)選擇接收信息。雙方用鍵盤進(jìn)行輸入,就可以發(fā)送、接收信息。文件收發(fā)時(shí) 一臺(tái)機(jī)選擇發(fā)送文件, 另一臺(tái)選擇接收文件。發(fā)送方輸入要發(fā)送的文件的路徑就可以傳送文件,系統(tǒng)將提示接收方輸入所要保存的文件的名稱。
程序代碼:
#include /* creat函數(shù)的參數(shù)S_IREAD S_IWRITE要用到 */
#include /* for creat (file) function */
#include /* 文件指針結(jié)構(gòu)體FILE的頭文件 || putchar() */
#include /* for outportb function */
void Init(void)
{/*以下為8250的初始化 */
outportb(0x3fb,0x80); /* 波特率的最高位置1 */
outportb(0x3f8,0x0c); /* 除數(shù)低位 */
outportb(0x3f9,0x00); /* 除數(shù)高位 */
outportb(0x3fb,0x0f); /* 設(shè)置幀格式 奇校驗(yàn),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); /* 直到接收數(shù)據(jù)就緒*/
ch=inportb(0x3f8); /* 從該口讀入數(shù)據(jù) */
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) /* 讀到文件的結(jié)束符時(shí)退出 */
{
fclose(in); /*關(guān)閉文件*/
flag=0; /*標(biāo)志位改為零*/
}
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)建一個(gè)文件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);/* 查詢是否接受到數(shù)據(jù) */
status=status & 0x01;
}while (status==0);
c=inportb(0x3f8); /* 從該口讀入數(shù)據(jù) */
if(c!=EOF) /*不是最末*/
{
printf("%c",c);
fputc(c,fp); /* 在文件的當(dāng)前位置寫入一個(gè)字符*/
continue;
}
fclose(fp); /* 關(guān)閉文件 */
flag=0;
}
close(handle); /* 要關(guān)閉的文件句柄handle?創(chuàng)建文件時(shí)產(chǎn)生*/
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頁
收藏
編號(hào):2680878
類型:共享資源
大?。?span id="ievbyqtbdd" class="font-tahoma">114.05KB
格式:RAR
上傳時(shí)間:2019-11-28
15
積分
- 關(guān) 鍵 詞:
-
接口
通訊
通信
課程設(shè)計(jì)
- 資源描述:
-
接口通訊課程設(shè)計(jì),接口,通訊,通信,課程設(shè)計(jì)
展開閱讀全文
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
裝配圖網(wǎng)所有資源均是用戶自行上傳分享,僅供網(wǎng)友學(xué)習(xí)交流,未經(jīng)上傳用戶書面授權(quán),請勿作他用。