?? serials.cpp
字號:
//*------------------------------------------------------*/
//* Cexp8s.cpp(查詢方式半雙工串行通信接口實驗-發送端程序)*/
//* 查詢方式半雙工串行通信發送程序 Source File */
//* Copyright (c) 2001 by HUST */
//*------------------------------------------------------*/
#include <conio.h> //kbhit();
#include <stdio.h> //printf();
#include <dos.h> //delay();
#define data51 0x318 //8251A數據口
#define ctrl51 0x319 //8251A命令/狀態口
#define ctrl55 0x313 //8255命令口
#define timer2 0x316 //8253的2號計數器端口
#define timctl 0x317 //8253命令口
//#define clk 1193182
#define factor 16 //波特率因子16
unsigned long int clk = 1193182;//8251輸入時鐘頻率(十六進制表示)
//定時常數數組
int tc_table[8]={
110, // 0=110bps
150, // 1=150b/s
300, // 2=300b/s
600, // 3=600b/s
1200, // 4=1200b/s
2400, // 5=2400b/s
4800, // 6=4800b/s
9600 // 1=9600b/s
};
void int51(); //初始化8251a
void set_bps(int bps); //8253-5記數初值計算與裝入
void main()
{
int getvalue=0;
int temp=-1;
int sletter,rletter,status;
for(;;)
{
clrscr();
printf("\n 0---110\n 1---150\n 2---300\n 3---600\n 4---1200\n 5---2400\n 6---4800\n 7---9600\n");
printf("\n please take one of Baud-rates\n");
getvalue=getch();
if((getvalue<'0') || (getvalue>'7'))
{
printf("\n Input error! try again please! \n"); //error message
getch();
continue;
}
else
{
break;
}
}
temp = getvalue - '0';
set_bps(tc_table[temp]);
int51();
printf("\n now enter the serial communication");
printf("\n end with 'Esc'\n");
outportb(ctrl55,0x80);//置PC6=1,打開8253-5的GATE2,開始輸出方波
outportb(ctrl55,0x0d);
for(;;)//判斷是否Esc鍵
{
if (kbhit()){//若無鍵按下,則轉接收
if((sletter=getche())==0x1b)//是ESC?是,則退出,并返回DOS
{
outport(ctrl55,0x0c);//關閉8253
return;
}
else{
status=inportb(ctrl51);//獲取8253 TXRDY 狀態
if((status&0x01)!=0)//已準備好,則將鍵入的字符發送出去
{
outportb(data51,sletter);
}
}
}
else{
status=inportb(ctrl51);//已準備好,即有數據傳送過來,則接收1個字符
if((status&0x02)!=0)
{
rletter=inportb(data51);
printf("\n%c",rletter);
}
}
}
}
void int51()
{
outportb(ctrl51,0x00);
delay(100);
outportb(ctrl51,0x40);//8251復位
delay(100);
outportb(ctrl51,0x4a);//8251A方式命令
delay(100);
outportb(ctrl51,0x27);//8251A工作命令
}
void set_bps(int bps)
{
int i,sendhigh,sendlow;
i=clk/bps;
i=i/factor;//計算計數初值
sendhigh = (i>>8)&0x00ff;
sendlow = i & 0x00ff;
outportb(timctl,0xb6);
outportb(timer2,sendlow);//裝計數初值低字節
outportb(timer2,sendhigh);//裝計數初值高字節
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -