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

c51串口调试问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
想以这格式读输出板寄存器
7 }$ C' _* J* H9 N: ]$ E0        1        2        3        4        5
) }$ F1 Q( y$ Z' j2 ~! x                                       
. i! {( v0 |4 k5 r8 m4 |Byte 0:固定为0x5a- R4 `# R9 }# ]3 A1 f* q
Byte 1:传输字节的长度,为0x06& \* F7 p3 w# @/ A6 R
Byte 2:port口
/ c. G! D0 c+ V  eByte 3:设备的地址; ' Q7 ?7 _" x% z+ _5 o2 h& V
Byte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);
) R2 S. w% E* O) j. e7 SByte5:寄存器地址低8位(0x~0xFF);7 }3 ]% ]! j) k2 z8 j) p
例如:5a 06 00 98 00 01
1 q( X4 V* K$ G6 u如何写串口字符串收发程序( `, j$ ?8 k% }: l3 P
请大神指导下,新手不懂的太多

该用户从未签到

2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信+ v$ L( v6 u  `% _- [1 z/ Y. m
你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序- W, O# ?5 b, v" Y
我建议你 还是下个郭天祥的视频  串口通信不难的

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42
1 T. O. w5 I' p+ `  U你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
  {: o) b- e; Y你要写什么串口通信什么样的程序  我有 ...

2 j; n: ?: m5 r' Vvoid COM_REC(void) interrupt 4   }  A$ l! P6 q  x
{
' |' i9 q5 d2 S- P4 Y2 Q% M     
3 {; u; G# F  v* i    if(RI)
# e) J9 T& r2 M3 D+ L! X, S/ O    {    //清除串行接受标志位
9 j  {: r0 f  N7 w' |0 A) R. o        RI = 0;' M. r* q; l) I5 k& p- k& F
        rec_data = SBUF;  //从串口缓冲区取得数据
! C) B1 r: p% e* H/ Z' r        if(point<=5)
. t" d3 T* l8 B4 U% P* g+ X% L1 t        str[point++] = rec_data;
9 Q% k) G! w( S  G* i                flag=1;6 z6 B: i) J& y( j. X" \9 m; A9 [

2 x* m* D+ {3 E    }
* I6 P/ N0 {! ?  a! ^}
/ h/ x5 n9 W. Mvoid COM_SEND(void)
8 w# J3 c2 \% a8 H+ z% R7 r, |{8 Z( L9 n# E, c
/*while(flag)% l3 v9 F  L; y5 }
{*/8 k. |% w. t: ~1 B
for(point=0;point<=5;point++)             //连续发送数据
1 S: N( g& Z6 P3 d& q: k                                      ) N7 M! T* H' S- Y
    {, \# _. i9 p) ?' f" V6 l  u% O
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口
9 _, X+ V& P' a; d7 H8 Q* F* Y
        }! Q0 P2 D$ x8 c4 \4 Z$ G
   // SBUF=Read_OneByte(str[3],str[5],str[2]);( T% p, H2 I8 A3 w/ A
flag=0;   
) S4 U/ ?; |" w- e4 e8 ], f; c0 B* I}; c. a7 x8 B' L% }/ W( G. x/ c/ N* d
void main()
7 E: x6 Z( l0 Y. L  S& x{6 ]! P0 ?$ f8 j( u6 r
    while(1)4 L+ J. T, U. I# B$ Y
        {
: o2 c6 m  |. N        UART_Initial();
3 {; v' }6 D  N# f( Z9 N                delay1ms(2);4 W( {2 u, G' ~) i' [" L2 Y
                while(flag)1 d( j' g3 q2 I* i1 A% D# ^
                {
& P9 E9 ^2 H$ u( u. v; m2 `  }                COM_SEND();9 g/ O; n: b" U6 G5 z
                point=0;
! W& i0 w8 p- w0 T! v" I8 O/ O                }
9 K+ _& V8 F9 `: r% x                }. U3 Q/ {1 H+ v: R3 ?8 U& V) a
}/ B3 j8 `; ^  \% ?
这是我写的程序,麻烦帮我看看哪里有问题

该用户从未签到

4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候
+ M0 j" Z- v+ [. O- u, S; {接收一个字节 延长点时间  再接收第二个  
2 z. d5 T: K7 a1 v' z0 G我写过程序 接收多个字节的时候 不延时不行
" G8 o* V* J1 A: s1 G* r8 E发送的时候 估计也一样  8 m, j! g+ ^, [
我看你没延时 估计就有问题  
( H" G! |2 j7 X; ^; v* ^你把接收函数改成这样4 L6 c! r6 d9 s
if(RI==1)    //等待接收数据
  H, z' e2 R* T6 o& r; P& ?        {
; ~) f0 s" v; M# m, K9 D/ Y( `                  for(a=5;a>0;a--)   //循环5次 接收5个字节
3 E, M9 O* j* U! C{
* u9 z5 z( d( A          point++;                 // point随便定义个变量 2 _; X5 t) n# ]2 L8 G
  {
& L& P5 m  @6 h7 ^9 U       if(point==1)
* _5 L* r( P( u  |{
* I9 u  W: S0 C0 \3 s& R    RI=0;
# J/ f' P* W& y( D  k! F8 t    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序          ; ?. r  `+ j; ^" D. \
}
! G; i, S. P, r* I  Q   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写 9 h; c7 Y# u% m' O7 C  {& _
  if(point==2)
3 w6 G( F9 a3 C{- _2 j% d/ x/ q9 U
  RI=0;+ }& `8 [, v9 G# A
  str[2]=SBUF;
! L9 C% x3 K7 o2 H% Y7 u# ^}( V2 s5 ?& I+ h; S. l$ ]( J4 f  }
   delay(200);& c0 x2 d& N; W9 P
if(point==3)
, V2 g8 r0 B* F3 b6 s! i{
* t7 @7 [! G& g7 l  RI=0;% @' r* o3 E: T( B( i
  str[3]=SBUF;% @" N0 b9 k6 I# b3 p: G$ |
}
# \/ n% F- [9 k( R   delay(200);
: K7 l8 W: z$ `; I; a% G. x if(point==4)0 Z. n( }/ r  E8 j0 [
{/ W, n+ N# E# }6 q. ~
  RI=0;
5 \, A# x. r! ^4 r  str[4]=SBUF;
+ M$ d2 @7 p- f. E}; ?# a+ l, |7 O% L* [& A
   delay(200);% z4 |& y! M2 B
if(point==5)
) ^' a8 J+ s: Q/ F! V{5 m! j* c, w- O  |
  RI=0;
: V4 S7 c2 w  {  str[5]=SBUF;" m7 z# F( ^# F
}
( @' ~+ ]. {+ R! i4 ^4 A   delay(200);
( _- z! _, a. V/ c8 a* g7 V) S   }   ( e+ W2 @9 t1 o2 R& z  o8 O
}
0 j5 }" a: o0 v编程习惯各有所好  你试试看这样可不可以

该用户从未签到

5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多
( U/ q: y: x8 @在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了
4 ^) P4 a: L  J$ Bif(point==5)% O# x0 H" U% D
{( f: @% a4 w7 T# r0 u
  RI=0;: Z9 U4 p+ e6 y, T$ X3 [. J
  str[5]=SBUF;
4 z. A' e1 |7 o3 r/ n+ \. H) apoint=0;
/ r# e8 V5 C1 E3 J, e  U; I}

该用户从未签到

6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点 / g' c5 D" {( _9 j- F, O7 Q! B
我比较喜欢写成 这样  一目了然 3 |3 `) ^+ q7 ?( {8 m. m" J
哈哈  

该用户从未签到

7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52 ( j, u8 j3 O& W: t" p
这个函数也可以写的简单点 2 r& _1 Q) Q- q( @2 x. B0 W! i
我比较喜欢写成 这样  一目了然 7 r8 f; ^& \4 u1 F1 L! z) s2 ~
哈哈

! L4 ?4 }6 _" B+ Y8 b( M+ r非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 010 H! Q) ?! U# Q/ v
' Y. O8 t, j5 c" P) F
#define uchar unsigned char( V! |$ ~4 t, E& N1 e
uchar  port;2 H- R% \6 ^, D! ~6 a+ T: R+ [& n9 x
uchar  rec_data;
3 {8 j6 j1 i7 [. y# buchar  str[6];/ W) m1 g0 b  j% f8 s
uchar  point=0;7 }8 {9 f# B1 h% i( K# n
uchar  flag=0;
% p" p; F2 U7 |4 z, q; B. B//串口初始化
& b, B/ ?7 C' j- [; g5 wvoid UART_Initial()        5 v0 a$ f+ Z0 N  m: H
{ : h' H. N( u" @3 ^7 A! J+ C
    SCON = 0x50; //串口方式1,允许接收
$ J. u" |2 c; |5 k0 U# b+ M1 m        TMOD = 0x20; //定时计数器1方式2
" p* P- b; [4 C( F        TH1 = 0xFD;        //9600 波特率 FD
! O+ J+ u/ J; Q! d: j6 j1 v        TL1 = 0xFD;/ x* N" o+ ^7 u
        EA=1;      
- S; X* i* o, ~9 A6 S! x1 Z8 C        ES=1;      
% e1 n) V- P: Z) `8 u/ Z% q$ m        TR1 = 1;   
) N) e; q1 [' x4 g4 g. q}0 E- j$ R9 Y7 c
9 ^5 T( F# @# C% ^  A
void waitsend()
" |" r7 v) L6 C{
7 V% s/ K- X1 S1 _    TI = 0;   p# n5 Z8 g& \+ R7 c' |
        ES = 0;
3 B- Z/ b4 Y" z  U3 ?. ]4 H  V    while(!TI)
6 C  F7 S$ ]8 t4 k8 m5 H! U+ X3 `    {
) z/ b# c! @& [' O* {    };  L$ n- m" M; a
    TI = 0;
4 B+ x& \' C2 a! H  T        ES = 1;. b/ ~; \- ^* M( j: G
}; D3 T* E* H# f* s* M7 u
1 {8 I5 F, m( v9 V" m( }
void delay(long i)
" h, S. Y) G4 A- b' t4 B{
$ I# H- m, C# ]3 V    long  j;
8 x: q- Y  t. }4 f) ^& k    for(j=0;j<i;j++)3 ]  a" K& l- z+ Q  e' M
    {" o8 ^/ c  H3 K4 m
        SomeNOP();
7 R7 q3 C4 |- @" m) Y8 B5 \( n        SomeNOP();
' ?, S8 y5 b+ x* l- C5 n$ d  M" i0 w        }
7 p5 \2 l* |: X! A) R}) M0 L( w% R% b4 f
  \$ o+ ?7 k) u+ ^! v4 {: J
void delay1ms(long  i)1 _0 R7 W  U* L* x
{
' p5 ?. e7 y; H4 `3 F1 d0 \# z  H4 H& p    long  j;& z6 H' i5 X! I- ]
    for(j=0;j<i;j++)& W& j" h4 l6 E( E& i  @
    {
5 [' z/ u" ]4 ?8 s2 G8 u$ P0 w            delay(70);0 r# A7 K& A9 f, w
        }  T( E  p: o, W$ B
}- I. c8 i2 \" B+ M7 X0 g
void COM_REC(void) interrupt 4
: T& K& `; p+ o! ^# u# E% s{" I4 L3 Z2 F  V+ c1 H  s" E
     . h- \7 l3 n$ H6 ^$ Q9 b
    if(RI)
" ^( B# v5 e5 d# K+ H5 p% Y& B    {    //清除串行接受标志位
7 Y. L- s# g: o" y0 \        RI = 0;! e0 k9 u! r, M& C  r2 @
        rec_data = SBUF;  //从串口缓冲区取得数据  i% p: }, e/ J0 s: F
        for(point=0;point<6;point++)
* k6 L% }3 v; k                {3 ^; m7 b% I4 k- K. P2 K  v+ d( ^
        str[point] =rec_data;
" K& }3 o. W. v                //delay1ms(1);6 ~: i0 k5 j2 r) O
                SomeNOP();
  [. v4 \7 M0 l7 `- W! Q+ h                SomeNOP();5 F, C. Z) l7 C6 W1 P  @6 n9 i
                }; P$ S! s( M1 {
        point=0;
) H) P' N7 x+ k% {- d        flag=1;& q6 x5 H6 l; m* s
    }
0 j7 T. |1 n' a- o$ J7 ?}
" }' O, o" [- d2 {5 ^3 o3 `void COM_SEND(void)1 d# r8 o. q- {) ]) D
{+ @  L) A- l2 {5 W2 Z
for(point=0;point<6;point++)             //连续发送数据                                 & k* v) A# |: y1 T! }0 ^
    {- p9 T8 U& ]$ ^4 w: p0 ]
        TI=0;
& O9 r1 {  N. {9 D5 O: L    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口4 Y/ i9 O% {( l4 m8 G! ~
        //delay1ms(1);
/ b3 J  W& l6 l! [        SomeNOP();
% l  X+ ?' W+ `' k9 }7 I7 E; O* l! X7 R        SomeNOP();0 Q. y2 b+ ~# X  a3 X
        SomeNOP();
4 {2 |2 z9 ^' c) f; c! Z        }, K. p9 s* w3 E$ K
    //SBUF=Read_OneByte(str[3],str[5],str[2]);
/ o7 r8 a; ]4 N$ z/ `' O    $ ~5 U* H* J5 w3 e
}3 u# Y: ]/ l7 W, E* ]# w
void main()
  d% @( O% w( ], a6 E9 H$ J( D{8 M0 O  h+ C: H, G4 {# @0 I; N  x
    UART_Initial();
: [; Q: j% K! q" J* i3 d) {3 ~    delay1ms(2);7 C( {7 \8 y- V
    while(1)
- T: n$ F; V$ R    {
) j4 T! |2 L% W3 @$ t4 _' w( p2 g                while(flag)
7 U' U6 X) x% \! {, n8 d& o2 |                {9 ]6 }7 E% n3 ]+ N7 N* \2 R8 x
            //RI=0;
* E2 j) m! ?9 y1 @                COM_SEND();0 g" n7 y: F& n
                flag=0;) O/ j6 X, ?6 ^! a
                }! r7 A, E7 T" A& d! o  ~# [
        }0 A$ O6 s1 U3 Z, k# d- \
}

该用户从未签到

8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   ! }! T' K$ p  j+ L; k
你就按照我上面写的程序接收就可以了
7 b. a" z& Q$ Y: F& R: ~9 F6 k应该没问题  其实是肯定 哈哈

该用户从未签到

9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   + y0 i9 D8 e' v  K" H
你写的我等下帮你修改下试试8 C. s. \% S4 o7 e5 Y, B/ r; L+ u7 _
不靠单片机谋生的   不是专业的

该用户从未签到

10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 1
! H7 L) S1 R# T+ E9 B2 o{1 P( \0 m! ^; j# s
    unsigned char temp,head;1 [( m# j. i9 w' R$ T% N* [" S
3 R4 ~0 i- K, p/ t) O) J+ A7 J9 [1 \
    if(_testbit_(RI))
+ \  q" G3 t4 ]    {/ t$ t9 z- P% B* f
        temp = SBUF;/ s8 u: Q. g; Q
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
6 T1 {+ R4 D8 H2 m- m7 T$ v        if(head != uart.rx.tail)
* F, R# g8 L/ b; W) K        {2 F5 X5 O" r7 R; Q, I
            uart_rx_buf[uart.rx.head] = temp;4 U! X' J5 s) T2 _, b7 ?* v
            uart.rx.head = head;; i( ~. Z/ b- ~. _2 _
        }else% j4 c+ [) Y+ ^; ~2 g4 Q
        {% z" S  i: u* D3 i4 X
            uart.rx.error = 1;3 p9 ~2 C" o3 j
        }4 w% S& F$ S  R0 b) R( _
    }
6 `: e; _: o8 k3 s  X2 O* z2 o    if(_testbit_(TI))2 F! V7 J) i: H4 r% q3 Q$ W2 n
    {. \; b$ m0 @3 b, |0 S7 U2 e
        if(uart.tx.head == uart.tx.tail)- i  I7 @/ y9 }* W4 a' v
        {8 o1 [5 }( b4 O1 Z
            uart.tx.busy = 0;
" V- s3 O/ H+ H  D' S        }else% W. D3 P! t# r: q9 d$ ?
        {
* p) n4 l3 l6 j, m            SBUF = uart_tx_buf[uart.tx.tail];
* K! X; t" ~+ r' ?4 _: Z            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));! |2 c6 X+ o* @( J3 U* Q
        }
% z0 O( K( \3 @. |2 S+ c    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-20 14:09 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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