?? comrxtx.cpp
字號:
/////////////////////////////////////////////////////////////
//COMRXTX.CPP for asyn serial communication (RX/TX)
//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);
}
/* 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 + -