使用C++ 语言在MSDOS操作系统下编程PC机的8250串口芯片和设备进行通信。


#include <conio.h>
#include <bios.h>
#include <dos.h>
#include <dir.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef __cplusplus#define __CPPARGS ...
#else#define __CPPARGS
#endif
#define DOUBLE_X                205
#define DOUBLE_Y                186
#define DOUBLE_LEFT_UP          201
#define DOUBLE_LEFT_DOWN        187
#define DOUBLE_RIGHT_UP         200
#define DOUBLE_RIGHT_DOWN       188
#define SIGNAL_X                196
#define SIGNAL_Y                179
#define SIGNAL_LEFT_UP          218
#define SIGNAL_LEFT_DOWN        191
#define SIGNAL_RIGHT_UP         192
#define SIGNAL_RIGHT_DOWN       217
#define MSCOMM_BUFFER_LENGTH    503
#define RECIVE_BUFFER_LENGTH ((MSCOMM_BUFFER_LENGTH-3)*10)
#define STRING_LENGTH           80#define BLACK_RED             0x04
#define BLACK_WHITE             0x07
#define BLACK_GREEN             0x02
#define BLACK_YELLOW            0x0E
#define BLUE_LIGHTING_WHITE     0x1F
#define BLUE_WHITE              0x17
#define BLUE_YELLOW             0x1E
#define BLUE_GRAY               0x18
#define RED_WHITE               0x47
#define RED_BLACK               0x40
#define GREEN_BLACK             0x30
#define GREEN_WHITE             0x37
#define GREEN_GRAY              0x38
#define WHITE_BLACK             0x70
#define WHITE_GRAY              0x78
#define WHITE_BLUE              0x71
#define WHITE_LIGHTING_BLUE     0x79
#define WHITE_PINK              0x75
#define WHITE_LIGHTING_PINK     0x7D
#define WHITE_RED               0x74
#define WHITE_LIGHTING_RED      0x7C
#define WHITE_GREEN             0x72
#define WHITE_LIGHTING_GREEN    0x7A#define WARNING_BLACK           0x40
#define WARNING_WHITE           0x47
#define SHADOW_ATTR             0x07
#define DESKTOP_ATTR            0x71
#define WINDOW_ATTR             0x70
#define STATUS_ATTR             0x70
#define SCROLL_ATTR             0x1E
#define BLANK                   0x20
#define DESKTOP_CHAR            0xB0
#define WINDOW_CHAR             0X20
#define STATUS_CHAR             0X20
#define SCROLL_CHAR             219
#define QUES_CHAR               0x3F
#define DOT_CHAR                0x2E
#define COMMA_CHAR              0x2C
#define CLOCK_CHAR              0x01
#define COLON_CHAR              0x3A    //  :
#define MIN_DESKTOP_X           0x00
#define MAX_DESKTOP_X           0x18
#define MAX_WINDOW_X            0x17
#define MIN_WINDOW_X            0x01
#define MAX_DESKTOP_Y           0x4F
#define MIN_DESKTOP_Y           0x00
#define MAX_WINDOW_Y            0x4F
#define MIN_WINDOW_Y            0x00
#define CLOCK_WINDOW_Y          0x48#define ESC                     0x011B
#define _COM_CHR7               0x02
#define _COM_CHR8               0x03
#define _COM_STOP1              0x00
#define _COM_STOP2              0x04
#define _COM_NOPARITY           0x00
#define _COM_EVENPARITY         0x18
#define _COM_ODDPARITY          0x08
/**************************************************************************
/*                              8250
/*************************************************************************/
#define TXR                     0
#define RXR                     0
#define IER                     1
#define IIR                     2
#define FCR                     2
#define LCR                     3
#define MCR                     4
#define LSR                     5
#define MSR                     6
#define DLL                     0
#define DLH                     1
#define SREG(__COM_BASE,x)      ((unsigned)(__COM_BASE + (unsigned)x))
#define RX_INT          0x01
#define TX_INT          0x02
#define RX_TX_INT       0x03
#define RX_ID           0x04
#define RX_MASK         0x07
#define TX_ID           0x02
#define DTR                     0x01
#define RTS                     0x02
#define MC_INT                  0x08
#define XMTRDY                  0x20
/**************************************************************************8259 Programmable Interrupt Controller (PIC).
/**************************************************************************/
#define INTC_MASK       0x21
#define INTC_EOI        0x20
#define COM1_BASE       0x03F8
#define COM1_IRQ_MASK   0xEF
#define COM1_INT_NUM    0x0C
#define COM2_BASE       0x02F8
#define COM2_IRQ_MASK   0xF7
#define COM2_INT_NUM    0x0B
#define IRQ_EOI         0x20void _far _interrupt UartInt(__CPPARGS) ;
void _far _interrupt ClockInt(__CPPARGS) ;typedef enum RECIVE_STATUS { RECIVE_WAIT , RECIVE_OK , RECIVE_ERROR } ;
typedef enum MSCOMM_COM { COM1 , COM2 } ;
typedef enum STOP_BIT { STOP_1 , STOP_2} ;
typedef enum CHAR_BIT { CHR7 , CHR8 };
typedef enum PARITY_BIT {NO_PARITY , EVEN_PARITY , ODD_PARITY} ;
typedef enum BOOL { False , True } ;
typedef enum BAUD { BAUD_50    ,BAUD_300   ,BAUD_600   ,BAUD_2400,BAUD_4800  ,BAUD_9600  ,BAUD_19200 ,BAUD_38400 ,BAUD_57600 ,BAUD_115200 } ;
unsigned char baud[10][2] =    {{0x00,0x09} , {0x80,0x01} , {0xC0,0x00},{0x30,0x00} , {0x18,0x00} , {0x0C,0x00},{0x06,0x00} , {0x03,0x00} , {0x02,0x00},{0x01,0x00}} ;
unsigned char send_array[] = "test MSCOMM ... " ;
char *stop_array[] = {"STOP=1" , "STOP=2" ,} ;
char *baud_array[] = {"50^:^","300^:^","600^:^","2400^:^","4800^:^","9600^:^","19200^:^","38400^:^","57600^:^","115200^:^",} ;
char *com_array[]  = {"COM1^:^","COM2^:^",};
char *parity_array[]={"NOPARITY^:^" ,"EVENPARITY^:^" ,"ODDPARITY^:^" ,} ;
char *char_array[] = {"7^:^" , "8^:^"} ;
char COMMON_String[STRING_LENGTH] ;BOOL PressEscapeKey(void)
{if (bioskey(1)){if (bioskey(0) == ESC)return (True);}return (False) ;
}class cWindows {public:cWindows(const unsigned char __x1 , const unsigned char __y1 , const unsigned char __x2 , const unsigned char __y2 , const BOOL __box_type , const unsigned char __box_attr , const unsigned char __window_attr , const unsigned char __title_attr) ;cWindows(const cWindows &cW) ;~cWindows(void) ;int WindowWidth(void) { return (Winy2 - Winy1 - 1 );}int WindowStartx(void) { return (Winx1 + 1 );}int WindowStarty(void) { return (Winy1 + 1 );}void DesktopInit(void) ;void WindowSaveImage(void) ;void WindowRestoreImage(void) ;void WindowInit(char *__Title , char *__String) ;void WindowClock(void);void WindowScrollUp(const unsigned char __row) ;void WindowScrollUp(const unsigned char __x1 , const unsigned char __y1 , const unsigned char __x2 , const unsigned char __y2 , const unsigned char __attr , const unsigned char __row) ;void WindowScrollDown(const unsigned char __row) ;void WindowBorder(void);void WriteString(const unsigned char __x , const unsigned char __y , const unsigned char __c , const unsigned char __attr) ;void WriteString(const unsigned char __x , const unsigned char __y , char *__String , const unsigned char __attr) ;void WindowString(const unsigned char __x , const unsigned char __y , char *__String);void WindowString(const unsigned char __x , char *__String) ;void WindowString(const char __ch) ;unsigned char ReadChar(const unsigned char __x , const unsigned char __y);unsigned char ReadAttr(const unsigned char __x , const unsigned char __y);void WriteStatusLine(char *__String1 , char *__String2) ;void CursorSave(void) ;void CursorRestore(void) ;private:char *image ;unsigned char xSave ;unsigned char ySave ;unsigned char BoxAttr ;unsigned char WindowAttr;unsigned char TitleAttr ;unsigned char Winx1 ;unsigned char Winx2 ;unsigned char Winy1 ;unsigned char Winy2 ;unsigned char disx ;unsigned char disy ;BOOL Box_Flag ;
} ;cWindows::cWindows(const unsigned char __x1 = 0 , const unsigned char __y1 = 0 , const unsigned char __x2 = 24 , const unsigned char __y2 = 79 , const BOOL __box_type = False , const unsigned char __box_attr = WHITE_BLACK , const unsigned char __window_attr = WHITE_BLACK , const unsigned char __title_attr = WHITE_BLACK)
{Winx1 = __x1 ;if (Winx1 > MAX_WINDOW_X) Winx1 = MAX_WINDOW_X ;Winy1 = __y1 ;if (Winy1 > MAX_WINDOW_Y-1) Winy1 = MAX_WINDOW_Y-1 ;Winx2 = __x2 ;if (Winx2 > MAX_DESKTOP_X) Winx2 = MAX_DESKTOP_X ;Winy2 = __y2 ;if (Winy2 > MAX_WINDOW_Y) Winy2 = MAX_WINDOW_Y ;if (Winx1>=Winx2) Winx1 = Winx2 -1 ;if (Winy1>=Winy2) Winy1 = Winy2 -1 ;disx = Winx1 + 1 ;disy = Winy1 + 2 ;Box_Flag = __box_type ;BoxAttr = __box_attr ;WindowAttr = __window_attr ;TitleAttr = __title_attr ;if ((image = new char [(Winx2-Winx1+1)*(Winy2-Winy1+1)*2+1]) == NULL){exit(-1) ;}WindowSaveImage() ;CursorSave() ;
}cWindows::~cWindows(void)
{CursorRestore() ;WindowRestoreImage() ;delete image ;
}void cWindows::CursorSave(void)
{union REGS regs ;regs.h.ah = 0x03 ;regs.h.bh = 0x00 ;int86(0x10,&regs,&regs) ;xSave = regs.h.dh ;ySave = regs.h.dl ;regs.h.ah = 0x02 ;regs.h.bh = 0x00 ;regs.h.dh = 0x40 ;regs.h.dl = 0x50 ;int86(0x10,&regs,&regs) ;
}void cWindows::CursorRestore(void)
{union REGS regs ;regs.h.ah = 0x02 ;regs.h.bh = 0x00 ;regs.h.dh = xSave ;regs.h.dl = ySave ;int86(0x10,&regs,&regs) ;
}void cWindows::WindowSaveImage(void)
{unsigned char far *image_ptr = image ;unsigned char endx= Winx2 ;unsigned char endy=Winy2 ;if (Winx2 < MAX_WINDOW_X) endx++ ;if (Winy2 < MAX_WINDOW_Y) endy = (Winy2 < MAX_WINDOW_Y-1 ? Winy2+2 : Winy2+1) ;for (unsigned char i = Winx1 ; i<=endx ; i++)for (unsigned char j=Winy1 ; j<=endy ; j++){*image_ptr++ = ReadChar(i,j) ;*image_ptr++ = ReadAttr(i,j) ;}
}void cWindows::WindowRestoreImage(void)
{unsigned char far *image_ptr = image ;unsigned char endx= Winx2 ;unsigned char endy=Winy2 ;if (Winx2 < MAX_WINDOW_X) endx++ ;if (Winy2 < MAX_WINDOW_Y)  endy = (Winy2 < MAX_WINDOW_Y-1 ? Winy2+2 : Winy2+1) ;for (unsigned char i=Winx1 ; i<=endx ; i++)for (unsigned char j=Winy1 ; j<=endy ; j++){unsigned char c = *image_ptr++ ;unsigned char attr = *image_ptr++ ;WriteString(i,j,c,attr);}
}void cWindows::WindowClock(void)
{unsigned int year ;unsigned char month ;unsigned char day ;asm {MOV AH,2Ahint 21hMOV year,CXMOV month,DHMOV day,DL}if (month>=10 && day>=10)sprintf(COMMON_String, "%4d:%2d:%2d"  ,year,month,day) ;else if (month>=10 && day<10)sprintf(COMMON_String, "%4d:%2d:0%1d" ,year,month,day) ;else if (month<10 && day<10)sprintf(COMMON_String, "%4d:0%1d:0%1d",year,month,day) ;else if (month<10 && day>=10)sprintf(COMMON_String, "%4d:0%1d:%2d" ,year,month,day) ;WriteString(MAX_DESKTOP_X,70,COMMON_String,WHITE_BLACK);}void cWindows::WriteString(const unsigned char __x,const unsigned char __y,const unsigned char __c, const unsigned char __attr)
{asm {PUSH ESMOV  AX,0B800hMOV  ES,AXMOV  AH,__xMOV  AL,0A0hMUL  AHXCHG AX,BXXOR  AH,AHMOV  AL,__ySHL  AL,01hADD  AX,BXXCHG DI,AXMOV  AL,__cMOV  AH,__attrCLDSTOSWPOP  ES}
}void cWindows::WriteString(const unsigned char __x,const unsigned char __y,char *__String,const unsigned char __attr)
{unsigned char wx = __x ;unsigned char j = 0 ;char *ptr = __String ;BOOL color = False ;while (*ptr) {if (*ptr == '^')color = (BOOL)!color ;else if (*ptr == '|'){wx++ ;j = 0 ;}else {if (!color)WriteString(wx,__y+j++,*ptr,__attr) ;else{WriteString(wx,__y+j++,*ptr,WHITE_RED) ;}}ptr++ ;}
}void cWindows::WindowString(const unsigned char __x , const unsigned char __y , char *__String)
{if (!__x)WriteString(Winx1+__x,Winy1+__y,__String,TitleAttr) ;elseWriteString(Winx1+__x,Winy1+__y,__String,WindowAttr) ;
}void cWindows::WindowString(const unsigned char __x , char *__String)
{unsigned char y = (Winy2 - Winy1 + 1 - strlen(__String)) / 2 ;WindowString(__x,y,__String) ;
}void cWindows::WindowString(const char __ch)
{WriteString(disx,disy,__ch,WindowAttr) ;disy++ ;if (disy>=Winy2-1){disy = Winy1 + 2;disx++ ;if (disx >= Winx2){disx=Winx2-1 ;WindowScrollUp(1);}}
}unsigned char cWindows::ReadChar(const unsigned char __x , const unsigned char __y)
{asm {PUSH DSMOV  AX,0B800hMOV  DS,AXMOV  AH,__xMOV  AL,0A0hMUL  AHXCHG AX,BXXOR  AH,AHMOV  AL,__ySHL  AL,01hADD  AX,BXXCHG SI,AXCLDLODSWPOP  DS}return (_AL) ;
}unsigned char cWindows::ReadAttr(const unsigned char __x , const unsigned char __y)
{asm    {PUSH DSMOV  AX,0B800hMOV  DS,AXMOV  AH,__xMOV  AL,0A0hMUL  AHXCHG AX,BXXOR  AH,AHMOV  AL,__ySHL  AL,01hADD  AX,BXXCHG SI,AXCLDLODSWPOP  DS}return (_AH) ;
}void cWindows::DesktopInit(void)
{for (unsigned char i = MIN_DESKTOP_X ; i<=MAX_DESKTOP_X ; i++)for (unsigned char j = MIN_DESKTOP_Y ; j<=MAX_DESKTOP_Y ; j++)WriteString(i,j,DESKTOP_CHAR,DESKTOP_ATTR) ;WriteStatusLine(" Communication Interrupt test program ","^ ESC^-Exit");WindowClock() ;
}void cWindows::WindowBorder(void)
{unsigned char char_x = DOUBLE_X ;unsigned char char_y = DOUBLE_Y ;unsigned char left_up = DOUBLE_LEFT_UP ;unsigned char left_down = DOUBLE_LEFT_DOWN ;unsigned char right_up = DOUBLE_RIGHT_UP ;unsigned char right_down = DOUBLE_RIGHT_DOWN ;if (!Box_Flag){char_x = SIGNAL_X ;char_y = SIGNAL_Y ;left_up = SIGNAL_LEFT_UP ;left_down = SIGNAL_LEFT_DOWN ;right_up = SIGNAL_RIGHT_UP ;right_down = SIGNAL_RIGHT_DOWN ;}for (unsigned char i=Winy1 ; i<Winy2 ; i++) {WriteString(Winx1,i,char_x,BoxAttr) ;WriteString(Winx2,i,char_x,BoxAttr) ;}for (i=Winx1 ; i<Winx2 ; i++) {WriteString(i,Winy1,char_y,BoxAttr) ;WriteString(i,Winy2,char_y,BoxAttr) ;}WriteString(Winx1,Winy1,left_up,BoxAttr) ;WriteString(Winx1,Winy2,left_down,BoxAttr) ;WriteString(Winx2,Winy1,right_up,BoxAttr) ;WriteString(Winx2,Winy2,right_down,BoxAttr) ;
}void cWindows::WindowScrollUp(const unsigned char __row = 1)
{union REGS regs ;unsigned char row = __row ;if (row > (Winx2 - Winx1 -1))row = Winx2 - Winx1 -1 ;regs.h.ah = 0x06 ;regs.h.al = row ;regs.h.bh = WindowAttr ;regs.h.cl = Winy1 + 1 ;regs.h.ch = Winx1 + 1 ;regs.h.dl = Winy2 - 1 ;regs.h.dh = Winx2 - 1 ;int86(0x10,&regs,&regs);
}void cWindows::WindowScrollUp(const unsigned char __x1 = 14 , const unsigned char __y1 = 4, const unsigned char __x2 = 20, const unsigned char __y2 = 75, const unsigned char __attr=BLACK_RED , const unsigned char __row=1)
{union REGS regs ;unsigned char row = __row ;if (row > (__x2 - __x1 -1))row = __x2 - __x1 -1 ;regs.h.ah = 0x06 ;regs.h.al = row ;regs.h.bh = __attr ;regs.h.cl = __y1 + 1 ;regs.h.ch = __x1 + 1 ;regs.h.dl = __y2 - 1 ;regs.h.dh = __x2 - 1 ;int86(0x10,&regs,&regs);
}void cWindows::WindowScrollDown(const unsigned char __row = 1)
{union REGS regs ;unsigned char row = __row ;if (row > (Winx2 - Winx1 -1))row = Winx2 - Winx1 -1 ;regs.h.ah = 0x07 ;regs.h.al = row ;regs.h.bh = WindowAttr ;regs.h.cl = Winy1 + 1 ;regs.h.ch = Winx1 + 1 ;regs.h.dl = Winy2 - 1 ;regs.h.dh = Winx2 - 1 ;int86(0x10,&regs,&regs);
}void cWindows::WindowInit(char *__Title , char *__String)
{unsigned char ch ;unsigned char endx = Winx2 ;unsigned char endy = Winy2 ;if (Winx2 < MAX_WINDOW_X) endx++ ;if (Winy2 < MAX_WINDOW_Y) endy = (Winy2 < MAX_WINDOW_Y-1 ? Winy2+2 : Winy2+1) ;for (unsigned char i=Winx1 ; i<Winx2 ; i++)for (unsigned char j=Winy1 ; j<Winy2 ; j++)WriteString(i,j,WINDOW_CHAR,WindowAttr) ;if (endx < MAX_WINDOW_X && Winx2 < MAX_WINDOW_X){for (unsigned char j=Winy1+2 ; j<=endy ; j++){ch = ReadChar(endx,j) ;WriteString(endx,j,ch,SHADOW_ATTR) ;}}if (Winy2 < MAX_WINDOW_Y){for (i=Winx1+1 ; i<=endx ; i++){for (unsigned char j = Winy2+1 ; j<=endy ; j++){ch = ReadChar(i,j) ;WriteString(i,j,ch,SHADOW_ATTR) ;}}}WindowBorder();WindowString(0,__Title);WindowString(1,4,__String);
}void cWindows::WriteStatusLine(char *__String1 , char *__String2)
{for (unsigned char i=MIN_DESKTOP_Y ; i<=MAX_DESKTOP_Y ; i++){WriteString(MIN_DESKTOP_X,i,STATUS_CHAR,STATUS_ATTR) ;WriteString(MAX_DESKTOP_X,i,STATUS_CHAR,STATUS_ATTR) ;}WriteString(MIN_DESKTOP_X,30,__String1,STATUS_ATTR) ;WriteString(MAX_DESKTOP_X,MIN_DESKTOP_Y,__String2,STATUS_ATTR) ;
}class cInterrupt:public cWindows
{public:cInterrupt(const MSCOMM_COM __mscomm , const BAUD __baud_init , const STOP_BIT __stop_bit , const CHAR_BIT __char_bit , const PARITY_BIT __parity_bit) ;~cInterrupt(void);void Init8250(void) ;void Clear8250(void) ;void Init8259(void) ;void Restore8259(void) ;void InitVect(void) ;void RestoreVect(void) ;unsigned char Status8250IIR(void);void SendChar(unsigned char ch) ;unsigned char ReadChar(void) ;void Run(void) ;unsigned char Send_Char ;unsigned char rdisx ;unsigned char rdisy ;unsigned char rdisx_1 ;unsigned char rdisy_1 ;unsigned char Clock_Times ;void far interrupt (*clock_old_int)(__CPPARGS) ;private:unsigned int BASE ;unsigned char Setting ;unsigned char Baud_Lo ;unsigned char Baud_Hi ;unsigned char irq_mask ;unsigned int COM_Int_Num ;void far interrupt (*com_old_int)(__CPPARGS) ;BOOL Escape_Flag;
} ;cInterrupt::cInterrupt(const MSCOMM_COM __mscomm = COM1 , const BAUD __baud_init = BAUD_115200 , const STOP_BIT __stop_bit = STOP_1 , const CHAR_BIT __char_bit = CHR8 , const PARITY_BIT __parity_bit = NO_PARITY)
{Setting = 0x00 ;DesktopInit() ;BASE = (__mscomm == COM1) ? COM1_BASE : COM2_BASE ;irq_mask = (__mscomm == COM1) ? COM1_IRQ_MASK : COM2_IRQ_MASK ;COM_Int_Num = (__mscomm == COM1) ? COM1_INT_NUM : COM2_INT_NUM ;Baud_Lo = baud[__baud_init][0] ;Baud_Hi = baud[__baud_init][1] ;if (__parity_bit == NO_PARITY) Setting |= _COM_NOPARITY ;else if (__parity_bit == EVEN_PARITY) Setting |= _COM_EVENPARITY ;else Setting |= _COM_ODDPARITY ;Setting |= ((__stop_bit == STOP_1) ? _COM_STOP1:_COM_STOP2) ;Setting |= ((__char_bit == CHR7) ? _COM_CHR7 : _COM_CHR8) ;rdisx_1=5 ;rdisy_1=5 ;rdisx = 15 ;rdisy = 5 ;Clock_Times=0;Init8259() ;InitVect() ;Init8250() ;Escape_Flag = False ;unsigned char y =0 ;WriteString(0,y,com_array[__mscomm],WHITE_BLACK);y+=strlen(com_array[__mscomm]) -2 ;WriteString(0,y,parity_array[__parity_bit],WHITE_BLACK);y+=strlen(parity_array[__parity_bit]) -2 ;WriteString(0,y,baud_array[__baud_init],WHITE_BLACK);y+=strlen(baud_array[__baud_init]) -2 ;WriteString(0,y,char_array[__char_bit],WHITE_BLACK);y+=strlen(char_array[__char_bit]) -2 ;WriteString(0,y,stop_array[__stop_bit],WHITE_BLACK);
}cInterrupt::~cInterrupt(void)
{Restore8259() ;Clear8250() ;RestoreVect() ;
}void cInterrupt::Init8250(void)
{unsigned char c ;_disable() ;c = inp(SREG(BASE,LCR)) ;outp(SREG(BASE,LCR),c|0x80);outp(SREG(BASE,DLL),Baud_Lo);outp(SREG(BASE,DLH),Baud_Hi);outp(SREG(BASE,LCR),Setting);outp(SREG(BASE,MCR),MC_INT | RTS | DTR) ;outp(SREG(BASE,IER),RX_INT);_enable() ;
}void cInterrupt::Clear8250(void)
{_disable() ;outp(SREG(BASE,LCR),inp(SREG(BASE,LCR)) & 0x7F);outp(SREG(BASE,IER),0x00) ;_enable() ;
}void cInterrupt::Init8259(void)
{_disable() ;outp(INTC_MASK,inp(INTC_MASK) & irq_mask) ;_enable() ;
}void cInterrupt::Restore8259(void)
{_disable() ;outp(INTC_MASK,inp(INTC_MASK) | ~irq_mask);_enable() ;
}void cInterrupt::InitVect(void)
{_disable() ;com_old_int = _dos_getvect(COM_Int_Num) ;_dos_setvect(COM_Int_Num,UartInt) ;clock_old_int = _dos_getvect(0x1C) ;_dos_setvect(0x1C,ClockInt) ;_enable() ;
}void cInterrupt::RestoreVect(void)
{_disable() ;_dos_setvect(COM_Int_Num,com_old_int) ;_dos_setvect(0x1C,clock_old_int) ;_enable() ;
}unsigned char cInterrupt::Status8250IIR(void)
{return (inp(SREG(BASE,IIR)) & RX_MASK) ;
}unsigned char cInterrupt::ReadChar(void)
{return (inp(SREG(BASE,RXR))) ;
}void cInterrupt::SendChar(unsigned char ch)
{while ((inp(SREG(BASE,LSR)) & XMTRDY) == 0) ;outp(SREG(BASE,TXR),ch) ;
}void cInterrupt::Run(void)
{cWindows cUp(4,4,10,75,False,BLACK_WHITE,BLACK_GREEN,BLACK_GREEN) ;cUp.WindowInit(" Send Window ","");cWindows cDown(14,4,20,75,False,BLACK_WHITE,BLACK_YELLOW,BLACK_YELLOW) ;cDown.WindowInit(" Recive Window ","");while (!Escape_Flag){Escape_Flag = PressEscapeKey() ;}
}static cInterrupt cClock ;
void far interrupt UartInt(__CPPARGS)
{unsigned char c ;unsigned char ch ;_disable() ;c = cClock.Status8250IIR() ;if ( c & RX_ID){ch = cClock.ReadChar() ;cClock.WriteString(cClock.rdisx,cClock.rdisy++,ch,BLACK_YELLOW) ;if (cClock.rdisy >=74){cClock.rdisy=5;cClock.rdisx++ ;if (cClock.rdisx>=20){cClock.rdisx=15 ;for (unsigned char i=15 ; i<20 ; i++)for (unsigned char j=5 ; j<75 ; j++)cClock.WriteString(i,j,0x20,BLACK_YELLOW) ;}}}outp(INTC_EOI,IRQ_EOI) ;_enable() ;
}void far interrupt ClockInt(__CPPARGS)
{if (cClock.Clock_Times == 0){cClock.Clock_Times = 9 ;for (unsigned char i=0 ; i<16 ; i++){cClock.SendChar(send_array[i]) ;cClock.WriteString(cClock.rdisx_1,cClock.rdisy_1++,send_array[i],BLACK_GREEN) ;if (cClock.rdisy_1 >=74){cClock.rdisy_1=5;cClock.rdisx_1++ ;if (cClock.rdisx_1>=10){cClock.rdisx_1=5 ;for (unsigned char i=5 ; i<10 ; i++)for (unsigned char j=5 ; j<75 ; j++)cClock.WriteString(i,j,0x20,BLACK_GREEN) ;}}}}cClock.Clock_Times-- ;cClock.clock_old_int() ;
}void main(void)
{cClock.Run() ;
}

