|
#include "Include.h"
0 k, v9 g. F3 g# M" Q, l' p O5 ^/ X, S+ F
unsigned char xdata uart_rx_buf[128];
9 n/ O- h. `+ J8 |, ounsigned char xdata uart_tx_buf[128];
; l4 y2 |9 d) Y) p* M! ?0 [2 Mvolatile UART_T xdata uart; u5 v1 e. a+ h* p! n
unsigned char xdata uartGetBuf[8];
: \9 S) f7 b% O3 Kunsigned char RxCmdPt,RxCmdTimeOut;
: C K1 R6 r9 E3 R7 ]( n) t/ p5 {- u
static void Serial0(void)interrupt 4 using 1+ E( A2 @" a, |
{: k& [3 F5 A4 K9 P/ V. R# J. e
unsigned char temp,head;
8 @4 B# m# {: V5 d& o4 G
7 l |4 k& k* t if(_testbit_(RI))$ ~' }% Q3 L* j9 W { S
{3 `. Q; l/ H( _7 T' O) D8 L. d
temp = SBUF;
: G( V: j0 F9 T% B) f+ r9 R+ f head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));/ z! | }; P( y. }
if(head != uart.rx.tail) u' z# }1 W0 w) F8 C! T# x
{! S# g6 Q. d! g y& ^
uart_rx_buf[uart.rx.head] = temp;
! Q$ R* y+ ^4 Y5 f: I# W uart.rx.head = head;3 \: x' R' K- O6 H$ A/ O1 n6 g2 c
}else
7 A8 `! D3 F9 E! f+ ] {8 v/ h/ V* b7 b U% q) t0 s; A e
uart.rx.error = 1;4 d8 M/ n+ y0 \7 | z# y4 [* T
}
" h! [7 @* W: k* {+ x* P- b+ A } _* X9 X; p% j% j: C
if(_testbit_(TI))' M- D% a7 {& X" S* J) I! R. |1 \
{
8 c4 u+ ]& I! ~6 U2 Z* u# m% h$ m if(uart.tx.head == uart.tx.tail)
) `, O( d% f9 c# w1 ^) i5 \ {
9 c$ j* k3 Q) ~6 } uart.tx.busy = 0;2 f2 m# a( ?! T) I
}else
" ^5 ]" Q5 {' R' L) c {
) b ^# W. B% [5 S SBUF = uart_tx_buf[uart.tx.tail];
( a& o* D9 n# s% G C# ] uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));6 O, ?& f- @3 D- F8 y7 y
}
/ o2 l N, b, @- S8 h4 }# Q }
& M5 J: H6 N, Y$ a6 ]}
# Z p( c* ^. S" O& q//函数 串口中断初始化
W/ \8 |, q1 E, Vextern void UartInit(void)8 Q4 c$ Z; u; F
{
# |1 v0 ^7 x- S. y4 c- D- C RCAP2L = -(XTAL/32/BaudRate_9600);. j3 o9 A7 C. I% ~$ R
RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
# {4 g# Q0 G! v6 v6 p+ C& R. N0 I) E0 y& x* w+ y
T2CON = 0x34;4 L/ ?2 D4 }( W3 ~( R! H
SCON = 0x50;
! V6 W) a& t; a* n) p- i, G* M
/ H; s- W9 b& ?* E" ?* F2 y IP |= 0x10; //serial 0 high priority2 @$ }! s0 a5 Q! Y. Z* Z2 `
IE |= 0x10; //enable serial 0+ X& M/ ~* P7 k# ]% R1 ^- n
, C' @3 a$ Z$ B+ v
memset(&uart,0,sizeof(uart));
% q$ u$ n; z9 s+ h8 b}
" A2 n& v; r$ y& x// put char
8 e2 B" n6 v! B( L, J5 P1 wextern char Putchar(uchar c)% O5 b( Q1 d9 D0 o: U, X/ u
{
, o$ i; s2 y# R. b unsigned char head;
: Q: W8 x" k8 x1 k/ d& _9 P- i
& Q. @- k; }8 {$ k: _% E head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));! D+ o5 Y; P6 M: |: e5 P0 ~8 L
uart_tx_buf[uart.tx.head] = c;' v! X+ u, t/ X# ^0 J$ I, w
uart.tx.head = head;* U1 `% W a @8 m4 m7 L
8 C# {7 X6 r: I+ q v5 K) p8 D# P
if(uart.tx.busy != 0x5a)
' F8 l1 c/ w* C- b' p {
3 Z' ]' O, x g7 R* e6 Z. l uart.tx.busy = 0x5a;
. [. i/ D! q3 i: Z4 W" L TI = 1;7 F3 P, z' j, J+ u4 |
}
I+ d" e9 K# u$ g/ h5 `# \ p return c;
, {5 Q0 m( c' }; @9 n7 N}! P' ]" Q" c3 x: j0 p6 x) N) G8 z* G
//函数 判断串口是否有数据传进来
) j5 j, N z# e- _/ ^// 如果有,进行接收数据& H1 U- i0 t q4 N' @
extern uchar GetRxBufSize(void)
3 m& X7 D6 s/ c9 r{
1 }. x$ E, D. C3 a) u unsigned char head;
5 l& F: d+ }* ^' Y
) E& ^7 ?8 P- y8 X head = uart.rx.head;' t+ i) g8 M5 N
if(head < uart.rx.tail)& B( d2 w6 i5 f& a+ e! o
{% j. @% O% M& r& h* j( M
return (sizeof(uart_rx_buf) - (uart.rx.tail - head)); C) X* z/ S" `& M+ g
}else
+ b9 G- e# _7 K( R1 Y {
: M! Y0 [. L0 Y& ]! ?' P( j5 C9 S return (head - uart.rx.tail);
% @0 W; h& a1 t" C }
6 S& J4 t3 f8 N3 S! s$ n/ X0 z8 x}7 ~3 I4 B) ?, v. ?$ m) y6 w, y7 e( i1 ~
//函数 从串口缓冲区取数据,只取前8个字节的数据
' S& ?- C2 e O5 v; W7 f( {static void EnterRxCmdModeByPc(unsigned char c)
- ?( j0 Y+ b: _9 Z, U4 v6 D& b' T{
! g" l$ H* v' }" \- o/ V if(RxCmdPt < 8)5 Z( o3 k( R1 x% G, |
{1 M' K+ f% t2 ]; R2 v8 V
RxCmdTimeOut = 10;% h6 V( `. r- V
uartGetBuf[RxCmdPt] = c;
/ J- L! v8 W2 C1 e+ {, x* \ if(memcmp(uartGetBuf,Updat,3)==0)
9 s4 k$ x: P: ^; g5 F {, P* |& h/ P, [1 g. n: h$ S
EnterIspMode();
' G4 _# Z8 B/ C( \' t1 v }2 }9 C0 c5 U# `: S) |
RxCmdPt ++;7 D8 {8 K e+ E, ^6 a: r% D
}% `& k7 m, p1 U5 i7 N8 ^6 v
}
% J0 C, t- ~' T! {' X( |//函数 取缓冲区中的数据" H3 r( \& X8 N: S: L* S% j
//返回" L2 x+ l9 i% ^8 o1 g7 d/ l/ X% g
extern uchar Getchar(void)
. I! V* \) j6 Q) O+ E, U# G{' t" }$ r" h2 r" Q* D+ O) V
unsigned char c;: q$ w; Z$ p* R7 z q, s
3 c. S' a ? n
c = uart_rx_buf[uart.rx.tail];
2 ^; X( I! S; u X' j6 z EnterRxCmdModeByPc(c);0 ]" A+ y, }4 t z9 V! m& \8 a
uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));) h/ ]/ D2 t. c, ?
uart.rx.timeout = 100;
' O3 V6 E. m6 s return c;
5 z# D2 P) E( j5 k2 N! ]}
: h# }6 ?7 J* y, b6 m% e//
/ [6 u+ P5 Z. q( |4 ^/ {extern void UartTimer(void)using 1* S7 I8 `) D! P6 y4 N1 b
{
- b% \1 B) p6 Z if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
+ l+ a _- {( ]7 [, K0 r! w {
* E( b( R/ F: x" x/ d& w( ` uart.rx.error = 1;3 _- Z) b( }' p5 m* U
}! j# j& s9 s O$ X# C6 |) K( i
}
& X+ p$ d$ Z0 t9 u//
' m9 v' r( a0 a6 N# c4 p2 C8 ~4 pextern void ClearRxCmdPt(void)
5 C% W5 }# B1 F K/ p{
& z* ]% ~6 S; t T5 C1 ]" R0 r if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))" w3 x' q# J% |0 j& V& U1 N8 m
{4 Q0 y0 S# |+ d1 F
RxCmdPt = 0;" }' ^8 {+ ] R) A, g0 P) j
}
6 E& I% Q# M# m7 v; M1 c} |
|