📄 pc机与单片机的通讯.htm
字号:
inportb(PortBase+0); else
break;<BR> }<BR><BR> outportb(PortBase,ch);<BR>}<BR><BR>int
com_chkch(void) {<BR> unsigned char
status;<BR><BR> status =
inportb(PortBase+5);<BR> status &=
0x01;<BR> if(status)
return((int)inportb(PortBase+0)); else
return(-1);<BR><BR>}<BR></FONT><BR></P>
<P align=left>
使用查询方式的通讯程序适合9600bps以下的应用。</P>
<P align=left>(3)<A name=serial></A>使用中断的串行通讯程序设计: <A
href="http://www.ewbbs.com/Admin_ArticleShow.asp?ArticleID=128#0">返回页首</A></P>
<P align=left>
该程序由两部分组成,serial.c及sercom.c,sercom.c为通讯的底层驱动,使用中断的串行通讯程序可以工作到115.2Kbps.</P>
<P align=left><FONT
color=#ff3300><I>serial.c
</I></FONT><FONT color=#000000></FONT></P>
<BLOCKQUOTE>
<P align=left><FONT color=#0000ff>#include
<DOS.H><BR>#include <STDIO.H><BR>#include
<CONIO.H><BR>#include <STRING.H><BR>#include
<BIOS.H><BR>#include "sercom.c"<BR><BR>COM
*c;<BR><BR>main()<BR>{<BR> unsigned char
ch;<BR><BR> c = ser_init(
PORT_B,BAUD_9600,_COM_CHR8,_COM_NOPARITY,4096,4096
);<BR><BR> while(1) {<BR><BR> if(
serhit(c)) {<BR> ch =
getser(c);<BR> putchar(ch);<BR>
}<BR><BR> if(kbhit()) {<BR> ch =
getch();<BR> putser(ch,c);<BR>
}<BR><BR> }<BR>}<BR><BR></FONT></P></BLOCKQUOTE>
<P align=left><FONT
color=#ff0000><I>llio.c
</I></FONT></P>
<BLOCKQUOTE>
<P align=left><FONT color=#0000ff>#include
<STDIO.H><BR>#include <DOS.H><BR>#include
<BIOS.H><BR>#include
<MALLOC.H><BR><BR>#define CR
0x0d<BR>#define TRUE
0xff<BR>#define FALSE
0<BR><BR>#define
PORT_A 0 /* COM1
*/<BR>#define
PORT_B 1 /* COM2
*/<BR>#define BAUD_9600
_COM_9600<BR>#define
BAUD_4800
_COM_4800<BR>#define
BAUD_2400
_COM_2400<BR>#define
BAUD_1200
_COM_1200<BR>#define
BAUD_600
_COM_600<BR>#define
BAUD_300
_COM_300<BR>#define
BAUD_110 _COM_110<BR><BR><BR>typedef
struct {<BR> char
ready;
/* TRUE when ready */<BR> unsigned
com_base; /* 8250 Base
Address */<BR> char
irq_mask;
/* IRQ Enable Mask */<BR> char
irq_eoi;
/* EOI reply for this port */<BR> char
int_number;
/* Interrupt # used */<BR> void (_interrupt _far
*old)( void ); /* Old
Interrupt */<BR><BR> /* Buffers for I/O
*/<BR><BR> char
*in_buf;
/* Input buffer */<BR> int
in_tail;
/* Input buffer TAIL ptr */<BR> int
in_head;
/* Input buffer HEAD ptr */<BR> int
in_size;
/* Input buffer size */<BR> int
in_crcnt;
/* Input <CR>count */<BR> char
in_mt;
/* Input buffer FLAG */<BR><BR> char
*out_buf;
/* Output buffer */<BR> int
out_tail;
/* Output buffer TAIL ptr */<BR> int
out_head;
/* Output buffer HEAD ptr */<BR> int
out_size;
/* Output buffer size */<BR> char
out_full;
/* Output buffer FLAG */<BR> char
out_mt;
/* Output buffer MT */<BR>}
COM;<BR><BR><BR>COM *ser_init(
int port,int baud,int bit,int parity,int isize,int
osize );<BR>void ser_close(
COM *c );<BR><BR><BR>int getsers( COM *c,int len,char
*str );<BR>int putsers( char *str, COM *c );<BR>char
serline( COM *c );<BR>int getser( COM *c );<BR>char
serhit(COM *c);<BR>char putser(char outch,COM
*c);<BR>void cntl_rts(int flag,COM *c);<BR>void
cntl_dtr(int flag,COM *c);<BR>void clean_ser( COM *c
);<BR><BR><BR>#define
COM1_BASE
0x03F8<BR>#define
COM1_IRQ_MASK
0xEF /*11101111B IRQ 4 For
COM1 */<BR>#define
COM1_IRQ_EOI
0x64 /* IRQ 4 Spec EOI
*/<BR>#define
COM1_INT_NUM
0x0C /* Int # for IRQ4
*/<BR><BR>#define
COM2_BASE
0x02F8<BR>#define
COM2_IRQ_MASK
0xF7 /*11110111B IRQ 3 For
COM2 */<BR>#define
COM2_IRQ_EOI
0x63 /* IRQ 3 Spec EOI
*/<BR>#define
COM2_INT_NUM
0x0B /* Int # for IRQ3
*/<BR><BR>/* 8250 ACE register defs
*/<BR><BR>#define
THR 0
/* Offset to Xmit hld reg (write)
*/<BR>#define
RBR 0
/* Receiver holding buffer (read)
*/<BR>#define
IER 1
/* Interrupt enable register
*/<BR>#define
IIR 2
/* Interrupt identification reg
*/<BR>#define
LCR 3
/* Line control register
*/<BR>#define
MCR 4
/* Modem control register
*/<BR>#define
LSR 5
/* Line status register
*/<BR>#define
MSR 6
/* Modem status register
*/<BR><BR>#define
SREG(x)
((unsigned)((unsigned)x + c->com_base))<BR><BR>/*
8259 Int controller registers
*/<BR><BR>#define
INTC_MASK
0x21 /* Interrupt controller
MASK reg */<BR>#define
INTC_EOI
0x20 /* Interrupt controller
EOI reg */<BR><BR><BR>#define
MAX_PORTS
2 /* # I/O
ports (DOS limit) */<BR>static int count =
0;<BR>static COM
com_list[MAX_PORTS]; /* I/O data structure
*/<BR><BR>static COM
*com1;
/* Pointers for interrupt actions */<BR>static
COM *com2;<BR>static COM
*com_xfer;
/* Transfer interrupt data structure
*/<BR><BR>COM *ser_init0(int
port,char *ibuf,int isize, char *obuf,int
osize);<BR>void ser_close0( COM *c
);<BR><BR><BR>void (_interrupt _far int_ser1)( void
); /* Int rtn for serial I/O COM 1
*/<BR>void (_interrupt _far int_ser2)( void
); /* Int rtn for serial I/O COM 2
*/<BR>void (_interrupt _far int_ser_sup)( void ); /*
Support int actions
*/<BR><BR>COM *ser_init( int
port,int baud,int bit,int parity,int isize,int osize
)<BR>{<BR> unsig
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -