|
#include "Include.h"& i) L% \* {: ?1 H
4 W* ]+ q0 N, v
unsigned char xdata uart_rx_buf[128];+ w5 W4 B) i0 }' y
unsigned char xdata uart_tx_buf[128];
: Z/ K2 J, _# Z, Cvolatile UART_T xdata uart;. P# R$ n; }: ~, r7 {
unsigned char xdata uartGetBuf[8];# M1 D6 o2 u0 e7 e& h
unsigned char RxCmdPt,RxCmdTimeOut;" y" n: S. Z# x9 t& T3 @
, l$ B. E( ?0 S" h; K
static void Serial0(void)interrupt 4 using 1
- q G" ?" j# o{2 d& J% m9 g8 e$ x$ V; `% N% B
unsigned char temp,head;
2 j3 D. K$ m0 }. S- k o, r$ j! H3 ^/ f2 |- ]; p" U. d: l
if(_testbit_(RI)); p& d- P" k4 B" G, h b
{
8 P4 W2 |9 ^, u" Q; s temp = SBUF;" l* W- Y2 Z. r$ w3 V9 ^
head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));8 e* N& g- z6 N% O8 @; d
if(head != uart.rx.tail)
2 `% r2 B2 Y) Y: i x- }6 X {7 e4 N; o0 I( p& K' h7 O i
uart_rx_buf[uart.rx.head] = temp;
) o& Z* `0 _" }% a% ~9 N uart.rx.head = head;
; x1 }4 K: u# h. e }else
: h& T5 J0 L9 }2 M {2 {# Z8 s& |+ h+ k* c0 U& L
uart.rx.error = 1;
# g$ j/ T6 m. W }5 V" e) r- ]+ f( I% U2 {
}9 x! _" J: m/ H
if(_testbit_(TI))5 D& a6 G) h3 y- C# C
{& Q9 [4 n' Z4 O' ~1 k
if(uart.tx.head == uart.tx.tail)
9 L4 a& G V7 u% N0 r8 a: |+ [2 v {8 n2 T6 M% l2 ~# h; B* c
uart.tx.busy = 0;
! r- ^+ ]) \ [! E( N7 A. C }else
. P2 S" q B# Z7 f {
: A I, ~% P$ `/ y; E SBUF = uart_tx_buf[uart.tx.tail];, @. c$ J% S1 y) I" U; |1 N) y
uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));# R3 H5 [5 @$ _% H
}# d* W5 [( X: V. w5 m
}
$ m) Q6 P; b3 K6 K; j" ]6 s}4 |) M$ B& I+ K
//函数 串口中断初始化, X4 X3 V3 Z3 ]
extern void UartInit(void)
2 H$ H( T' p+ a8 a. h' G q{% F9 O6 _! I' v }( L: U; g, n
RCAP2L = -(XTAL/32/BaudRate_9600);
9 s) K c) s+ G9 ?$ p6 h0 e RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
/ l/ @3 b6 g0 q
7 A/ T+ C; ^1 P+ u& y T2CON = 0x34;$ J. K) _7 C, d
SCON = 0x50;
" I; U1 n# z7 [3 n" |- a; [2 { N& b. L) {
IP |= 0x10; //serial 0 high priority
! W( G3 Z( b0 b I) f9 y3 f/ f IE |= 0x10; //enable serial 0
+ B8 y" y q) Y3 Y( {: Q1 ?* p3 ^7 ?" ?5 p2 o. `& }
memset(&uart,0,sizeof(uart));# j# o6 Y, ^6 n5 ~7 {
}
. L( j7 D( {% z* u// put char
- ~5 I( q5 m- N1 T4 W, c& Fextern char Putchar(uchar c)
X8 `+ ], m0 o{
% e/ C" t" O2 w unsigned char head;
/ I ?; h, s3 ]/ c, N, c6 F( Z2 d, z% o
head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));* z1 q* S6 N5 n6 B8 Z7 k$ s
uart_tx_buf[uart.tx.head] = c;2 t5 ^# o$ h' z# Q
uart.tx.head = head;; G4 O$ F) m$ ~8 L$ L, G
! Y5 T7 t6 o2 h6 W. L: b
if(uart.tx.busy != 0x5a)" O5 q2 L2 g6 n" @: q- R! I
{
# e" Z# m; t( i5 x. n uart.tx.busy = 0x5a;
* f! e; u, d- E( K* @1 b TI = 1;
% ?( ~) r% i. g1 T6 ` }
8 r7 G* D" W& Y' l( b' M% V+ |5 L) S return c;9 m0 p) T0 L6 l. n1 i* s: o
}
* d7 ?4 q8 J0 L) {+ \, I7 z1 h//函数 判断串口是否有数据传进来
1 _" y5 t) S2 x0 ]// 如果有,进行接收数据
K1 I* B/ ]4 N+ N8 I% Dextern uchar GetRxBufSize(void)
% |/ x- k% @/ y) c+ b. X: c; C{3 H: O, q$ P9 Z8 U
unsigned char head;) u M% m) m' L' V
# t, O$ k0 K# Y Z8 `; ~' ?# k
head = uart.rx.head;
/ W' I: w" T% n+ y" y! R3 j if(head < uart.rx.tail)
- B) [, N+ B) \9 w5 [ {
+ F- d$ d L5 H4 p return (sizeof(uart_rx_buf) - (uart.rx.tail - head)); r8 F' }' L6 M9 M9 \) A/ z3 v
}else
2 M% u( `' z: J; H4 J {1 T& O" _ r$ k3 p1 H
return (head - uart.rx.tail);2 b3 F2 N- h! i% V
}" e" [' A O" B4 `9 H% x. \
}0 {/ d1 z. P, P
//函数 从串口缓冲区取数据,只取前8个字节的数据
( W5 o/ j* t9 ystatic void EnterRxCmdModeByPc(unsigned char c)
( P x* [$ c4 ]2 ^* P4 @{
+ H+ v% p" x1 o: ] if(RxCmdPt < 8), z; M( ~: j8 G+ \8 _
{8 j) j2 i3 J( q' J9 ]
RxCmdTimeOut = 10;
- f' } M3 ~) @- _ uartGetBuf[RxCmdPt] = c;. l0 m) K3 `. {# @7 g5 Z5 C
if(memcmp(uartGetBuf,Updat,3)==0)
j: z6 A* R4 x& e' g( J7 Z3 H {
0 Z# R& h) |3 G ?' `5 S EnterIspMode();( E% y& j- g5 x/ k
}4 Y1 O- R/ C, a5 c& J9 {
RxCmdPt ++;" `6 O- ?& `& P% A. L
}6 y# p# ?1 n/ t& I$ [$ [4 A3 w4 P
}
) n+ F+ Q- k" j2 _1 d+ w//函数 取缓冲区中的数据
2 Q- i- k# H% q8 {//返回
1 U8 ^& p1 ~; c& M& Zextern uchar Getchar(void)
6 p# C; h( |8 Q- y{
. N7 M% B5 L% b+ G9 [! }" l: U unsigned char c;
0 ]) Y! C" d3 j
0 T% Y# I5 e. r4 L8 |: t c = uart_rx_buf[uart.rx.tail];
* J1 d3 N9 v- Y' _ EnterRxCmdModeByPc(c);
5 G* g$ Q7 p* S4 M$ q uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf)); \; g8 W/ e. j! |; ~
uart.rx.timeout = 100; W( Y4 k9 Q: q6 j
return c;
6 p$ o! ~! `1 m {9 n. Q8 Q6 Q}
' e' [3 d. D7 V) S/ T//5 G6 V3 q5 Y* Y/ G y3 U
extern void UartTimer(void)using 1
+ T' n7 @7 p g. q7 T{
. s7 f! \/ E j; z. z" ]2 k if((uart.rx.timeout)&&(--uart.rx.timeout == 0))* E: y5 Q6 M4 M) n8 K; z- Q
{
8 P* b @5 U5 M8 Z( K: T: S uart.rx.error = 1;6 n5 U1 M$ j# i5 Y# x6 z$ x
}
+ ?! J& p% S& j' q* S4 R @}
% z5 ^* N3 [' I, x/ a//
- e' y" X( A0 O. m! sextern void ClearRxCmdPt(void)
4 n! a2 I8 B9 a{+ ^$ P# Z0 ?6 K1 \
if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))3 L* g7 t; W8 l
{
3 v, G: C9 f n" ^0 L, | b# N- _ RxCmdPt = 0;
. u( z) k% D h0 x! f }' i2 x8 u4 {! C, l7 _5 D: a
} |
|