|
幸福万岁 发表于 2013-7-23 11:52 - ]8 `8 \. l7 K: R4 A
这个函数也可以写的简单点
+ G1 E6 |; z, W( u我比较喜欢写成 这样 一目了然 - C$ l, _7 U2 e$ i4 m* q
哈哈 , R( ?! X5 m, f O7 s
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 014 Q; ]4 }* [7 b7 I z
9 B% I7 H8 i0 j% ]' V' }
#define uchar unsigned char
# S- M4 g9 _& J) g' uuchar port;% y0 w& h- P! t- z3 n* a
uchar rec_data;
8 t1 q8 S& B( {* Vuchar str[6];
( M: v! A' r' L6 f7 y7 euchar point=0;3 Y. N+ @: _8 ]8 b# b
uchar flag=0;
8 e& E( L2 t4 D n1 r% q//串口初始化
+ E% K# V e* b0 J8 q, ]void UART_Initial()
3 h8 g; o) y& s2 Z$ j9 L' p) M{
, V- _0 ?- e/ J# L1 Q) S3 p SCON = 0x50; //串口方式1,允许接收
, i( r) X( y% ~2 z% f. m TMOD = 0x20; //定时计数器1方式2
5 g l8 s7 H, X3 b1 l TH1 = 0xFD; //9600 波特率 FD
# ?2 U: s% X3 T TL1 = 0xFD;, ?! x; R6 ]5 Z, l! A* L
EA=1;
( [# Z$ _; f/ T9 X* i ES=1;
. q# ]- W! B6 i( M9 Y' B TR1 = 1;
' ` i# G7 H% ^& \}
9 u% A6 M. h) ~) ?
4 ~) S5 Z. ^. M9 |) P2 U5 ^void waitsend()/ o& p* }* U! P% ^, u( N. p* B
{
) Z: F/ w% f9 {; } TI = 0;
8 X& I; n( o% S$ w ES = 0;5 _ q8 I: v9 T! W% {- [, I3 L# G* s
while(!TI)3 }9 u1 c- i% M3 p+ S! y
{# Y' j$ X* }2 {9 i
};* Q& F0 K3 F+ v2 g
TI = 0;3 L+ w# d# |1 y0 B: M" Q, B
ES = 1;
u- U# G* D* O- S+ t}
5 A3 @( }, ^) n" n/ X% b
& P" V* L* ~$ E- bvoid delay(long i)) Q. A9 X7 P& q, X4 L3 p4 D5 x
{
! ~4 j+ w: ] Y; r x2 Q# i: \ long j;
/ ~4 i0 E+ E+ U for(j=0;j<i;j++)
7 n* B4 q/ N, a8 F5 @* x) J {
1 _5 j s5 R5 x, q. n2 S6 i SomeNOP();# ^6 o1 W: `$ E$ M
SomeNOP();
+ O% s4 q+ E: U* d }& K! t/ Y$ l8 Z
}
1 O$ }- Y5 F# k, p) B" s/ A' s W1 R' s* M
void delay1ms(long i)) P. W4 h" @ i
{
O% i$ g+ R+ Y# U long j;
5 @1 R8 L# c5 F( |0 }9 l for(j=0;j<i;j++)" ~7 B& b( _1 s" t5 H# e; o
{4 c& |, V4 P# K0 x4 i+ E* V
delay(70);# D3 J& V$ b3 ^- a
}
5 A) h8 |# k5 k, U8 v' s0 Y1 U8 w}
% j1 y- J3 K9 U: ]: `void COM_REC(void) interrupt 4
- D" w" Z, a* G( ?" h( B/ Y L{
- \6 K7 \" |( M 0 T" ^0 V E) l; }
if(RI)
- G- n, Q9 ~) N { //清除串行接受标志位$ d9 V5 N5 `5 E* h' t
RI = 0;
9 X w* k& _$ a9 Y& I( H: r9 ] h4 I rec_data = SBUF; //从串口缓冲区取得数据$ }0 T9 Y( _; U. K6 F" G
for(point=0;point<6;point++)
0 {6 M; e8 D, e0 b2 ~" N {
2 c% J7 O% Z1 s; b0 B& \4 N str[point] =rec_data;# k/ K' [* \ G
//delay1ms(1);
4 c) }' N, e% z5 q% h" D SomeNOP();) J( _% ]$ l0 k
SomeNOP();
; ^& \0 @) O& A7 A: T }- P7 `: Z9 K+ [% m( N
point=0;
. c1 N" w( o6 ]6 Q flag=1;" a, E9 t& d+ ]# t
}
2 {( j( e" O4 G) O6 I8 B, o ?}
^, Q% ?2 y/ _void COM_SEND(void)
+ k) f4 A( k1 C) I- ^{8 ^# R2 D, Q1 I4 r' w2 `7 ?& B
for(point=0;point<6;point++) //连续发送数据
. j5 Z+ j0 U1 b; G! t1 h5 J) W; e$ F { L8 }; A$ w i
TI=0;
5 y0 z1 D V6 ~* M% M* v SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口! e+ @3 H5 @- N' o" T
//delay1ms(1);
0 D/ I; ]6 h1 w5 m# m SomeNOP();
! J3 N/ E5 F0 ^* B' {$ D5 l SomeNOP();" m4 g5 q4 n7 v# [. I3 I0 W; |: m
SomeNOP(); q2 n0 M4 v5 X$ k4 d" [" J4 V
}
% G- N2 H+ v! w- R& z; L/ O //SBUF=Read_OneByte(str[3],str[5],str[2]);
/ b! [- ^: L5 R# Q% U " j9 g$ ~( k' P0 v& P8 ^
}
7 \' r. ?6 c- \& mvoid main()
3 ~ b6 ?" Y; R# F, t* o{. p7 L/ L2 q3 t
UART_Initial();
6 d& X3 _3 y% }+ o2 O8 s1 U delay1ms(2);
$ q7 ~$ F U: U; ]: B while(1)
5 A2 \0 [7 p$ o/ G) n7 H {
, ?1 p2 x3 ` ]+ W. y while(flag)# V! u# [* O- N# R5 W
{; X' c" C* N6 T8 L
//RI=0;
$ W# B6 X w( I0 B' ]4 c COM_SEND();
& V, }. I$ ]3 v0 l% Y flag=0;
4 Z1 \& i+ y" T( e( v0 P! L }7 o1 k# c/ F$ c! M# _
}
) a x W6 M4 i& D+ ^} |
|