|
|
#include "Include.h"/ v! d4 L$ E c: `0 W
4 M: l; X6 W* y% w5 {
unsigned char xdata uart_rx_buf[128];' s/ y7 E( Y q$ {. ~
unsigned char xdata uart_tx_buf[128];; d- \; u6 t. M+ }# j r/ [9 R
volatile UART_T xdata uart;
) r9 T, f) I; f3 nunsigned char xdata uartGetBuf[8];
# f, [! \* \4 v% Qunsigned char RxCmdPt,RxCmdTimeOut;
w! m. v Z4 W" _. f# V$ x
4 p5 Q9 V* n& n; P% b* Jstatic void Serial0(void)interrupt 4 using 1
$ I, c) E4 W! D5 ^! @( x{4 J2 a2 n' U5 U; @: j; C
unsigned char temp,head;' }. E# Y' M/ ~9 s& c
( m ^& D% l: q2 \4 k, t
if(_testbit_(RI))" J; ?; H8 F3 D. ^
{* b% A4 R9 ]% n# z! w
temp = SBUF;/ o) I$ N# h( z' {8 a
head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));$ T9 ]. E' ]6 G2 G8 A/ R
if(head != uart.rx.tail)
+ o7 M7 d' x1 B. ?6 p) D! b {& j8 d* k' X8 [, z. h
uart_rx_buf[uart.rx.head] = temp;
- D: [) O# g8 q S5 y' g4 U/ ` uart.rx.head = head;
) o" n, ~- }4 c% n# ] }else6 N( H! [" X8 W" k1 H- p* b. U
{
+ x. |* {/ p5 d uart.rx.error = 1;
, G/ C, V1 o$ D5 `( V, `8 g( `% W } u8 H: B: _: \' w! L+ B
}
4 F- l6 f, y \" ^ if(_testbit_(TI))4 P% o3 r! Z! {$ u8 Q, E; C
{5 T. j& s- W8 x1 P+ g
if(uart.tx.head == uart.tx.tail)
( g( T/ @7 \8 W( |& Q; k& x {7 C5 E5 j: r; X: y0 |( ?
uart.tx.busy = 0;+ `" q) `. H) U" y# M z
}else! b5 h2 }- I4 u, M# U! @
{
: \9 k2 c, [% y0 D, o SBUF = uart_tx_buf[uart.tx.tail];
1 D7 }/ h# U1 |" h& E3 ^ uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
* ^. V) x ~" n5 A. f }
! g" j# h/ {: o" }8 c, W }
1 Y8 ^ A; z0 g9 Y}
$ U% L7 H. J& h5 n5 _//函数 串口中断初始化2 L( U$ ?/ r5 F2 x; E) ^: ^2 }
extern void UartInit(void)
: w% ]. f d; M0 S{
A" d; b* d8 ^3 ^; Z RCAP2L = -(XTAL/32/BaudRate_9600);3 J$ ~& X- Q, |+ P0 A5 q4 D [2 X9 |
RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;. W0 g1 H5 L. h6 H& ~5 S& W- i
: @0 o% A% x) I3 b4 W T2CON = 0x34;
6 F+ ^. I5 j. }# d; k+ P R+ n" J SCON = 0x50;3 j7 A) z1 Q" f7 v6 t
6 t, b( N" ]7 J! C2 U- W IP |= 0x10; //serial 0 high priority' H" s4 N. H' [% G; g
IE |= 0x10; //enable serial 0" \6 Y0 I( b; Q, j3 G
0 O; u5 p# e! z; _7 E4 \/ { memset(&uart,0,sizeof(uart));+ g+ a" a* F! I. n8 b
}
) r+ _* `7 L v& u( v// put char# h- S6 {. @4 z1 j% W7 k$ l6 ?
extern char Putchar(uchar c)
0 `1 R- O2 I+ e3 a{
/ S( L- O4 P. W# a" p2 K unsigned char head;1 x4 C. s: H/ J( `( \9 n
- V4 S( |* E2 f/ v) P: v0 s head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));6 E, B$ C0 ]( O8 }
uart_tx_buf[uart.tx.head] = c;$ l, G) x* h1 i+ Y$ q
uart.tx.head = head;
+ k8 y6 O4 A# M
) z3 j8 Q P1 I$ f if(uart.tx.busy != 0x5a)# D4 U# o# V4 M( i: T2 K* t% C. l R9 x
{ [6 W5 w7 y4 Q, ?+ q4 ?) Z
uart.tx.busy = 0x5a;
5 r& d2 D% C% s5 b* [ TI = 1;% t1 C6 V D0 V3 `' p
}' ?- v' T& X' o6 ~
return c;
% R, F7 z" n1 M( G}6 ]4 v* z1 d4 y
//函数 判断串口是否有数据传进来5 R0 H! L" T" a- C% J8 W- l' Y1 u' I
// 如果有,进行接收数据( V) r- o4 ~, @$ Y+ ~1 W4 ?
extern uchar GetRxBufSize(void)
: O, [6 g! d. y$ \' D" b{
% u! d: T0 Q4 X1 u; s1 m' @ unsigned char head;
/ L8 E1 a: V6 p; `. U: ~' _6 G
1 `0 }5 d# [1 r; k head = uart.rx.head;3 Q2 O0 P* w9 d, A& J2 D7 O
if(head < uart.rx.tail)/ T6 ~9 L* H( B) f. W4 X/ y- M
{" R7 u; v B2 H5 r. a P; n1 m
return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
) a, c6 y: Q! L3 B+ f }else
6 z8 |; z) E# o O {
2 v0 k5 S2 ?/ i- Z( v4 n return (head - uart.rx.tail);
5 O, P4 T7 M+ f4 O- i$ c1 B8 H( m, F }
9 r2 X0 [4 ~8 b}5 z# D- S) Q j
//函数 从串口缓冲区取数据,只取前8个字节的数据
Q, h9 M, c, ^$ }& ]; ustatic void EnterRxCmdModeByPc(unsigned char c)
5 J' ?+ G; p; W( }{
5 u% ^. x) ?+ L8 s if(RxCmdPt < 8)2 t: g5 ]2 F2 q* [" f
{0 p2 L# x2 _" w0 [% F! J, J. B
RxCmdTimeOut = 10;' a1 r6 s" D3 n: c5 V- O
uartGetBuf[RxCmdPt] = c;
' _, [. s8 g) M$ J if(memcmp(uartGetBuf,Updat,3)==0)
7 ^$ G5 u5 @% L+ G; [ ]# k& R {3 m, k# ]' O D
EnterIspMode();" B+ p! h B1 Y3 R* X% b0 j
}1 P* {6 j @7 m
RxCmdPt ++;
/ ?" ~+ P9 y. w/ j/ l, l- O' _2 j1 {5 H }
e6 {$ r+ U. M+ k: l$ y3 d2 N4 F}) v0 }# c; L& h) C7 M
//函数 取缓冲区中的数据" |5 h L( b. O. e; e
//返回
4 l4 t8 [( A. j: y/ |4 eextern uchar Getchar(void)) K) S/ |8 {/ v
{& c( b" M+ E9 z K8 k# p: K q4 H
unsigned char c;
7 h' @* G/ C% M6 o* Q% N8 {) O- N* ?0 w( p
c = uart_rx_buf[uart.rx.tail];
$ Y j% m9 r+ T' m EnterRxCmdModeByPc(c);
: a2 M# ~; u4 E) M% v uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));' a$ |/ H& _: @" ?6 g
uart.rx.timeout = 100;
3 a; I- `9 G: _. [7 f2 I" L' }+ N return c;
1 q5 y" q* a( F}
5 k/ @2 ~6 [* z, Q0 y- G! ?% j0 m3 B//& d: i- p- p2 q' h0 s% Q. a4 T
extern void UartTimer(void)using 10 S4 F' H+ {" y7 q6 |- D
{ A- g @; f9 [! ~
if((uart.rx.timeout)&&(--uart.rx.timeout == 0)) C7 a* p+ p9 @; F9 _9 }) p- }* N% Y
{' |* w b4 n& M5 D9 k
uart.rx.error = 1;# {; E, h q/ h# X$ N
}7 P) j6 i* `: Q/ l- K: l8 [% M5 s
}
: g8 P/ D* C8 {/ ~! |$ F9 w//* b; H3 A* u+ X
extern void ClearRxCmdPt(void)- s1 _2 e W% Z
{( v0 e, z0 k# |' R9 g* H# K
if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))% i0 G. T! ^" I+ o9 k. d2 S
{. @' A1 M: P9 ?+ C! b8 V
RxCmdPt = 0;
+ O) N! x5 K* C8 A$ p }
4 j+ ?1 |. D0 e1 t! |1 t: I& F} |
|