给你一个 主程序用法:
#include "rs232.h "
ComPort COM;
COM.Open(port); //port=1 2 ... COM.Setup(9600,0x0A); COM.Clear(); COM.DTR(1); COM.RTS(1); 发送数据 COM.Write(buffer,length); 接收数据 i=COM.In(); COM.Read(result,i);
COM.RTS(0); COM.Clear(); COM.Close();
//以下是rs232.h
#ifndef _RS232_H #define _RS232_H
#define S_CTS 0x01 #define S_DSR 0x02 #define S_RI 0x04 #define S_CD 0x08
#define DATA 0 #define IER 1 #define IIR 2 #define LCR 3 #define MCR 4 #define LSR 5 #define MSR 6
#ifndef MAX_RECE #define MAX_RECE 1024 #endif
unsigned char RS232_buffer[MAX_RECE]; int QueLast,QueNext,QueLoop; int baseport;
class ComPort { private: int IRQ; unsigned char save8259; void interrupt (*OldRS232)(...); public: void Open(void); void Open(int port); void Open(int address,int irq); void Setup(long bps,int mode); void Close(void); void Clear(void); void Write(unsigned char *p,int len); void Read(unsigned char *p,int len); void DTR(int onoff); void RTS(int onoff); int In(void); int Msr(void); };
void interrupt NewRS232(...) { disable(); if ((!QueLoop)||(QueLast!=QueNext)) { RS232_buffer[QueLast++]=inportb(baseport); if (QueLast> =MAX_RECE) { QueLast=0; QueLoop=1;} } else inportb(baseport); outportb(0x20,0x20); enable(); }
void ComPort::Setup(long bps,int mode) { unsigned char c; c=(unsigned char)(115200L/bps); outportb(baseport+LCR,0x80); outportb(baseport,c); outportb(baseport+1,0); outportb(baseport+LCR,(unsigned char)mode); }
void ComPort::Open(void) { unsigned char c; QueLoop=QueLast=QueNext=0; OldRS232=getvect(0x08+IRQ); disable(); setvect(0x08+IRQ,NewRS232); save8259=inportb(0x21); _CX=IRQ; asm { mov al,0xFE rol al,cl mov c,al } outportb(0x21,save8259&c); outportb(baseport+MCR,0x08); outportb(baseport+IER,0x01); enable(); }
void ComPort::Open(int port) { static int portaa[4]={0x3F8,0x2F8,0x3E8,0x2E8}; static int irqaa[4]={4,3,4,3}; if ((port <1)||(port> 4)) port=1; baseport=portaa[port-1]; IRQ=irqaa[port-1]; Open(); }
void ComPort::Open(int address,int irq) { baseport=address; IRQ=irq; Open(); }
void ComPort::DTR(int on_off) { unsigned char c; c=inportb(baseport+MCR); if (on_off) c|=0x01; else c&=0xFE; outportb(baseport+MCR,c); }
void ComPort::RTS(int on_off) { unsigned char c; c=inportb(baseport+MCR); if (on_off) c|=0x02; else c&=0xFD; outportb(baseport+MCR,c); }
void ComPort::Close(void) { disable(); outportb(0x21,save8259); setvect(0x08+IRQ,OldRS232); outportb(baseport+IER,0x0); outportb(baseport+MCR,0x0); enable(); }
void ComPort::Clear(void) { disable(); QueLast=QueNext=QueLoop=0; enable(); }
int ComPort::In(void) { if (!QueLoop) return QueLast-QueNext; return QueLast+MAX_RECE-QueNext; }
void ComPort::Write(unsigned char *p,int len) { int i; for (i=0;i <len;i++,p++) { while ((inportb(baseport+LSR)&0x20)==0); outportb(baseport,*p); } }
void ComPort::Read(unsigned char *p,int len) { int i; for (i=0;i <len;i++,p++) { *p=RS232_buffer[QueNext++]; if (QueNext> =MAX_RECE) { disable(); QueLoop=QueNext=0; enable(); } } p[len]=0; }
int ComPort::Msr(void) { int i; i=inportb(baseport+MSR); return (i> > =4); }
#endif
|