?? serialr.cpp
字號:
//*------------------------------------------------------*/
//* Cexp8r.cpp(查詢方式半雙工串行通信接口實驗-接收端程序) */
//* 查詢方式半雙工串行通信接收程序 Source File */
//* Copyright (c) 2001 by HUST */
//*------------------------------------------------------*/
#include <conio.h> //kbhit();
#include <stdio.h> //printf();
#include <dos.h> //delay();
#define data51 0x308 //8251A數據口
#define ctrl51 0x309 //8251A命令/狀態口
#define ctrl55 0x303 //8255命令口
#define timer2 0x306 //8253的2號計數器端口
#define timctl 0x307 //8253命令口
#define factor 16 //波特率因子16
#ifdef __cplusplus //if in C++ mode
#define __CPPARGS ...
#else
#define __CPPARGS
#endif
unsigned long int clk = 1193182;
char buffer[1024] = "";
int len = 0;
//定時常數數組
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 interrupt handler(__CPPARGS)
{
int letter;
disable();
letter = inportb(data51);
buffer[len++] = letter;
outportb(0xa0,0x62);//發中斷結束命令(OCW2),向從片8259發EOI命令
outportb(0x20,0x20);//向主片8259發EOI命令
enable();
}
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 count,sendhigh,sendlow;
count=clk/bps;
count=count/factor;//計算計數初值
sendhigh = (count >> 8) & 0x00ff;
sendlow = count & 0x00ff;
outportb(timctl,0xb6);
outportb(timer2,sendlow);//裝計數初值低字節
outportb(timer2,sendhigh);//裝計數初值高字節
}
void main()
{
int getvalue=0,getout = 1;
int temp=-1;
void interrupt (*oldhandler)(__CPPARGS);
int status;
for(;;)
{
clrscr();
printf(" baud-rate :\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 select 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]);//8253-5記數初值計算與裝入
int51();//初始化8251a
printf("\n now enter the serial communication");
printf("\n if you want to end,please press \"q\" or \"Q\"\n");
outportb(0x303,0x80);//初始化8255
outportb(0x303,0x0d);//令PC6=1,打開8253的GATE2,輸出方波
delay(100);
oldhandler=getvect(0x72);//獲取原中斷向量
setvect(0x72,handler);//設置新中斷向量
status=inportb(0xa1);
outportb(0xa1,status&0xfb);//打開IRQ10(OCW1)
status=inportb(0x21);
outportb(0x21,status&0xfb);//打開IRQ2(OCW1)
delay(1000);
while(getout)//按下Q/q就退出
{
int i=0;
while(i<len)
{
printf("%c",buffer[i]);
i++;
}
if (i==len) len=0;
if(kbhit())
{
if((getch()==0x51)||(getch()==0x71)) getout = 0;//ESC鍵按下返回
}
}
setvect(0x72,oldhandler);
status=inportb(0xa1);
outportb(0xa1,status|0x04);//屏蔽IRQ10(OCW1)
status=inportb(0x21);
outportb(0x21,status|0x04);//屏蔽IRQ2
outport(ctrl55,0x0c);//關閉8253
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -