|
|
#include "Include.h"
, g7 L6 f* \& C: \6 f* r( r! @2 b& ? n4 @' a& A
unsigned char xdata uart_rx_buf[128];
9 L+ p7 A, _# w; ~unsigned char xdata uart_tx_buf[128];. c* T( c- Z a) `; F- R
volatile UART_T xdata uart;" u) g, n% S1 A4 ~7 q3 D) z' r
unsigned char xdata uartGetBuf[8];6 V# S; P1 x* i
unsigned char RxCmdPt,RxCmdTimeOut;
3 \8 n, W/ O9 G4 l. ^$ I: Y1 F- o( p5 l& Y2 Z3 E
static void Serial0(void)interrupt 4 using 1
* w( L8 z5 r3 ^8 O/ y" K{3 Y8 |% l) W5 r
unsigned char temp,head;" v5 T; D" c) p0 }, n7 k. M
" j% e7 w8 y9 ]% w6 U3 k
if(_testbit_(RI)), y2 ?" I6 D; b% D4 ~2 x+ @8 H
{
! p a) H) U# o3 v& m0 V* {- { temp = SBUF;2 _' V/ @% q. K1 N% W5 e
head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));( ?* N5 h" D$ ~% ?: T: a
if(head != uart.rx.tail)
- d3 J1 X/ o5 }1 [ {
, E1 s' g: m& Q6 g uart_rx_buf[uart.rx.head] = temp;! K% @- n/ ?# q3 n
uart.rx.head = head;
6 A- N, e- a4 x }else
+ U( T/ k2 n7 l8 a {: C9 g/ S% b: O0 R ~& J1 \
uart.rx.error = 1;, p+ f- j. b y" n4 H
}) b4 P8 h2 c# _ S. X- u3 ~- O' |
}
* C f! p/ Y* T- l4 J if(_testbit_(TI))
( K( T3 w0 S. @# Z- f6 f u3 o {- J( z) J* M2 c& T0 G6 ?. l
if(uart.tx.head == uart.tx.tail)' j" l% o+ A2 X9 x( c7 V9 I
{
0 l4 P, `% b2 F3 a uart.tx.busy = 0;+ k+ G0 z1 e& j6 Z+ T/ h
}else
& B% j4 r9 ^! w1 p {
. }* p8 j" r/ G- F# z2 u SBUF = uart_tx_buf[uart.tx.tail];* w+ I0 M( }' w' _4 `* ^( B
uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));* e0 X# `6 F3 J5 F/ f W' ~
}* F3 |" B8 }! W: e; w
}
8 ?0 l5 Y0 [" i i- {! G0 V+ l: F}' m5 @9 e' @9 J
//函数 串口中断初始化
6 U9 @ {; l. Z zextern void UartInit(void)2 l* W! d3 [& d7 [: I
{0 S; a Z% g3 z) x6 t9 O5 Y
RCAP2L = -(XTAL/32/BaudRate_9600);
: X' C3 Q& [( j7 K: x RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;& u! d& Y) Y5 d. _- a2 t
5 i, E7 l% ]' f$ e6 s T2CON = 0x34;# J4 R5 U" R- B, Q) u% v6 _
SCON = 0x50;
9 |: T. ]/ Q5 J" \ t, M& ~9 _4 e/ _" k( }5 ^ x# J3 M
IP |= 0x10; //serial 0 high priority
. V) u, S3 M) U7 ^7 c' X- \+ e+ p: ] IE |= 0x10; //enable serial 0
/ W; t6 m. V8 d/ Z. ?% t8 K$ o# U( D" X3 r: o
memset(&uart,0,sizeof(uart));
/ D! @( Z, O. ~8 U}
, i5 f9 v1 N9 `6 R2 y1 f// put char3 r6 T4 C' T6 V: s7 ^- X
extern char Putchar(uchar c)
; q7 F9 h! f+ k" [{3 ?; J4 _% _# q5 u
unsigned char head;+ `2 h$ k: M5 u6 @4 _
5 X) T6 i; S V' g7 B2 u
head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
$ i+ g: m" v1 O, W2 H uart_tx_buf[uart.tx.head] = c;
) z' E3 g% n6 e0 t# \+ ]7 c( b uart.tx.head = head;
6 s4 ]( H# M1 F& m% B
( H" M3 {5 D/ ^! G if(uart.tx.busy != 0x5a)* x2 Q( n h% v2 t- ?
{. M A) @ ~7 l( Y' y: Y
uart.tx.busy = 0x5a;5 \2 m3 b. W& |3 X, g2 O, A
TI = 1;' D. B- w+ H% V
}/ _1 T1 ]8 f& q! |& O- W5 U7 K
return c;: K* Y! ], S3 [4 Y' Z" c
}
. T9 H+ ]8 g7 F# D z2 y//函数 判断串口是否有数据传进来
" g U# I1 N6 C2 X) o ^! U4 }% p// 如果有,进行接收数据; [: |5 G. E, E/ l- Y
extern uchar GetRxBufSize(void)
% f8 b& ~5 U( O" w5 O{
4 H7 v4 e b5 x unsigned char head;7 L. E: N# B K( y0 p$ E9 V0 w
: ^$ J0 U. ]2 l7 I. E B6 `/ Q/ N head = uart.rx.head;
8 Q, d! M# l) S+ x if(head < uart.rx.tail)! ~+ G, R9 I7 \ ]
{0 E, B& N. U& s# ]7 N
return (sizeof(uart_rx_buf) - (uart.rx.tail - head));2 k% N: k0 E! Y+ G( V# @5 C
}else1 s% N& k3 C' S2 ?& d
{
4 t/ X. c( }" p; A return (head - uart.rx.tail);! Y- V% j5 o/ ~4 e5 z
}3 e9 I( j/ d: e1 {- C
}
; @; R) I7 x* D" [& Q/ m R//函数 从串口缓冲区取数据,只取前8个字节的数据
- h7 T4 W- D4 g7 v- bstatic void EnterRxCmdModeByPc(unsigned char c)" w# o, _' [. j2 T. H! U& z. w
{
0 h7 n- f! l1 G: g if(RxCmdPt < 8)* d2 S& I; [& X% S) Z! t2 T
{& x6 b' _. ^* D
RxCmdTimeOut = 10;4 |) x v* b9 U% s* ]
uartGetBuf[RxCmdPt] = c;
, X# j' A- C) w6 ~# h, g if(memcmp(uartGetBuf,Updat,3)==0)
) F+ M- ~8 v) W1 X' _ {! b3 W. ^ j4 Q0 `% V
EnterIspMode();
; L1 v f& k- f# m. ? }
7 V8 L) X i( C# Q- G; J7 x4 {6 f! o RxCmdPt ++;" u* _! d; t' l+ s! f$ j3 C
}
" ]% I5 u$ d C, R}4 ]$ r. d) @: F" [1 V& G
//函数 取缓冲区中的数据
$ m6 y: S0 r1 Q9 E. x8 N4 e//返回3 E2 Z3 G; r5 ^ w
extern uchar Getchar(void)
) ?0 [ d. U1 v9 r- Y3 ?8 e{
! f- Q6 e, R: E7 \0 r7 o unsigned char c;
4 F% L7 W9 v1 S) M7 A! k, F! @6 q2 s2 r8 u q( R- u* j6 r) S
c = uart_rx_buf[uart.rx.tail];. K+ |( b. b& G9 `1 v
EnterRxCmdModeByPc(c);7 @- y& H9 w' N( r3 g! u5 K
uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));" V. j/ M% z' h# u8 F; T2 B" b
uart.rx.timeout = 100;
9 {; \$ K$ H! r7 U# ?; s return c;. x @! F; x. ]; y* ^
}
2 n. }. B( P- `& j1 C5 U6 b//3 h/ }. {) Q8 `5 [1 k% B0 e- L5 Y
extern void UartTimer(void)using 1: [: U6 r, N& U, ~ P
{
9 e& i% q1 x5 K% Z if((uart.rx.timeout)&&(--uart.rx.timeout == 0))3 u$ e* b, h2 ?) x8 O8 P
{
. G2 K! {7 ]& y7 I0 ^1 W uart.rx.error = 1;4 J! U- j5 N& h! [0 V
}
- u9 {* h s, m3 `0 ?& B% x}: s0 C8 a8 j" l' r( Y8 u$ j( X7 Q
//
, j) g- [. J: z/ m; F) i1 @8 dextern void ClearRxCmdPt(void)- j% y# T! ?/ W( b' ?" Y2 E7 z% G- V5 s
{7 N2 Q8 \& t* ?2 f- }+ `6 N- B
if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))2 p" Z5 }$ w( Y; x( D# n
{- o- j, b; I( s9 I9 i
RxCmdPt = 0;
0 K \$ O" G, p }$ T$ e6 Y5 d8 ], `; t6 x( b8 o5 H! H
} |
|