|
#include "Include.h"5 J1 e3 R* l& w2 ~
: |* m, [7 e6 {0 B) `5 z
unsigned char xdata uart_rx_buf[128];
% e9 S" N1 ^) B3 C# q9 Y2 Y7 yunsigned char xdata uart_tx_buf[128];3 A/ u6 I) i& ~- u
volatile UART_T xdata uart;
1 Z9 v; T! h6 k' D' M5 t; ~: S& bunsigned char xdata uartGetBuf[8];! o3 T: _9 }1 G1 d* l$ x
unsigned char RxCmdPt,RxCmdTimeOut;# g& E3 B v- S" X
6 H3 H" N7 A5 I( |- _7 e" v/ G2 gstatic void Serial0(void)interrupt 4 using 1
) M- O0 }3 P o{: N5 s' j+ u: r5 a$ b
unsigned char temp,head;+ Y1 G& r1 ^ l- Y! a+ w* y
* ^' ]( a/ @- I) W8 s) w# n( F if(_testbit_(RI))
# t7 G6 q! E- K7 I5 Q {
+ Y% Z! s1 t( R7 F( R temp = SBUF;
, p3 T2 G9 J _: N head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
* L1 S+ w$ k- d if(head != uart.rx.tail)
. Q0 A) T- b: a7 U {3 ^+ z8 x5 e$ M C
uart_rx_buf[uart.rx.head] = temp;
+ R5 S7 V/ H' Q6 L5 G% ^ uart.rx.head = head;
+ w* D- @; c+ j2 U8 G }else
4 o9 n& x# Z% s0 l; R: @5 r" m2 A {0 l ~- `3 L' C/ L0 u
uart.rx.error = 1;
6 D' b1 u4 y$ Y+ I6 ] }3 u, S4 p0 b# D& Y5 S
}, B7 Z$ Z( |# S: k, }* Z5 @
if(_testbit_(TI))
) U% j' s0 c6 Y% n {/ j2 k" f+ |. g+ D% X& O6 N
if(uart.tx.head == uart.tx.tail)4 m9 _# W# h9 F2 ]6 Q
{
) Q3 N& D- F. n6 ~$ F uart.tx.busy = 0;
( m" y& k) S- Y7 F) { }else
. T4 W" i% v* N5 K$ F+ J% q {& L; U$ Z z2 a3 p( U5 [# T
SBUF = uart_tx_buf[uart.tx.tail];+ H! N% J! c5 }
uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));1 k7 F5 G k1 V, a4 O
}
! d( o! e: [/ i- _$ N }
3 Z, s# e9 h5 l2 G7 m; t}. C" M2 h5 H$ ?. `- }
//函数 串口中断初始化( |$ g' }6 Q g. C8 p! k
extern void UartInit(void)7 b" z# `" U) I3 O" [: u: s1 E, D( M
{
% m$ y' m0 N0 ^2 M RCAP2L = -(XTAL/32/BaudRate_9600);& F3 I m% W+ X
RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;& Z7 n# k8 L5 K4 T0 t9 K
# o2 K. W* ^9 u- w3 ~* P0 T T2CON = 0x34;
% {6 S7 C' T5 s& G7 w( Z) e+ s SCON = 0x50;; Q, u: L4 z( d5 D5 `
$ A/ j# @' F' ^2 f2 W
IP |= 0x10; //serial 0 high priority
, @ C2 K& D, N2 f% @( y8 Y IE |= 0x10; //enable serial 0, T; l& ]5 j+ D$ z6 `+ u, o
& U: q5 s+ p, z7 o( v memset(&uart,0,sizeof(uart));
3 B$ R i4 B p) ?5 a# R}
+ S+ A W: s8 m4 t8 q- N; I* V// put char/ C6 f' w+ `& W! G5 B; ~
extern char Putchar(uchar c)9 y0 d( f2 c8 L5 y7 K3 Q: ^
{
" j1 X+ e) m$ f2 w/ B unsigned char head;
& ?- m; j4 q7 f6 ?% }- V+ w$ e) P9 J0 U+ r6 ^8 q/ k
head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));% l4 I7 \; `! U
uart_tx_buf[uart.tx.head] = c;
$ n6 _/ L* I% K, ~: ^ b# b uart.tx.head = head;
0 V) K" W: _4 ?" E8 D+ n% t1 ]+ i* J5 M
if(uart.tx.busy != 0x5a)
; U9 h% v7 @1 s {
+ d. w# F$ \' o, G0 _ uart.tx.busy = 0x5a;
, g$ Z+ b' ]" @5 |; ? TI = 1;
3 d4 ?' c' t$ V. x# O }
2 c' f, \6 H, A% ` return c;
1 Z1 _: @6 D1 V6 L}
' \$ c; N' D& v# \, O//函数 判断串口是否有数据传进来
5 |2 [, }4 V/ C u+ X// 如果有,进行接收数据
+ {6 {% Z" A, ]) U; b- J) Cextern uchar GetRxBufSize(void)
5 _# l+ b* s) ^/ b{
$ e+ |& }& U T9 S0 U unsigned char head;7 V. |, N: D! r- C( V5 M3 t
- n# L1 h$ Q5 `$ f( r$ e3 I; D head = uart.rx.head;
3 B" {6 }# s- u& l/ l O if(head < uart.rx.tail)/ D( ]! W: ?4 y3 I& @ F6 o' u
{9 R) `4 U w( ^& q
return (sizeof(uart_rx_buf) - (uart.rx.tail - head));6 [ m3 T ^# s: H! ~+ Z+ S
}else+ M" e9 `& v( ]' Z3 H. n
{
1 L- V8 E% x8 X3 u* Z4 t( O$ M return (head - uart.rx.tail);; b$ z6 g! Q; U5 H. @; l, }! U
}' s0 [) v4 L7 B1 N3 J: X' J
}
! C: V, f3 ?: K& O1 c//函数 从串口缓冲区取数据,只取前8个字节的数据" F+ B2 C2 j1 H6 a0 |# e
static void EnterRxCmdModeByPc(unsigned char c)2 m* D3 t9 e+ }8 G+ s1 q [9 b
{# i X( K0 O' ~* k0 H+ R
if(RxCmdPt < 8)
: d2 O- ~7 M8 V& v {, ]- z/ H* }' G1 A4 V% c+ x* K
RxCmdTimeOut = 10;; h; L" k4 {) y1 L) y4 {9 O
uartGetBuf[RxCmdPt] = c;9 H* d. [3 [ q5 x( A
if(memcmp(uartGetBuf,Updat,3)==0)
% I* G. |$ ?+ s3 a* g {3 f7 N9 o+ H# q8 s. G0 m
EnterIspMode();
2 p! o3 d9 u( [3 a; I3 r$ C; W }
2 ]- N M; U' g! d4 N$ | G* b2 m/ n RxCmdPt ++;4 Y3 @9 C. d6 a6 D- f
}
K" c$ D- B1 L3 O. `# [}: I8 u6 u7 u9 d+ a# v$ C0 d
//函数 取缓冲区中的数据
3 A% \& U3 N q7 @4 i- a$ W" `" N//返回4 O* [5 @" T& g* c" n* I
extern uchar Getchar(void)
% m7 |( A- v8 s [{0 [: R% t* G( I& |) i! H2 t& F o5 U
unsigned char c;
/ M7 Q B( a& ^/ P) M% S8 I# b* [: M+ N. k! @# `) y! x, m$ k. F5 Z
c = uart_rx_buf[uart.rx.tail];3 }0 j: O0 T8 K0 l; u) i! D' D# T
EnterRxCmdModeByPc(c);% ^1 W( w) N6 _3 \% a5 |! ?
uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
$ [$ u6 ~9 |% B7 {2 a+ V1 E; T4 a uart.rx.timeout = 100;7 ^, c3 G6 E. z& p V0 U
return c;
7 M: `% N. E; _) T/ \}4 B8 b5 n. d5 d
//
% h( `; h) C+ @4 H* K& jextern void UartTimer(void)using 1 F+ s: E6 W! x3 c
{
# W! R) y( u! Y; G" v M if((uart.rx.timeout)&&(--uart.rx.timeout == 0))# e+ F$ {, M: S) ~# S# t3 N4 Y& D
{
- {+ y9 E! h' A3 ?9 F% ^ uart.rx.error = 1;
! C& Y& ?7 r: L, h( ? }1 `+ F/ ?4 ?- o. h5 X6 ?8 {: r7 \7 ]
}
& S8 C9 F2 p, H( U//, n: S1 K: c/ a4 f: I! `
extern void ClearRxCmdPt(void); r- r$ g$ t4 m' W
{# n1 I- Z m' l [- C1 p
if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
; h( {9 i' ~4 j6 S* t {
) O2 f2 c; \4 F& V% ` RxCmdPt = 0;
2 A1 `2 O0 K3 f( U& j& S4 I }, P. G8 I0 ?$ s& i+ l3 m
} |
|