|
#include "Include.h"* }' D5 `2 o; c8 f
9 z/ n& W2 v# o. A0 l* @- C8 V
unsigned char xdata uart_rx_buf[128];
; G7 L1 s7 I4 o9 C v! H, p7 gunsigned char xdata uart_tx_buf[128];0 A* b3 W$ Q, E+ H
volatile UART_T xdata uart;+ H' A) _2 v2 p( \6 ~7 {6 F& W
unsigned char xdata uartGetBuf[8];3 u" H) v4 q9 j: y$ w" c
unsigned char RxCmdPt,RxCmdTimeOut;5 ~! r$ ^7 N, v* P4 c
0 o* e, I- ]; J7 i* c1 {. \static void Serial0(void)interrupt 4 using 1
, s& ]6 O. L) z' `4 J7 W8 }{) j; h8 l. C1 y- w' S
unsigned char temp,head;
# |; ?! g6 z- N' y% o U1 t* K9 y3 L( \+ _# ~9 C$ k
if(_testbit_(RI))
. g. W; C3 p7 s {
3 ~3 ]* g( u/ w/ ~ temp = SBUF;
q. @5 s( F2 H+ n head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));; S5 T* c9 s- v9 [) w. e
if(head != uart.rx.tail)! R& P) O+ s, m4 }
{0 L& F+ S. H, l) |
uart_rx_buf[uart.rx.head] = temp;
" l& @5 B% v! i5 ?7 _2 _, C9 X uart.rx.head = head;
) ^ ]6 Z6 ~& N, p: U+ e }else
]6 I$ h& m+ T* _' A {& i2 y5 P$ Y. d% V5 i6 X z
uart.rx.error = 1;
% P7 f/ p( B+ u+ J" H }: {6 `8 }" S. S' n
}6 d* p: [, n8 y5 U6 U
if(_testbit_(TI))' a3 l: K; B1 l$ x( T- d1 C6 [
{2 L+ L2 p2 ?, l
if(uart.tx.head == uart.tx.tail)- c! s5 c4 }9 L4 d }% d( \+ h0 q+ l
{- s9 T* X8 Y; C7 W$ X. M6 U1 o
uart.tx.busy = 0;& E) K4 n+ Y. W% z( y5 v* I
}else! ]7 y5 z0 U8 ~9 \4 Q
{
. X. R5 n# |7 M) j' r9 x2 {& o0 P) [ SBUF = uart_tx_buf[uart.tx.tail];# p6 k( K1 u1 J* V0 B
uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
# ]3 I: \. D% y8 o7 k- V) n5 r! l }
8 @7 I1 Y9 c: M }
' F8 B# m, h6 E5 `) N, ^}
. ^# U! n0 b9 s* G//函数 串口中断初始化/ ~& _/ P" C' w7 F$ N4 f/ m
extern void UartInit(void)- ~" v% W8 Q% K2 |$ Z* s9 f
{$ I4 b( s$ ]" O: ^2 g- J* m2 x
RCAP2L = -(XTAL/32/BaudRate_9600);, @* \ U8 `9 p" h) B" r
RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
7 F0 V1 |. `4 b" S: b, c4 g. A- w
T2CON = 0x34;( Y: w! z" D# a6 K! Q; T
SCON = 0x50;
# Q+ N) I; g6 \3 B$ G$ g7 |( V; Y2 p: }4 @& h* `
IP |= 0x10; //serial 0 high priority
+ n3 _2 O( T/ J, p& }) z/ f+ z! o IE |= 0x10; //enable serial 03 `1 A# X5 M3 n8 q$ \8 E$ P
2 u9 ?0 h4 k" ^! q
memset(&uart,0,sizeof(uart));
) q) }! H0 |# T' Y& k& ]% e}
' Y' L+ O8 x( j G: H# i+ I! O/ ~// put char
/ S% U6 Y0 Y4 w! K+ sextern char Putchar(uchar c) e4 r! o+ @0 q9 t8 b
{ y, x1 I0 N- u* i9 m D! G
unsigned char head;* v' J; q! G& [ ~7 D* Z7 e
! g! U4 m* t0 U( `( U
head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
% P1 B, _4 x" ^" _0 \& s2 x3 Y uart_tx_buf[uart.tx.head] = c;$ X' Q. M$ F, n( D& L4 x
uart.tx.head = head;" o: L h. ]) K( R
7 [( d8 }: \. Q) ?2 t if(uart.tx.busy != 0x5a)7 u( u/ ?2 H/ w! y' b! n7 T
{6 N% i" l. S! |1 T0 v, A& f/ j' C! a
uart.tx.busy = 0x5a;
1 l3 [1 e9 L* E# e- p' E/ b& |9 E TI = 1;
# w8 A; `& U5 ]( t$ u( l }9 `- }% f" r6 `! D$ q, W5 W$ w: }
return c;) g |$ ^% L* ]3 y% x
}
9 ?; \% e! e- L; P//函数 判断串口是否有数据传进来& w. F1 H! g8 J6 D, A) y+ {
// 如果有,进行接收数据
; P' B4 {" N Nextern uchar GetRxBufSize(void)
" l! `1 W( e; {: r0 s{$ ?- y+ m6 c. K" [: K8 N5 n& m" a
unsigned char head;
+ g! W. d4 F4 a. A' t) k, j" Q; V$ }. M$ s2 K3 g
head = uart.rx.head;$ {' ]4 x# I% G3 {
if(head < uart.rx.tail)6 E$ O7 f1 {7 \1 K: [
{/ f9 ^, S, k4 H: t. Y% W! J1 F1 i
return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
( b+ w, }' t$ P; R, p }else
( F4 U" l' ~4 [. H {
1 p' X; Q! {0 N. t2 r. \3 ~* C return (head - uart.rx.tail);
8 n7 s L; M: i1 V, D }" A: ^& y; ~% C/ a
}
. m" ~" Q7 {+ { T5 ^1 B//函数 从串口缓冲区取数据,只取前8个字节的数据* a7 E8 R5 J& S: C! f4 \
static void EnterRxCmdModeByPc(unsigned char c)# j4 G } o1 Z; r
{0 R* ]' ^! s5 _) a
if(RxCmdPt < 8)
& y9 X* q! }6 @: f {9 E# @" I4 u% }; P& }, v _4 C
RxCmdTimeOut = 10;* B. `0 ^; e1 m' a
uartGetBuf[RxCmdPt] = c;0 J2 e, o7 L, q+ o; a4 t( v
if(memcmp(uartGetBuf,Updat,3)==0)
4 _( I/ J; A2 b- Y8 U+ B2 m; A; Z { N( ^5 X# V7 p, v
EnterIspMode();0 n2 X9 m( f- ~7 k
}5 ^$ y5 a8 S' r0 T+ b
RxCmdPt ++;4 V1 j$ Y" B( C# G* S* c; M6 J/ V8 D" g" a
}
' ]- Q5 S3 t0 D; o) y}4 ]2 T6 d" A" _& U( q* F+ E
//函数 取缓冲区中的数据0 y( d9 Z4 l2 B1 T. D; Y, c7 @
//返回; {8 s- J3 R2 g/ g- x$ W1 L
extern uchar Getchar(void)
1 ~! i+ Z, a6 k{8 P$ d( w: B K; I9 U
unsigned char c;
5 m. n& N8 j0 [8 j& g8 z0 i; q
* H# v, y( i3 F8 p! m c = uart_rx_buf[uart.rx.tail];& S! p5 v) l7 b$ z6 I- q/ ?
EnterRxCmdModeByPc(c);5 z7 w# ?: b4 ~: ~+ l
uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf)); ~" ~8 U! W( R% m# k; W1 r
uart.rx.timeout = 100;
. `# a6 V1 }2 ] m return c;# Z' z& k. q+ V$ `/ k
}
% j4 S Q. W* x& \//3 w- _4 b' s! W+ M! e$ z4 ~
extern void UartTimer(void)using 1. x. `" `' I$ o; |
{ n/ f5 T/ k- @* \9 S$ h
if((uart.rx.timeout)&&(--uart.rx.timeout == 0))3 M5 i5 g* n f; z5 j
{
* U% ~! I3 R1 ~/ r; _; o2 ^ uart.rx.error = 1;4 J5 {* _4 I& L) V
}
; b' b" O! p: r( k}' ?, b( h4 S0 N+ V6 I: [
//
[) c3 t& R) `0 e/ {3 {3 d' a( Iextern void ClearRxCmdPt(void)/ `( I0 R/ T7 T9 R5 s
{) w, Z" h3 F4 t M8 P* E
if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))7 X. A0 N: x) v5 v& }( H0 \
{
. q; X8 f# O4 v5 I8 Y/ y& G% d RxCmdPt = 0;
% y. I3 c# N! X5 C7 I }2 B- x$ s# } W8 b8 X) J
} |
|