|
3#
楼主 |
发表于 2013-6-14 03:32:59
|
只看该作者
以下代码是网上找的DOS下的代码,帮忙看下怎么转换grub4dos代码。
/////////////////////////////////////////////////////////////
//COMRX.CPP for asyn serial communication (only RX)
//edited by Xiong Guangming and Gong Jianwei
//Turbo C++3.0
/////////////////////////////////////////////////////////////
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#define BUFFLEN 1024
void InitCOM(); //初始化串口
void OpenPort(); //打开串口
void ClosePort(); //关闭串口,释放串口资源
//新的中断函数,注意在TC2.0下,下面函数的...要去掉
void interrupt far asyncint(...);
//中断向量:用于保存中断现场
void interrupt(*asyncoldvect)(...);
unsigned char Buffer[BUFFLEN];
int buffin=0;
int buffout=0;
//unsigned char ch;
//COM1产生的硬件中断号为IQR4,对应的中断向量为为0CH
//打开COM1
void OpenPort()
{
unsigned char ucTemp;
InitCOM(); //初始化串口
//读入由参数给定的中断向量值,并将它作为中断函数的远地址
asyncoldvect=getvect(0x0c);
disable(); //关中断
inportb(0x3f8);
inportb(0x3fe);
inportb(0x3fb);
inportb(0x3fa);
outportb(0x3fc,0x08|0x0b);
outportb(0x3f9,0x01);
ucTemp=inportb(0x21)&0xef;
outportb(0x21,ucTemp);
setvect(0x0c,asyncint);
enable(); //开中断
}
//中断服务程序,从COM1接收数据
//注意在TC2.0下,下面函数的...要去掉
void interrupt far asyncint(...)
{
//unsigned char ch;
Buffer[buffin++] = inportb(0x3f8);// 读字符到缓冲区
if (buffin >= BUFFLEN) // 缓冲区满
buffin=0; // 指针复位
outportb(0x20,0x20);
}
void ClosePort(void) //关闭中断
{
disable();
outportb(0x3f9,0x00);
outportb(0x3fc,0x00);
outportb(0x21,inportb(0x21)&0x10);
enable();
setvect(0x0c,asyncoldvect);
}
void InitCOM()// 对COM1串口初始化,设置串口参数
{
outportb(0x3fb,0x80); //将设置波特率
/* 设置波特率,低位在前、高位在后;(部分波特率器参数如下)
波特率 分频器H 分频器L
...
4800 00 18H
7200 00 10H
9600 00 0CH
....
*/
outportb(0x3f8,0x0C); //波特率为9600bps
outportb(0x3f9,0x00);
/*设置停止位、奇偶校验位、等
D7:为1表示设置波特率;为0,其他;
D6:为1,是,强迫在数据线上输出逻辑0;为0,则否;
D5:1,校验位可变;0,不变;
D4D3:×0,无校验位;01,奇校验位;11,偶校验位;
D2:0,1个停止位;1,1.5个停止位;
D1D0:00,5位数据位;01,6位数据位;10,7位数据位;11,8位数据位;
*/
outportb(0x3fb,0x03); //8个数据位,1个停止位、无奇偶校验
outportb(0x3fc,0x08|0x0b);
outportb(0x3f9,0x01);
}
unsigned char read_char(void)
{
unsigned unch;
if(buffout != buffin)
{
unch = Buffer[buffout];
buffout++;
if(buffout >= BUFFLEN)
buffout=0;
return(unch);
}
else
return(0xff);
}
//以下为主函数
void main()
{
unsigned char unChar;
short bExit_Flag=0;
OpenPort(); //打开串口
fprintf(stdout, "\n\nReady to Receive DATA\n"
"press [ESC] to quit...\n\n");
do {
if (kbhit())
{
unChar=getch();
/* Look for an ESC key */
switch (unChar)
{
case 0x1B: //ESC的ASCII值为27
bExit_Flag = 1; /* Exit program */
break;
//You may want to handle other keys here
}
}
unChar = read_char(); //从缓冲区中读数
if (unChar != 0xff)
{
fprintf(stdout,"%c",unChar);
}
} while (!bExit_Flag);
ClosePort(); //关闭串口
}
|
|