MSDOS下编程8250串口芯片通信程序
使用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,®s,®s) ;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,®s,®s) ;
}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,®s,®s) ;
}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,®s,®s);
}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,®s,®s);
}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,®s,®s);
}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串口芯片通信程序相关推荐
- [基于STM32底盘控制与ROS上层导航小车制作] 第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息
系列文章目录 第一节 stm32电机驱动与编码器读取反馈 第二节 stm32电机pid控制 第三节 stm32线速度标定 第四节 stm32添加mpu6050得到angle角度 第五节 实现STM32 ...
- Java核心类库之(网络编程:网络编程入门、UDP通信程序、TCP通信程序)
目录 1 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 1.4 InetAddress的使用 1.5 端口 1.6 协议 2 UDP通信程序 2.1 UDP通信原理 2 ...
- 糖儿飞教你学C++ Socket网络编程——5.2 TCP通信程序的函数及流程总结
TCP服务器端程序流程 监听套接字=socket(AF_INET, 套接字的类型, 0) bind(监听套接字, 本地地址, 地址长度) 通信套接字=accept(监听套接字, 对方地址, 地址长度的 ...
- DTE和DCE的区别下:配置串口链路通信
模拟运营商的环境下 ,DCE端配置时钟信号 在模拟器路由器模块添加NM-4T ,就会出现S接口 利用以下指令区分DCE.DTE R1#show controllers serial 0/0 结果是模拟 ...
- 电脑怎样连接虚拟串口服务器,PC机通过蓝牙虚拟串口进行通信
假如你有两台蓝牙设备,如两能计算机并都蓝牙适配器,或PC机与多功能终端(手机,虚拟仪器等等) 假如你安装了蓝牙的服务程序, 如IVT的程序或它程序, 它有串口服务功能. 并且开起了串口服务. 那我们就 ...
- STM32串口通信代码、ASCII码、XU4串口通信,printf只会转换为无符号类型,linux下的串口通信程序
1.其里面的的通信协议是是自己定的,这里 是检测到数据的结尾是以0x0d.0x0a结尾,则表示接受的数据完成了,这个数据是我想要的,这样子就不会出现一些错乱的数据信息.其中的0x8000.0x4000 ...
- Esp8266 进阶之路25【高级篇】深聊下esp8266的串口 Uart 通讯中断编程,为您准备好了 NONOS 版本 和 RTOS 系统的串口驱动文件。(附带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,不做开发板.仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 序号 SDK版本 内容 链接 1 nonos2.0 搭建 ...
- 在Arduino 完成STM32板子的串口通信程序
文章目录 要求 一.软件安装 二.编译及烧录 三.结果 四.标准库函数与HAL库函数的stm32编程方式差异 五.国人版的MCU集成开发平台 要求 安装 Ardunio IDE 和相关软件支持库,在A ...
- Ardunio下的STM32串口通信
文章目录 任务要求 Ardunio下的STM32串口通信 软件准备 编译烧录 标准库函数与HAL库函数的stm32编程方式差异 国人版的MCU集成开发平台 stduino IDE 总结 任务要求 安装 ...
最新文章
- python如何编写数据库_如何在几分钟内用Python编写一个简单的玩具数据库
- 1.7-bzip2和bunzip2
- jQuery的noConflict()方法
- Android Studio中有没有类似于Eclipse中的ctrl+2+L的快捷键? \Android Studio快捷键之代码提示...
- Innumerable Ancestors 尺取 dfs序 lca
- vs下 string输出中文 打印中文
- SpringSecurity案例之认证服务搭建
- Linux-kernel 网桥代码分析(一)
- iOS-文件断点续传
- Java ArrayList的Array,Array的ArrayList
- java 二分查找_Java二分法查找
- html 文件怎么改类型,怎么更改文件类型
- YOLOX安装部署使用训练教程以及报错
- matlab绘制图形中,常用函数调用(num2str,disp,gcf,hold on,plot,axis,subplot,line,stairs,grid,set,gca)
- iOS- 添加UIWindow蒙版
- unix源码分析_UNIX网络分析
- Altium Designer之4层板基本规则设置
- mariadb无法访问
- 黑灰产程序员被抓,背后隐藏的黑色产业链怎么破?
- 关于京东API超级搜索接口
热门文章
- Python常见字符编码间的转换教程
- 80×60长40米的地笼,80×60长40米的地笼_暑假作业:毫米、厘米、分米、米和千米的计算专项练习,附答案......
- 优秀程序员值得借鉴的一些信息
- 计算机网络全景图-网络通信协议
- zookeeper内容聚合
- snapshot、dill概念理解
- 无线充qi v2.0认证的重磅消息,快来了解下~
- Spark商业案例与性能调优实战100课》第11课:商业案例之通过纯粹通过DataFrame分析大数据电影点评系仿QQ和微信、淘宝等用户群分析与实战
- 跨平台移动开发phonegap/cordova 3.3全系列教程-helloworld
- windows php-beast安装,BEAST安装使用教程(Windows版)