📄 一个c串口通信程序.txt
字号:
一个C串口通信程序
难以入睡
LgwenMy Links
CSDNBlog
Contact
Syndication
登录
Blog Stats
Posts - 2
Stories - 0
Comments - 0
Trackbacks - 0
文章
程序人生 (rss)
串口编程 (rss)
流水日记 (rss)
存档
2004年12月 (1)
2004年10月 (1)
一个C串口通信程序
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <string.h>
#define COM232 0x2f8
#define COMINT 0x0b
#define MaxBufLen 500
#define Port8259 0x20
#define EofInt 0x20
static int comportaddr;
static char intvectnum;
static unsigned char maskb;
static unsigned char Buffer[MaxBufLen];
static int CharsInBuf,CircIn,CircOut;
static void (interrupt far *OldAsyncInt)();
static void interrupt far AsyncInt(void);
void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud,
unsigned char Data, unsigned char Stop, unsigned char Parity)
{
unsigned char High,Low;
int f;
comportaddr=ComPortAddr;
intvectnum=IntVectNum;
CharsInBuf=0;CircIn=0;CircOut=0;
/* set baud rate */
f=(Baud/100);
f=1152/f; High=f/256;
Low=f-High*256;
outp(ComPortAddr+3,0x80);
outp(ComPortAddr,Low);
outp(ComPortAddr+1,High);
/* set data bits,stop bits,and parity */
Data=(Data-5)|((Stop-1)*4);
if(Parity==2) Data=Data|0x18;
else if(Parity==1) Data=Data|0x8;
outp(ComPortAddr+3,Data);
/* set MCR(DTR,RTS=0,OUT1,OUT2=1) */
outp(ComPortAddr+4,0x0a);
/* set input data ready interrupt mode */
outp(ComPortAddr+1,0x01);
/* set 0C interrupt vector */
disable();
OldAsyncInt=getvect( IntVectNum );
setvect( IntVectNum, AsyncInt );
enable();
/* open interrupt */
maskb=inp(Port8259+1);
if(IntVectNum==0x0c)outp(Port8259+1,maskb&0xef); /*INT4*/
else outp(Port8259+1,maskb&0xf7); /*INT3*/
}
static void interrupt far AsyncInt(void)
{
disable();
if(CharsInBuf<MaxBufLen)
Buffer[CircIn]=inp(comportaddr);
if(CircIn<MaxBufLen-1) CircIn++;
else CircIn=0;
if(CircIn==CircOut) CircOut++;
else CharsInBuf++;
enable();
outp(Port8259,EofInt);
}
void Restore(void)
{
setvect(intvectnum,OldAsyncInt); /* restore old IRQ4 vector */
outp(Port8259+1,maskb); /* restore 8259 mask word */
}
int GetCharInBuf(unsigned char *Char)
{
int Flag;
Flag=-1;
if(CharsInBuf>0)
{
(*Char)=Buffer[CircOut];
if(CircOut<MaxBufLen-1)CircOut++;
else CircOut=0;
CharsInBuf--;
Flag=0;
}
return Flag;
}
int SendChar(unsigned char Char)
{
if((inp(comportaddr+5)&0x20)==0) return -1;
outp(comportaddr,Char);
return 0;
}
main()
{
int i,c;
unsigned char InChar;
Init_COM(COM232,COMINT,1200,8,1,0);
while(1)
{
if(kbhit())
{if((InChar=getch())==27)break;
else while(SendChar(InChar));
}
if(GetCharInBuf(&InChar)==0) /* displaying input char */
printf("%c",InChar);
}
Restore();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -