找回密码
 注册
关于网站域名变更的通知
查看: 1623|回复: 9
打印 上一主题 下一主题

c51串口调试问题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2013-7-22 14:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
想以这格式读输出板寄存器+ v  P$ E6 H' v6 S" B
0        1        2        3        4        5
( Z, L  Z  M: _) ~. c4 e. s% W                                        - ~, D2 u. |7 ~
Byte 0:固定为0x5a$ r' N4 s, v2 t# J# e! d
Byte 1:传输字节的长度,为0x06
2 R" H( T+ a# H! r6 o2 A$ {# uByte 2:port口
/ @- N+ h, C8 K% K4 w5 gByte 3:设备的地址;
( P% @5 J6 T- i! BByte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);
( `+ c1 X' ~8 k5 g! v! GByte5:寄存器地址低8位(0x~0xFF);" A* C. C" {8 Y' t8 L
例如:5a 06 00 98 00 01
5 x8 e& y) I: L/ F5 }5 _; ^如何写串口字符串收发程序
9 g  ?& [) N& X8 T" h2 _请大神指导下,新手不懂的太多

该用户从未签到

2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信. k* m+ a) J8 E5 [
你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序
/ c/ ~6 q! F8 P, i7 ~我建议你 还是下个郭天祥的视频  串口通信不难的

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42
( X" a7 h/ Y! O( T2 ]  E- J- l你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
& j/ o1 M8 R7 J' H1 O4 x; g  u你要写什么串口通信什么样的程序  我有 ...

: ?: L2 r: k- |3 G1 tvoid COM_REC(void) interrupt 4
$ T* O5 W9 ~  R8 X& e- ?; k{0 p3 H  @; D0 e& L0 M. z/ K1 s
     $ z, [. q3 j1 y. ^; [
    if(RI)# z5 r, x8 C% m" V2 G
    {    //清除串行接受标志位0 H0 k$ i1 n3 Y4 \& v5 F: d1 U
        RI = 0;
- T. y) S' S) X' |        rec_data = SBUF;  //从串口缓冲区取得数据0 f; c- b- T0 O3 A7 k$ f" }
        if(point<=5)
0 {8 x; C0 N: S3 l5 j0 P' a$ m        str[point++] = rec_data; ! x' b/ l, X9 D* R& {
                flag=1;
1 J3 x) d3 F" x: n) b6 E
1 N7 h; i( `( F4 m# Z: I& v    }1 Y. r& F& k8 B3 z5 h1 X
}+ }6 |' t0 ~3 n. a% K
void COM_SEND(void)
) d, |4 p: @5 J) ^{
5 @# j# Z( X3 Y& w/*while(flag)
& C! \/ I' I1 e/ F5 y* `{*/
  s8 a0 Y5 D) s% g% s" ?for(point=0;point<=5;point++)             //连续发送数据
& v# ~$ I/ \- ?& l2 R                                      
4 C" o( O& |0 C7 a2 V) Y    {
# Y' R2 L1 {# c' ^/ c8 [: q! i, v    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口9 N# T! z; ~& V3 Q5 o+ c

4 U( v7 E5 q* P4 l1 b2 D0 [        }
( k- M, E8 B0 N5 k8 B   // SBUF=Read_OneByte(str[3],str[5],str[2]);6 v% Z% @$ d+ I2 p: H$ |
flag=0;    9 ?/ z! }) T( B
}/ ]- f1 U4 |& @0 i0 Q3 L1 j
void main()
, h& d. ]( b2 J' B( x{
/ Z9 o8 D( h" Y3 J7 |    while(1)
$ `( G( w8 ~# q        {: x; F5 l+ z% L
        UART_Initial();
3 _+ e6 `+ E2 B& x. _6 ~                delay1ms(2);
1 I: A% X- f( i- z5 w9 H/ Y. x                while(flag)8 i/ J9 v# v' I* ], r2 F6 E( u
                {
0 r" i& ]. V2 z4 n% c                COM_SEND();+ Z! A) i/ y+ H( u
                point=0;
: r9 M  T: Q/ G& `                }8 s1 U5 Z7 w, U% C
                }! g! c+ {# ^( U8 _/ I) i
}! ]7 x: v+ B. V7 a9 Y" g1 V/ P
这是我写的程序,麻烦帮我看看哪里有问题

该用户从未签到

4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候
  O0 t5 T* E) A: P* R/ \$ h: X接收一个字节 延长点时间  再接收第二个  
9 ?) D& {8 D3 b: k我写过程序 接收多个字节的时候 不延时不行
4 w7 A& j1 r  |0 N, ]- {6 H0 L发送的时候 估计也一样  / s8 O5 N& X2 r( }4 {
我看你没延时 估计就有问题  
7 _) r; Y( n! H4 @$ d- w# C8 O你把接收函数改成这样1 j. d8 x1 m8 X' \3 q
if(RI==1)    //等待接收数据
7 M6 R7 ?: z. I: j$ R7 a* Z! u        {: _) K' Q$ |# l2 m
                  for(a=5;a>0;a--)   //循环5次 接收5个字节4 s: r  [: k& C! C9 {# w( a
{$ ?% r. O5 g  M$ ~! V8 F3 A# d& m
          point++;                 // point随便定义个变量 " B2 |, F0 H4 _% I$ s$ u, N
  {
( U2 r3 R' h: `8 [, W       if(point==1)+ Z, ]8 I" q! s* R$ ?% M$ F
{2 p6 d% F, v* `. @4 @( C; B
    RI=0;: C: x8 ?, N1 [, k  d6 Z( D
    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序         
5 J; w. M0 ^1 H" G2 B7 ~# K% t }' w! {  [! C4 Z
   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写 ' x" ^% Q8 [) g( h( ]& ?
  if(point==2)
2 U/ `0 A4 m7 u* a7 D* c0 p$ r+ V6 @{$ G+ x$ q0 m; y8 t6 N" X: q$ G
  RI=0;
6 P, N6 M0 h6 X  str[2]=SBUF;7 A# S4 p: m# w5 t, n
}, l0 a% Z- A9 o: W2 K0 _
   delay(200);) C: S6 b' H; f" M
if(point==3)$ A3 j3 {4 P0 N$ ?8 U) @
{6 @+ c- O; t  A9 E2 y% h; }6 P
  RI=0;) {9 [9 g' i& C0 _  F$ T- N8 ^/ G
  str[3]=SBUF;6 p0 h$ T/ R6 @6 B, i% U! }
}
: J7 w; R8 e. C; b: ^" S5 `   delay(200);1 r& l5 M" n: b7 u: L; t$ J
if(point==4)
5 F/ n$ V6 }. a/ C$ P/ Q) e{
7 X- Q1 [3 i$ |, Z# i  RI=0;
% a3 T9 M4 F6 o$ v" e  str[4]=SBUF;7 Y. `/ P1 `* y
}
3 x. E$ T2 ]; Z! `7 t   delay(200);
% k/ e! @8 }; w9 e if(point==5)5 x: z$ k1 r* N; R/ Z( R& @
{
8 j$ x6 f- F( T3 A' M  RI=0;
* E; _( p/ ?; [$ I) X  str[5]=SBUF;
0 Z: [& w* z1 N3 ~* |}
7 `7 r- y3 R% Q" c9 O8 v   delay(200);8 \' C: u. |' `' T
   }     o5 x1 W: ?0 h
}* U7 c5 M3 x) O0 s  c
编程习惯各有所好  你试试看这样可不可以

该用户从未签到

5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多
  m) g% H! ]! V; @- T) c在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了
) }4 E7 m, Z1 i* y. z) cif(point==5)4 o/ Z" C5 r4 a; C, Y- d! `$ ^: w
{
" }( N7 L& l. V- \# N  RI=0;, @# T8 L) B4 E" x1 A
  str[5]=SBUF;
/ n7 A- [% e8 lpoint=0;; B2 @( r; X3 l) E2 i1 M+ K- Y
}

该用户从未签到

6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点
  E! i* q- P' V# u$ ~我比较喜欢写成 这样  一目了然
- U% h8 Q* g# s9 p8 P  y* C" z哈哈  

该用户从未签到

7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52 2 p4 t, B2 m& C0 d9 C
这个函数也可以写的简单点 5 m8 J# R6 \2 g/ q& n' e7 t
我比较喜欢写成 这样  一目了然
7 e2 A$ Q* I( e/ j# ~( s) J* \2 }) U哈哈
' E! o$ ]8 f) \$ ~% _2 H( s( e
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01
1 T" e& C' @+ Z: T/ E
; x' V) p  E. I; Y0 g; \) B#define uchar unsigned char
7 F; y* I- J- B" t! P0 Suchar  port;/ e! E1 m& G/ [; S/ _1 C1 x
uchar  rec_data;
% _8 A+ P# c; B. A: t1 Iuchar  str[6];. l9 c; c+ z, c. b
uchar  point=0;9 q; G% B& S& k) N( a& Q
uchar  flag=0;
1 ~3 }( i4 [% @/ Q; i* _//串口初始化
, Q% n8 Q( N! Z, X8 a/ ^void UART_Initial()        ' D6 J4 F& ]' W( \/ z
{
6 `! Y$ e! e2 z  j$ R    SCON = 0x50; //串口方式1,允许接收& Y/ l3 e" k4 B) p5 s. V* U* X& C9 v
        TMOD = 0x20; //定时计数器1方式24 |/ j4 }  d% e  ]" t
        TH1 = 0xFD;        //9600 波特率 FD) ?6 s) h( C9 v" V
        TL1 = 0xFD;% O/ ^! e, ~( J; ^% m! {" ~: N) A3 k
        EA=1;      
$ c1 F$ {0 \% T$ @3 p8 \        ES=1;      
, d7 H& _) x( E  R! m/ s# m7 h        TR1 = 1;    / f2 ~. S0 Z: B+ H
}( C* X; x/ G, G6 o: a3 ~9 v+ L  \
6 I4 \/ C' \9 V
void waitsend()
. m; h& `& x! p  }# A( P* G9 R{) j6 e4 u$ Q; v& B
    TI = 0;
! C; u+ e- T$ E4 _: d        ES = 0;
; G2 C+ d: k3 D, A    while(!TI)
. h( @) l; T& }2 g    {0 s( I' q& n  ?+ y% y
    };
5 D1 D3 K9 r9 m4 M/ O    TI = 0;
. C8 |/ \2 o3 C+ p& x2 ~0 N7 K/ m        ES = 1;
+ K# K8 ?- e7 m0 ]  w}- B* k( s3 R; ^  G% h7 w9 W2 e+ A
4 H- W3 J/ `. I; V/ A
void delay(long i)2 l( h1 p& M! P; E; ^8 y4 Z
{; p  {1 _+ R  ?9 ?' m
    long  j;6 `3 o0 u+ ^& g) y$ i
    for(j=0;j<i;j++); j# z- D, S& `6 i0 _
    {
7 l+ Y5 G& ^! G8 q6 _, g        SomeNOP();
2 R0 v$ y* D! i7 F1 z) q5 S        SomeNOP();
( a0 {1 ]# ^" B1 F) y6 f        }4 i4 b/ r* c: b- p* s. c- ]
}
; u+ M4 M7 N) Z- m) w% j' z0 v( l& o
void delay1ms(long  i)
0 ?( V5 m# H2 l) J2 d{
- X: k* z  V5 m) C    long  j;
! J# @: I1 Q4 Y8 a( y+ Z4 c    for(j=0;j<i;j++)& {; l6 [) t$ `% A
    {2 s' [$ P+ n- f6 P9 ]$ w
            delay(70);
1 {8 \- M  r2 k        }
% D: j! E/ R& i$ @1 V. H}0 c& y% n* G7 c  b/ J: ~
void COM_REC(void) interrupt 4
$ Q) k6 I2 P+ _{
6 Z3 J" }8 D& e1 v% F% u  ?1 u1 u     
6 C* K6 P/ Q; \6 A# ]! P7 r    if(RI)& N8 @$ y/ L4 F# W) F
    {    //清除串行接受标志位
+ q. q0 G, I$ }9 J" Q        RI = 0;. h: W, ^$ f1 ^3 F( J4 J# j
        rec_data = SBUF;  //从串口缓冲区取得数据7 [0 o& `+ M, T. j; Q4 s7 D
        for(point=0;point<6;point++)
4 v; J* E3 T, z+ h( W6 G3 v                {) c  d  r! i  @0 U8 T
        str[point] =rec_data;
, b4 V, K0 S, \7 W3 h4 Z9 F                //delay1ms(1);6 P3 T( h- ~0 V' k' F; |
                SomeNOP();
: y( Q4 s) ]/ V8 d( F5 x9 ^                SomeNOP();
/ ~# d4 m9 G# {# X4 E  Z/ Z                }1 ^* B( F; Z4 U# k2 o, T; T
        point=0;
) I+ ~7 s& W* G        flag=1;5 T- |' F4 C8 T- U. }
    }$ b2 h' H( k- |0 h. a# C0 X/ z4 f+ E
}; M# u: [8 K& d) K8 J9 x
void COM_SEND(void): m+ \7 |2 z# \$ Q0 N; j" B
{
# o: F4 |2 r& d9 o5 ^% B- qfor(point=0;point<6;point++)             //连续发送数据                                 
* A) ?4 m+ C% O/ r    {
# G6 a4 c( N8 @        TI=0;3 `, R4 b+ z3 j+ p4 y* ~- t
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口; B$ X4 T8 l3 R# V7 T; K
        //delay1ms(1);
" a, ]: I" U3 u/ \1 c  d$ s        SomeNOP();. y, c5 |2 i4 O1 `# C& P
        SomeNOP();
* _; o; E3 u8 s8 w' g        SomeNOP();
2 v$ u# ~; g/ A' R% i- Y' y( |        }
" w1 r1 S/ Q- d& U( [; @; V    //SBUF=Read_OneByte(str[3],str[5],str[2]);# k4 k- ]6 ?/ g
    " G5 r4 N2 T. I3 Y* ]( F! f
}- m. r. F& d$ x# ~- W' E
void main()$ h/ n( {1 D/ ?) d4 f" L
{
2 j5 y& R; R' ^7 N    UART_Initial();
7 B# \4 {% X' {+ M    delay1ms(2);3 H# q& y0 j( j6 W$ ^
    while(1)
$ B# u+ x% [6 ~& F+ g    {% u2 e  J- \* F. m7 n4 K
                while(flag)
% S+ N$ `  `. g' i' g8 B- _8 J                {
2 T  J) e2 P: s8 r# W. \            //RI=0;
- A$ n6 l2 N" U- z1 M" q% y4 s                COM_SEND();. y; g; B" i) N! v. b
                flag=0;
) F+ H, G- _: m/ {8 @" F                }
( [/ _8 V1 w( x% N9 `( g        }4 i5 o3 z6 s# t7 p! a/ i( r4 A
}

