|
#include "Include.h"
' q' x# N4 \6 m( s3 q1 g! N
3 I7 ~8 q N3 N/ [9 i9 c" X9 F0 |unsigned char xdata uart_rx_buf[128];
G$ }$ {* Q" m% Nunsigned char xdata uart_tx_buf[128];
5 c! v- Z5 _( t6 r, z/ X, V& avolatile UART_T xdata uart;
2 Y: U3 B& }: {( b2 ounsigned char xdata uartGetBuf[8];
M7 v- M+ n# w6 N: l" dunsigned char RxCmdPt,RxCmdTimeOut;+ a( ?6 t, h( f& a$ ]# K
! e: g: p; P( {& z, U) Ustatic void Serial0(void)interrupt 4 using 1
' `7 p$ V5 T5 O7 r, V6 I) S{! ?0 i5 A* |; g+ R
unsigned char temp,head;. B3 n& [ }2 \- |' Y
3 x& G2 S8 Y- X$ N
if(_testbit_(RI))
% S3 F# [: n+ L& c1 {$ v {
7 x7 y+ m8 w( ? temp = SBUF;: Y) U) V2 R1 D2 ~* Q! m
head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
: ]+ k! k+ E+ F# I if(head != uart.rx.tail)* R$ K% h5 h6 I( T: D0 G. M: X! |# b" m
{
6 [7 l, L" X2 b7 }; }3 } uart_rx_buf[uart.rx.head] = temp;
) u& U7 j3 ]* o# n& a8 i uart.rx.head = head;( V! N3 K1 y* ^/ B# C5 C' `
}else+ h" T5 R; v4 C! B) s5 g5 k1 W- Y
{% ^9 s2 U% U% T1 R: E9 t, d( Q! N
uart.rx.error = 1;3 F, [9 S$ i3 H0 c
}4 U2 u& Q) i1 H& |- t2 m
}
% o4 X f. `5 X1 H4 E% x- D. |( R if(_testbit_(TI))' p: T% D- E! _& \: [/ V+ l
{. v& Y. D) j: Z% N' n+ U( v& y. V# m
if(uart.tx.head == uart.tx.tail)
0 W0 e/ f& b9 l/ T# P- i {. I x% F& r/ p; e& t5 w
uart.tx.busy = 0;
' p4 V. p% `4 w" \ }else" V& R: K9 q7 A% e1 d U: Z% K& t3 c
{) U- y- g. |& p$ H
SBUF = uart_tx_buf[uart.tx.tail];( |0 d P3 |& b1 d# A9 v
uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
4 v) u+ H, C9 P: R# ?, x7 I }5 z: X( n8 _" d8 S7 e- U. s/ u3 [1 \
}
7 x6 c1 { v1 f}& R2 h1 h+ d& I
//函数 串口中断初始化* r& ~+ {3 B& e! h; i2 u
extern void UartInit(void)
9 O& G9 e. n3 V- O$ ~- k{3 I0 W. H4 _5 k( q
RCAP2L = -(XTAL/32/BaudRate_9600);, Q8 B5 A0 q0 w$ `+ Q* K. r
RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
2 Y3 U, o1 M/ `4 o" T: R( |) G8 _% ~, B' D8 C/ R- z; ?# J: P
T2CON = 0x34;( O# B: h; G& Q. X, I
SCON = 0x50;5 i/ }- \3 C2 J% P
6 X3 |4 w# X0 U- L+ i IP |= 0x10; //serial 0 high priority
4 o! J7 p! E* Q IE |= 0x10; //enable serial 0- P- C3 \1 ?( e0 }
, f1 A" x* t) g( U# f0 l( b1 w& s memset(&uart,0,sizeof(uart));
* B0 R+ _- f C}
( s' U; o, J9 t& J; X, j+ X7 f// put char
& v5 c/ X8 }/ c1 Kextern char Putchar(uchar c)* k2 f9 C5 V. m0 E" i+ f
{
: V% |+ r( W/ c& u) r3 o! y* Q& | unsigned char head;, S0 @: ]2 i- |
! B; V% C2 k8 y, z
head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
1 b7 B6 e0 n2 m8 b! g9 t' t$ S uart_tx_buf[uart.tx.head] = c;2 d0 K% m+ q5 s. M- U; S5 Q$ p% l3 ?
uart.tx.head = head;& I; |6 J. Y& H# B- |2 G
- y7 u1 B! I( K! W; u' {0 j* |* e# X
if(uart.tx.busy != 0x5a)+ X, J/ G" c! y6 s
{
& b( Z' J- Y5 X! o1 [2 [ uart.tx.busy = 0x5a;
% |1 x9 }& U( o: G2 j {0 T TI = 1;
( S5 t0 ^) C2 F& Q. B2 Q- R6 Y }
" z' c8 _, E8 ]- V* p, T return c;
! f9 w- O2 K, v: d/ H}0 D1 x" l2 [0 D
//函数 判断串口是否有数据传进来
0 X% ~. C, h" G" e9 M% V) R" q// 如果有,进行接收数据- T- P% a1 `8 y9 J
extern uchar GetRxBufSize(void)
7 n+ { w* e% r1 ~ P" T2 |{5 ?4 c7 X: E& L: l# a. d
unsigned char head;+ F, m0 g! K0 Y
- a5 B5 F1 r* G+ o: \ head = uart.rx.head;
0 m6 n/ G& W( W% }" L" r) P2 X if(head < uart.rx.tail)
" k3 d& K5 G9 ^% u; D2 _ {# E3 Z9 ?& D# F5 ~2 g- J8 Y2 q1 [9 c
return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
' @- H% i' w) P( Z5 Y }else3 l5 v9 W5 {" u# f3 K4 F2 q4 ]
{
; p$ p% [/ ^3 j$ L return (head - uart.rx.tail);
0 ^% U. A% K3 l }
1 r. G1 D- h& p) @4 [+ e% Z9 A1 N}
4 I) v- I! }8 _//函数 从串口缓冲区取数据,只取前8个字节的数据
: q" Q7 W% J% `* \static void EnterRxCmdModeByPc(unsigned char c)( K4 `8 b; H; e" |/ M
{
) o' m3 d" u% c- H if(RxCmdPt < 8)
# U/ K; h( g ]( D9 O0 H; D9 S) B7 @ {
; k- Q9 ~8 J) Z4 _0 R) F* w+ p. z5 w RxCmdTimeOut = 10;
% z4 p% |8 a" G3 T# w uartGetBuf[RxCmdPt] = c;2 K( o% l9 T* d; S5 G+ }" m+ L8 c
if(memcmp(uartGetBuf,Updat,3)==0)5 \ o- M% f( Z" s0 a: W
{, U; F: H7 c9 d8 {/ v( x
EnterIspMode();
) X* a* ` E% K2 } }
8 r+ Q2 d i0 D8 d9 f/ d3 k RxCmdPt ++;
7 Y5 m1 K' M- h$ w }
( X! I+ C% S) T" M}) `5 R5 A! t1 L. D! k
//函数 取缓冲区中的数据
; Z% _: r2 `! z9 f//返回; q- w8 S4 n$ h$ t
extern uchar Getchar(void)% x; K5 h& a# z
{
5 v0 n m: [/ Y4 b5 ?' y$ B, V unsigned char c;7 b/ k2 m% i4 f% t% p
1 _1 s1 ~, r- @5 U: `! ^% G6 l
c = uart_rx_buf[uart.rx.tail];
& |8 D! c* s n0 U: A8 E EnterRxCmdModeByPc(c);& ?6 O, W% N# j" X- p/ s f
uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));# |% y* O/ d5 K# ~1 I. z* f6 f, p7 B
uart.rx.timeout = 100;+ e; v# |& K3 \3 v4 p
return c;
: l2 I* g$ G# m& \+ E9 Y}
: ?4 z- X8 ~% i- j//, l: |* c6 |9 Q, g
extern void UartTimer(void)using 1
7 J& Q9 A; ]$ T# L/ k{4 v& C7 I7 M# o
if((uart.rx.timeout)&&(--uart.rx.timeout == 0))* B+ w/ ?+ d; E% c: u" v
{# S- d- u& k+ g1 Z6 v' P" h! T; u
uart.rx.error = 1;
2 d \5 ], L( @8 Z" f- L& g8 q }. S+ l2 \, Q. _9 _# g5 ]
}
) R8 _/ \; ~0 I& R8 g' {- [% u//
$ m8 E& M' U- G( m$ nextern void ClearRxCmdPt(void)1 n; n5 b5 z" L. r6 h6 W, Z' _
{
' D/ @5 \# M7 M- N7 p if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
6 }" P0 ]+ z7 a* } V1 g7 b {
( n* ^! C* O5 O r RxCmdPt = 0;/ }1 t7 _; ?- O& q7 K
}
! `) X. ~+ ~& N/ }! `. [} |
|