MSDOS下编程8250串口芯片通信程序相关推荐

  1. [基于STM32底盘控制与ROS上层导航小车制作] 第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息

    系列文章目录 第一节 stm32电机驱动与编码器读取反馈 第二节 stm32电机pid控制 第三节 stm32线速度标定 第四节 stm32添加mpu6050得到angle角度 第五节 实现STM32 ...

  2. Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)

    目录 1 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 1.4 InetAddress的使用 1.5 端口 1.6 协议 2 UDP通信程序 2.1 UDP通信原理 2 ...

  3. 糖儿飞教你学C++ Socket网络编程——5.2 TCP通信程序的函数及流程总结

    TCP服务器端程序流程 监听套接字=socket(AF_INET, 套接字的类型, 0) bind(监听套接字, 本地地址, 地址长度) 通信套接字=accept(监听套接字, 对方地址, 地址长度的 ...

  4. DTE和DCE的区别下:配置串口链路通信

    模拟运营商的环境下 ,DCE端配置时钟信号 在模拟器路由器模块添加NM-4T ,就会出现S接口 利用以下指令区分DCE.DTE R1#show controllers serial 0/0 结果是模拟 ...

  5. 电脑怎样连接虚拟串口服务器,PC机通过蓝牙虚拟串口进行通信

    假如你有两台蓝牙设备,如两能计算机并都蓝牙适配器,或PC机与多功能终端(手机,虚拟仪器等等) 假如你安装了蓝牙的服务程序, 如IVT的程序或它程序, 它有串口服务功能. 并且开起了串口服务. 那我们就 ...

  6. STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序

    1.其里面的的通信协议是是自己定的,这里 是检测到数据的结尾是以0x0d.0x0a结尾,则表示接受的数据完成了,这个数据是我想要的,这样子就不会出现一些错乱的数据信息.其中的0x8000.0x4000 ...

  7. Esp8266 进阶之路25【高级篇】深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...

  8. 在Arduino 完成STM32板子的串口通信程序

    文章目录 要求 一.软件安装 二.编译及烧录 三.结果 四.标准库函数与HAL库函数的stm32编程方式差异 五.国人版的MCU集成开发平台 要求 安装 Ardunio IDE 和相关软件支持库,在A ...

  9. Ardunio下的STM32串口通信

    文章目录 任务要求 Ardunio下的STM32串口通信 软件准备 编译烧录 标准库函数与HAL库函数的stm32编程方式差异 国人版的MCU集成开发平台 stduino IDE 总结 任务要求 安装 ...

最新文章

  1. python如何编写数据库_如何在几分钟内用Python编写一个简单的玩具数据库
  2. 1.7-bzip2和bunzip2
  3. jQuery的noConflict()方法
  4. Android Studio中有没有类似于Eclipse中的ctrl+2+L的快捷键? \Android Studio快捷键之代码提示...
  5. Innumerable Ancestors 尺取 dfs序 lca
  6. vs下 string输出中文 打印中文
  7. SpringSecurity案例之认证服务搭建
  8. Linux-kernel 网桥代码分析(一)
  9. iOS-文件断点续传
  10. Java ArrayList的Array,Array的ArrayList
  11. java 二分查找_Java二分法查找
  12. html 文件怎么改类型,怎么更改文件类型
  13. YOLOX安装部署使用训练教程以及报错
  14. matlab绘制图形中,常用函数调用(num2str,disp,gcf,hold on,plot,axis,subplot,line,stairs,grid,set,gca)
  15. iOS- 添加UIWindow蒙版
  16. unix源码分析_UNIX网络分析
  17. Altium Designer之4层板基本规则设置
  18. mariadb无法访问
  19. 黑灰产程序员被抓,背后隐藏的黑色产业链怎么破?
  20. 关于京东API超级搜索接口

热门文章

  1. Python常见字符编码间的转换教程
  2. 80×60长40米的地笼,80×60长40米的地笼_暑假作业:毫米、厘米、分米、米和千米的计算专项练习,附答案......
  3. 优秀程序员值得借鉴的一些信息
  4. 计算机网络全景图-网络通信协议
  5. zookeeper内容聚合
  6. snapshot、dill概念理解
  7. 无线充qi v2.0认证的重磅消息,快来了解下~
  8. Spark商业案例与性能调优实战100课》第11课:商业案例之通过纯粹通过DataFrame分析大数据电影点评系仿QQ和微信、淘宝等用户群分析与实战
  9. 跨平台移动开发phonegap/cordova 3.3全系列教程-helloworld
  10. windows php-beast安装,BEAST安装使用教程(Windows版)