|
#include "Include.h": V5 W' x( S: s3 p
7 o6 Z8 S. d( Q0 N. ?
unsigned char xdata uart_rx_buf[128];
P5 O: s, o$ x/ uunsigned char xdata uart_tx_buf[128];. n0 L5 Q1 y: A; m) x3 J
volatile UART_T xdata uart;! t6 s" z' G) M& D. k
unsigned char xdata uartGetBuf[8];
- y4 T8 E+ o9 A8 zunsigned char RxCmdPt,RxCmdTimeOut;8 w, E4 \( w; w& R
# c/ m+ B6 P K
static void Serial0(void)interrupt 4 using 1) O( k& @1 M" f4 u
{' Q8 l: ~* R* P. y6 Q' c, r
unsigned char temp,head;
- l/ I: [' w* s
6 n, z/ h( H) i3 D& M if(_testbit_(RI))
' n; h! _9 v P0 V, p {& B6 V& T! K9 u% k: q- M8 M6 P0 ]9 B. W% N
temp = SBUF;" w7 Q' K' Z3 Y7 b9 V2 a) ^. T
head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
& y* b) k% A+ i+ g! T if(head != uart.rx.tail)" j/ C; U- X- G% y' t; K
{
" C7 e1 C4 S7 X* h uart_rx_buf[uart.rx.head] = temp;
; A: E, ]! o+ t. P% z2 J uart.rx.head = head;
3 D; `" d1 B8 A# O- M: l0 |+ y }else( z* B8 P% H4 R5 @5 _% o% o
{
0 t( N+ D) M8 K uart.rx.error = 1;
7 ?, L' H9 T* L/ R F3 V }4 ]* m# e }0 ?- G7 ]2 t5 v
}
. q; [. @/ e7 S1 l4 B: c if(_testbit_(TI))
7 w( Z% G" ~+ l) I/ { {# ~" ~1 k$ g( j q" c' @1 G
if(uart.tx.head == uart.tx.tail)
4 v3 ^2 }3 U" e9 [7 ]/ R {2 j1 U9 p8 Q) U
uart.tx.busy = 0;2 V" N1 s b) L& `
}else; s, o8 d0 Y& ~- ^
{$ T w. \% L8 [2 Z' W
SBUF = uart_tx_buf[uart.tx.tail];
! S- `& H. w9 ~; z/ l7 _# y# c/ c uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));9 u! }: `' m* E$ x; _7 O/ x* y
}3 h, c2 ]9 J" P6 @: [
}
. E* Z: A% Z; F}
- n% Z/ W- U2 V9 O& \" r4 E8 B$ k8 n//函数 串口中断初始化
6 p& ]( L$ {; |: X0 Xextern void UartInit(void)2 d& Z/ X6 [7 U* R
{6 ]3 y0 {' T3 p O
RCAP2L = -(XTAL/32/BaudRate_9600);' U, w. @. v1 j
RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;* d0 Q0 p" l5 |, \; j# V0 A2 V+ n
" @- k9 L( A, j; z
T2CON = 0x34;
0 e( g& G% i! L% O6 Y! n SCON = 0x50;2 O! e' \/ c" k4 z% g' \& _
. S& y. M4 h: a
IP |= 0x10; //serial 0 high priority
u& ~$ M3 ~, y( C( {( n IE |= 0x10; //enable serial 0& M# A/ a3 R7 T
8 E) p+ b! Y; H& v3 I; |4 G
memset(&uart,0,sizeof(uart));/ E; t! H4 R: O
}/ n+ E8 y/ `- v* g
// put char8 ^0 {1 l, S1 H, U- z1 K
extern char Putchar(uchar c)7 D; W+ d* h6 w% F
{# r6 {3 h. O! G6 |$ S3 E0 K
unsigned char head;
: I. _) A' R# a- x+ i `) L/ H) y+ m. _4 D: z
head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
2 a( @* C0 d2 P/ D8 l uart_tx_buf[uart.tx.head] = c;9 ~. Y% U6 k9 X: ?: u% J2 G
uart.tx.head = head;
! N% s' o+ S, s; a6 l% }6 ?
3 w: O. c- d$ z1 U; p& o) Q0 N& F9 ] if(uart.tx.busy != 0x5a)
" h5 v' ?: {' G( w. P3 [) M {# j$ N' [ b; t3 n( |) C
uart.tx.busy = 0x5a;2 I6 `/ [ P { ^3 s5 B1 S5 p
TI = 1;
4 b7 L, v; Y; K8 ? }9 l# H! C' h+ ~7 u
return c;( R& \# W* Q: S5 I( `3 ]
}2 Z" \; z- j: g
//函数 判断串口是否有数据传进来& g8 S% _7 o- G! v1 v# F/ X1 W" r
// 如果有,进行接收数据
, }% }. H- z0 E) k$ P( B% Bextern uchar GetRxBufSize(void)
, e' p, ?- J# v9 c, {{
! M2 x) S' w+ P; U8 u unsigned char head;
' j2 }8 e h3 v+ ?0 D0 A$ T7 e. H3 S8 j0 l
head = uart.rx.head;
8 I$ s& z5 H/ g; o- X if(head < uart.rx.tail)
+ k4 d; a7 X( ?' Y8 |2 Z5 @ {$ l7 c1 P1 _. @! ]" |
return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
9 c# U, W# @9 F( h* }9 L }else1 |( W& E9 J* x& E
{
# q n3 ^1 a0 ?" o return (head - uart.rx.tail);( [2 T' Y& q( \5 y8 d8 m
}, N( B! V8 a9 l
}
$ N1 R- u; v: [//函数 从串口缓冲区取数据,只取前8个字节的数据
- {* O7 A$ R" S4 Dstatic void EnterRxCmdModeByPc(unsigned char c)
) E5 m6 k# x8 X) F2 b{( d' v* @1 J) P3 p/ j& T( ]
if(RxCmdPt < 8)$ [0 f5 C; e2 L0 b; i
{4 a: d' `( Z& q( u; P% Z
RxCmdTimeOut = 10;, ~2 ]0 q6 ]( ~; M W1 L4 Z2 Y* n3 c
uartGetBuf[RxCmdPt] = c;
7 F7 M! d# X/ a if(memcmp(uartGetBuf,Updat,3)==0)! x4 G) M' ^6 E% ?/ w" j
{
, o2 n! \+ \% u, o EnterIspMode();
8 J0 z9 a# B5 N5 ]* S2 Y9 B }% S( D6 j; S# s) ?0 y3 ~$ w6 d
RxCmdPt ++;6 c2 F T9 W6 C# T! B
}. Z* P) _- [- z+ a# X h4 i
}
A# @1 [; k& h7 ^! I- A//函数 取缓冲区中的数据
1 {: O9 q. v! O& S//返回
3 P9 p8 [" v2 }. R' ~, K8 Bextern uchar Getchar(void)- h: d3 h( A% n. \/ n
{7 L4 Z/ U& K. Q
unsigned char c;
; V) }( g2 c1 J% H1 r% R1 x+ l- R% l7 T0 J& N
c = uart_rx_buf[uart.rx.tail];1 Z2 O- y& O. v' b( Z2 W& j, `. ^
EnterRxCmdModeByPc(c);$ O7 g0 T+ O3 e- a1 C* g$ S; ]. x
uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
! F; |" P1 J3 R uart.rx.timeout = 100;
7 ?) V6 r( w" i6 |7 @. c return c;
- p' N1 E4 j3 q$ g}3 S. m, ^6 ^, Y4 r
//
5 Z9 }# M& Q2 r% T7 o( y+ Jextern void UartTimer(void)using 1: e$ |: B2 D, h+ T& j, ?
{0 M3 N8 \$ t( w: F
if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
* Q, c3 E' a4 ^ {
0 `1 e/ ^' s( W' _8 ^ uart.rx.error = 1;0 ~1 s' I5 L( C
}- k9 @4 }/ E) Q
}
% `6 U3 O- u* v+ |7 ?# C//
2 F- a* C1 Y' ], i8 ]) Xextern void ClearRxCmdPt(void)
: T& e5 b( d+ H0 b3 d7 C{
3 V$ c" a: e2 u6 d if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
6 H" T$ d) e2 L3 I {
: X/ q0 c2 I2 A7 ]$ j( F9 x4 C! @ RxCmdPt = 0;
2 \9 T, G& e" D }/ M8 v$ M& a: r" d1 d$ G
} |
|