|
#include "Include.h"$ S4 v9 d3 z: S
& \. O$ H. x4 t0 v2 B
unsigned char xdata uart_rx_buf[128];: h+ t+ q# ~& `4 I4 @
unsigned char xdata uart_tx_buf[128];
. ]/ h( Z5 w! z3 avolatile UART_T xdata uart;
0 j# G0 k% p" Aunsigned char xdata uartGetBuf[8];) R ]; a) P! ]8 n6 }: A
unsigned char RxCmdPt,RxCmdTimeOut;
* S6 p: T' l `6 ~1 P5 n& a9 q
" o: _- E2 _1 L" O' \static void Serial0(void)interrupt 4 using 1- I/ x) q; N# ] f' {6 D$ ?: c
{2 U( n, E+ F$ A% `7 y) a* S3 Q" ?- ~: u
unsigned char temp,head;
$ ~1 ?# ?! X: v# A- G% @# u- m
4 J2 b8 w: O" D- Q8 Z if(_testbit_(RI))
9 ^7 i6 |- \6 g: [' O {
5 _7 _& W+ Q( {: t: ^( g* @ temp = SBUF;& k1 K1 ]# @4 _1 b S$ V
head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
6 R" H5 Y+ q6 F& O$ g+ b if(head != uart.rx.tail)9 w! N1 }+ h. a. r' X( [
{
& }. m* D3 Y7 p- Q% L. R# W6 W# O uart_rx_buf[uart.rx.head] = temp;; s9 y# {# l n- O9 W/ d
uart.rx.head = head;
' L8 B. k2 H8 N: G; m }else
5 a' D- b' B: j; E$ _/ J M {
2 ~" Z6 ~9 o& T, a5 @& q uart.rx.error = 1;- ^% H: T& M3 U& r' u. u+ w
}
1 w/ |2 l# k" v3 B }
5 m- W' n) s0 C9 W. F if(_testbit_(TI))
! M) b9 G8 ^$ x {- n! @* D4 ~ q$ n& a2 w
if(uart.tx.head == uart.tx.tail)
' p* w$ T% ~. ~, P. s, W' Y {: d! y* S8 I/ y9 G! c" |
uart.tx.busy = 0;
* ~7 s6 E" V8 ~& g% x' c0 @ }else, A" Y& J/ Q% _/ f
{3 N, X- M8 U. { e
SBUF = uart_tx_buf[uart.tx.tail];$ T& x6 d/ u! b: B; c) y0 l5 I) n I, x
uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
* l! f. {& L4 z' m5 w& k3 Q% Y }( t: V' X% ^& q; M2 {
}- c$ V& [# ^: l9 O5 x' I0 B
}' @- q: w7 R! l/ w
//函数 串口中断初始化
- \' }3 {5 _+ Z* b a6 A+ Sextern void UartInit(void)$ w; e& p7 [& g. a5 D
{
0 _) ]* d3 Z8 _! c! L4 p RCAP2L = -(XTAL/32/BaudRate_9600);
7 i9 @- [2 G4 b6 d& ~, p" ?, F RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
0 M% M% J L, s
4 o- N# R4 H% V' H T2CON = 0x34;/ W/ F% h; ~8 p' D i2 ^
SCON = 0x50;/ F' d; {6 o6 ~, W
3 O* Y" T) D2 @* X, c/ d4 E IP |= 0x10; //serial 0 high priority
8 B, R* w$ F( L6 U! G6 ^: j IE |= 0x10; //enable serial 0' Z- _ Z+ |: K4 B- S/ k
' I0 W1 O% m; _$ j8 R
memset(&uart,0,sizeof(uart));
7 t- z: e- H. ?, @' }0 A}
) _7 M4 E* h8 R: e. u0 k; t// put char
! t0 u: o4 Q: x. Zextern char Putchar(uchar c)
2 C3 g7 ?# e/ r& q{1 I7 N) z# X+ ^" v, O/ d/ m) b7 k6 V* O
unsigned char head;- Y; v: i& @% q/ S
, C6 @) w( q2 L+ l
head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));/ i6 m* w6 m* _& V# V6 j
uart_tx_buf[uart.tx.head] = c;
5 h R; F) K A1 d( p uart.tx.head = head;
9 d; z" K9 _0 B! V, K5 ?
6 g( a* E+ C0 e# z { if(uart.tx.busy != 0x5a)% e) l. _' G# S4 I
{
& H% o5 `, p, o0 u; r# \ uart.tx.busy = 0x5a;1 d$ O& g4 J( O- d) C
TI = 1;
! I( K1 O+ f+ a0 h7 x6 E1 P }, w! w) T- S8 |+ L2 A
return c;
0 ^* r5 w" o- O; I) h}
& C; R- t' D9 |1 K- {, m6 \. y//函数 判断串口是否有数据传进来
! D5 g8 J' |7 S6 N// 如果有,进行接收数据
8 o. I9 ]5 H$ ]6 Cextern uchar GetRxBufSize(void)
& n: @. j% Q" s0 T{
) i: g# P; x1 f$ v' y0 P; W unsigned char head;9 a& A0 d; O# ]$ C: `
) l9 I G9 q* W7 w, o: ~( H
head = uart.rx.head;
6 s! g5 s9 w' \% b" U) \" J if(head < uart.rx.tail)! \9 p% `/ Z3 c6 Z7 b% M+ v
{
7 X9 o$ J* G3 E& }; H return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
' ~3 d7 j! P% B1 h& o" B }else
Q( |6 r7 e( b& y! Q3 g {$ e) |9 k6 k2 b" f5 y4 E* I' E
return (head - uart.rx.tail);+ F" a4 P4 P1 P
}
# W" B g2 ?0 K: q9 ?}/ }' Z" X! s# S. M; Q- u* `
//函数 从串口缓冲区取数据,只取前8个字节的数据
2 L* k; T, u' n# bstatic void EnterRxCmdModeByPc(unsigned char c)! L/ ^ x4 y- J- D5 z3 L2 V
{
9 w% y2 n' M z& }6 x9 L1 n3 U! p# M if(RxCmdPt < 8)
9 X6 [, U3 C, W0 B; U {( S4 S+ N/ @0 M1 }8 U7 M- p# k
RxCmdTimeOut = 10;! q! l9 N5 g2 n( [7 H: ~
uartGetBuf[RxCmdPt] = c;" h, ?8 S: c) q0 @
if(memcmp(uartGetBuf,Updat,3)==0) t8 V2 C' ]" ~$ r/ r5 e
{1 w5 `7 Z j" D$ h1 K
EnterIspMode();6 g# m- W" p4 S/ q
}( ?2 [. R, [4 B, M+ N% ~. ^
RxCmdPt ++;
( K9 d. `( K/ |. |# s }7 o! _* Q4 U, w$ g$ s
} w8 `8 V& H+ H o t/ P0 I
//函数 取缓冲区中的数据
- y3 d- a) a2 z//返回& u$ b a9 v! z P" G4 I
extern uchar Getchar(void)
0 L* J; [5 @1 L$ B+ a5 d! P{
! Q* }7 [& r. I. N0 e unsigned char c;) s7 J! `! f* l2 i: M, ~
- c/ A& M6 X: T c = uart_rx_buf[uart.rx.tail];" K: h" B$ a, o$ g
EnterRxCmdModeByPc(c);; ]: {( N6 `8 j$ w" F
uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));' S( l7 r. W+ W6 x+ d
uart.rx.timeout = 100;( }' P( V% F& S
return c;
, R5 i8 l p- i; u}
* s- n7 u# p- z5 r//! J: M- N6 ~6 O0 `, D: s/ d4 @
extern void UartTimer(void)using 14 E! B& E! A9 c+ V. I
{
: G, Z$ S6 l8 l; V if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
8 ]1 L: ]" \ N9 p {
5 Q8 j4 O: q' m# z% ]( \( u. G uart.rx.error = 1;6 W/ J$ L& g" B$ x" a! _) n! A
}
! i8 n3 Y" ^& I0 x; j: ^}
5 {* ]# h: k+ a8 t' f//* v, S: x% \( j% D
extern void ClearRxCmdPt(void)
0 d4 w+ S- m8 i ?% G2 n{: y, e- R: C" t1 N e0 U& I
if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
3 _* ` E9 C( u/ @0 `: a* M2 \- A {
- l N" k$ b+ J9 H# y RxCmdPt = 0;
6 J( \! S5 k. X# Q0 r }, P( r4 ]6 Y( M+ q
} |
|