该用户从未签到

8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   
4 c  O3 b' [2 s& j1 z) {$ V( _7 ?你就按照我上面写的程序接收就可以了
1 B: L+ ^! R$ f: y应该没问题  其实是肯定 哈哈

该用户从未签到

9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   
# I( F; [0 [6 f* S6 d7 ^5 }, H你写的我等下帮你修改下试试
, E" c" o% i: F0 s不靠单片机谋生的   不是专业的

该用户从未签到

10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 1+ ]  T5 _7 S& T& h' ^
{
2 B4 I' G7 k9 e" D6 E1 b$ E  b* K    unsigned char temp,head;( R  ~/ Q) R4 N1 h3 E3 r6 X
7 J: q! G% L5 P0 M; G4 }
    if(_testbit_(RI))% d/ {+ c8 }8 C& l+ u
    {
5 |* X6 _" _% K" |& L        temp = SBUF;
# Y* L5 e6 A( m" ~        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));7 f/ d+ Y$ N( J* o5 J
        if(head != uart.rx.tail)+ ~& K7 T8 i5 e4 o) [3 e
        {
7 R- h6 f& K& ]. Z5 ]            uart_rx_buf[uart.rx.head] = temp;9 |5 |( V; r. K2 g
            uart.rx.head = head;
% T: K' S, f1 Z; n4 b7 p+ m        }else
. F8 ~* R6 j$ z% L) J! k# i        {
& a0 D5 n, F3 l: s6 L& X; P7 d            uart.rx.error = 1;* x8 d* t8 {6 k6 H/ C8 |
        }
7 b% U$ I( N0 z3 N/ w$ M7 q    }
( p' O" `/ E( K    if(_testbit_(TI))
! U# {- _4 `8 g0 {. _" r$ [    {: ^4 j1 t3 g6 C! F& W7 l
        if(uart.tx.head == uart.tx.tail)
: M" }" _8 h5 K, W        {) \8 p% ]6 x9 h0 o+ u* k
            uart.tx.busy = 0;. X+ [3 O1 N1 }' N
        }else% I2 b$ E5 {/ C" r
        {- D- A( O5 S, k; P8 B0 R* v- z
            SBUF = uart_tx_buf[uart.tx.tail];
* u3 q: J) [& F, ~9 r            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
" P* p$ [- \6 q" h/ V        }
/ _# }8 T! ^& v( e9 r+ E3 g* Y    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-9-4 11:43 , Processed in 0.140625 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表