📄 serport.c
字号:
/////////////////////////////////////////////////////////////
//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(); //开中断
}
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); //将设置波特率
outportb(0x3f8,0x0c); //波特率为9600bps
outportb(0x3f9,0x00);
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);
}
/* send char 发送字符函数*/
void send_char(unsigned char unch)
{while(((inp(0x3f8+5))&0x40)==0);//和0x40相与,可取出D6位进行判断
outportb(0x3f8,unch);
}
//以下为主函数
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
}
if(!bExit_Flag)
send_char(unChar);//发送键入的字符
}
//unChar = read_char(); //从缓冲区中读数
if (unChar != 0xff)
{
fprintf(stdout,"%c",unChar);
}
} while (!bExit_Flag);
ClosePort(); //关闭串口
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -