|
#include "Include.h"
4 Q$ Z, R' m0 A4 v" f( [% }$ U4 q$ P% `1 X: |0 [1 z
unsigned char xdata uart_rx_buf[128];
1 z; w' b Q) @( [* F: l3 {' cunsigned char xdata uart_tx_buf[128];9 T/ u6 V+ i* w6 @, `; a
volatile UART_T xdata uart;
- w3 n' a% _$ {$ ^4 _unsigned char xdata uartGetBuf[8];
1 R% n. A$ Z7 x9 A/ u% Ounsigned char RxCmdPt,RxCmdTimeOut; j" k1 N; `9 }* n# U- i
! x6 q+ n. W$ U& ~: V$ Pstatic void Serial0(void)interrupt 4 using 1/ P1 [) K5 X: K3 k3 x/ S+ x
{
/ f2 \: }0 \4 P unsigned char temp,head;( V# s' S1 C8 X8 {* n/ G
0 ?; V+ u/ z* ~% v2 F
if(_testbit_(RI))8 t7 \9 O" T( E0 r7 A6 q4 W6 x
{
: t( h2 ~- |' j3 W, q temp = SBUF;/ y, M! S9 z8 K/ Z7 z
head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));& V& t% E9 G0 W
if(head != uart.rx.tail)' c, G9 X/ S2 f1 f! o) b# E
{5 w* v! k6 G, w5 o
uart_rx_buf[uart.rx.head] = temp;6 x v6 x8 ~) c
uart.rx.head = head;7 M4 A3 p0 h) r( [1 T$ @. m
}else
- A( U9 w) A$ k {6 x1 N( _. @- c0 M6 x5 b/ b
uart.rx.error = 1;/ K5 c4 a$ D: [
}
0 ^. g H; H, c8 n }+ X( p! I8 i& W" U. o4 \
if(_testbit_(TI))0 f% q5 X7 u' t8 U! V
{
}( U# j6 `9 `2 H5 f if(uart.tx.head == uart.tx.tail)
; M( N& {. A: s1 q) z5 C# [ {
$ c+ Q% I* X! W6 r, @2 H0 q uart.tx.busy = 0;
% }9 k* K) u/ ~5 t- S }else5 } O! C% z; x, y6 u
{
( J- H5 U' o$ V/ m SBUF = uart_tx_buf[uart.tx.tail];
) _0 t ^7 i* {; _. } uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
. |) t5 |3 S7 F" ~& x+ R6 l }9 O1 `1 E( S/ M P# D) j6 F
}/ |/ H) Y% r: d8 `4 Q5 I h
}- g _# x% |% L7 E& F# e( R
//函数 串口中断初始化
1 ]6 i- E( R) _extern void UartInit(void)
, ^: h7 Y. a& P. B! t$ ]% M7 F{6 U7 n5 U v4 \; U* a$ ~
RCAP2L = -(XTAL/32/BaudRate_9600);; B% t: n* W6 w: \' m$ J# p/ S
RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;, X. D/ J4 w9 M* a4 o2 S
! p: V9 U- ^; y, y; A) n T2CON = 0x34;
# Q% |( ]+ x. C0 w' X* N' H SCON = 0x50;7 t* D& _0 ?# Z
( h! a# q% W G" o5 i8 C0 {9 d IP |= 0x10; //serial 0 high priority
( B4 v! p3 J$ E2 Q- O. o9 x IE |= 0x10; //enable serial 0! |: ]# I8 |; ^5 x) q- C3 ~& k
; j3 x( r b4 {) {8 k) A
memset(&uart,0,sizeof(uart));
5 M/ r7 `% b: j' Z" n}
$ T( ?) `- Y: f! T* S, y// put char: V* x( @( d8 {
extern char Putchar(uchar c)
) y4 C9 i- D3 q1 D; q{
1 d8 g3 Q$ o, Z4 w1 v8 B6 S3 V0 v1 N unsigned char head;4 @& a9 G; I2 g, i
! j. `; S% R& ]4 ^. b Q1 A) _: E head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
: [9 G, E) a6 B1 v* |2 h uart_tx_buf[uart.tx.head] = c;' B1 P- y4 D8 ]* I# N9 L3 [" {
uart.tx.head = head;
; w( l: U! G- r) v; g+ k
8 u. G. q6 i0 K. t3 R if(uart.tx.busy != 0x5a)
9 h1 K. s( S! V: v {
. c! }2 K6 Q1 j" }9 Z" N uart.tx.busy = 0x5a;
2 Z N. \6 q1 \7 W: O/ V TI = 1;1 `9 s8 y! S. {& ^5 ]' E1 g
}
" ^+ n& z! X' i1 R/ x3 O return c;
, D) |: G# C# z}! i# k/ h( J; k4 m3 ^
//函数 判断串口是否有数据传进来0 m! ]' L1 c& H7 E6 z) y
// 如果有,进行接收数据- Z W1 O+ I0 x6 L3 [5 \1 G
extern uchar GetRxBufSize(void)
( s( Z8 z. t: ^2 i) @$ J9 h{
+ ?# g' R5 O$ R7 n unsigned char head;
! f9 ?, d3 F$ S' m0 }; P
7 V* U6 ]# N9 Z1 W8 D% J head = uart.rx.head;
3 O. V' }: u& {' o2 @7 ? if(head < uart.rx.tail)( y' L1 _0 m" l
{
& p: L% u7 b |- f! | return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
1 h& ]3 I, b ]+ K }else
$ M5 b0 D( _/ N2 l( O8 X. R7 ? {$ U& W: J4 q) {/ `) z2 b1 e
return (head - uart.rx.tail);
2 o. j9 p" h+ n1 w }* c8 E5 c' x: N6 k0 ~/ W
}9 C, z+ \+ d/ T, o- t+ C
//函数 从串口缓冲区取数据,只取前8个字节的数据
5 p0 O* F5 U$ G. F9 ~( X3 w2 p Q+ }$ vstatic void EnterRxCmdModeByPc(unsigned char c): K6 F+ Q, {( p$ X
{+ A1 O8 ]1 b, ]4 h' d) K
if(RxCmdPt < 8)
+ A9 G3 D4 }6 D0 O {
3 ^% A, ?' T6 Y RxCmdTimeOut = 10;
/ |. e2 L1 M7 T$ E/ d uartGetBuf[RxCmdPt] = c;0 R/ q- y; V' L. E+ l& V$ r: l* m5 z
if(memcmp(uartGetBuf,Updat,3)==0)+ ~" q, n* a; g6 j
{) o9 D! D( b- E. w* @
EnterIspMode();4 i+ ?( @* W% |7 s* |$ \% }$ }
}: J' `: `3 ~7 _1 ~* h: [ m- D
RxCmdPt ++;/ s5 L9 J1 i( z" T3 c* m
}
+ `8 h! v2 @5 R}) C2 p6 m9 n. V
//函数 取缓冲区中的数据% g8 y- T3 _# p( w& L( X* e
//返回! G9 B( {! n# G
extern uchar Getchar(void)6 v) \- X' ]3 h! K
{
4 i$ t, I8 p1 S0 |6 l7 B9 @( Q* u unsigned char c;, a* Z5 W# b! ~5 P0 y
+ Y. B' \* O7 _+ ?* } D c = uart_rx_buf[uart.rx.tail];9 A2 M# H2 z) K/ k; z: y" ^
EnterRxCmdModeByPc(c);
6 G: O1 ?4 c& I( `, i( _. [0 Y$ N uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));& r4 M- k& B7 B- c$ c+ S4 S% _
uart.rx.timeout = 100;' b t* G8 \- h! F$ }( l
return c;! U6 U! [1 m! z) h
}0 F( h# k$ z; Z$ W
//# R6 P6 Y# y! ~/ f [4 y4 I. f9 o
extern void UartTimer(void)using 1
8 R7 B! z9 h- r: I5 w: Y' O{
+ w, g, Q3 t& q( g1 W) c if((uart.rx.timeout)&&(--uart.rx.timeout == 0))8 W2 N3 o5 H2 I1 |9 d
{
, F3 i7 q" r6 O+ z" u uart.rx.error = 1;
4 B* Y4 g) c8 G+ K5 Z/ T: a: q }
; m* ?7 c6 s, O# e8 x5 J% P}, T2 n& A$ O9 F! Q! _! j
//
9 ~! N* J! o5 ~* vextern void ClearRxCmdPt(void)# j& S6 \7 X0 w2 k+ J i _) O
{
- n( g. Q, C* {8 Y3 Y' ^ if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
% F T/ s1 C' W4 b9 ^% m+ K" g& c$ H {
+ b. l. M2 `. y RxCmdPt = 0;
1 [. I" L3 Y: m& v }/ }: j0 S! m6 h. z
} |
|