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

c51串口调试问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
想以这格式读输出板寄存器4 ]: s: Z  f2 S- N" k6 {2 b4 N( j3 i
0        1        2        3        4        5
) M8 a! A. t5 {  Y                                       
* t5 n* G7 u$ A* L; B) f* M1 g7 I/ E/ ~9 fByte 0:固定为0x5a
' J+ L% S0 M! u, _' jByte 1:传输字节的长度,为0x06
0 p7 J% J7 y* k8 m2 `Byte 2:port口1 i. g+ [/ J( ~0 C
Byte 3:设备的地址; $ k! ]! q1 a! Z
Byte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);" G4 d* B; F+ E8 D. W% {8 C; Y
Byte5:寄存器地址低8位(0x~0xFF);2 C! m% r1 t. B! b7 V
例如:5a 06 00 98 00 018 [" d% k/ o0 \7 O& t
如何写串口字符串收发程序
% Q, `7 n% h- N请大神指导下,新手不懂的太多

该用户从未签到

2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
8 O6 [7 p6 I4 a& f& z) a# A+ x你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序) }' O5 D5 f; Z6 @2 B( X7 Q- B3 j! ~
我建议你 还是下个郭天祥的视频  串口通信不难的

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42   ^* A4 o" |3 t8 X
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
7 V+ @0 \2 \( X0 n% j% K. Z你要写什么串口通信什么样的程序  我有 ...
5 Y+ i0 Z2 r/ I8 l8 g7 _- C
void COM_REC(void) interrupt 4
; s6 D8 j. s+ V* N: S' T{
5 k' v; \4 t. \5 c0 `       m8 D6 V7 t8 `% g$ x- y
    if(RI)
7 m* H- ?' `& z! K9 z3 L5 p) u    {    //清除串行接受标志位. ?  F% r( z* K: P% i8 E4 o
        RI = 0;
% v+ `& T4 f8 G2 W, T0 j; k        rec_data = SBUF;  //从串口缓冲区取得数据
& P# q/ i( X) E- T% d. [0 d        if(point<=5)8 L& M7 w& N) z. _! C* M1 v
        str[point++] = rec_data; . k3 z' R- F% ?' ?/ K
                flag=1;
+ t) n5 K+ F( b7 @+ Z5 G1 G8 g. ?0 x! y
    }
; u) y/ W+ c5 q. G! v( T# C3 a}% o, c8 o2 r" j5 L5 m6 S
void COM_SEND(void). ^+ Q- K' O/ F7 W) k
{. _: i% i7 t4 C9 J# v
/*while(flag)
7 R+ O/ i  w! t{*/
% W) _2 p  j. L( t2 c  \& ^for(point=0;point<=5;point++)             //连续发送数据- @. V" i: O% O* ?* y% i  p
                                      
+ n7 ^2 P& U! C/ W$ x    {0 D. P6 h8 @4 s5 l' ~  g  b
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口5 a5 ~9 x7 T0 M9 z& X

, A7 L/ y; L$ B& C8 w7 `        }
2 G8 ~6 z+ y1 ~, _: p/ s   // SBUF=Read_OneByte(str[3],str[5],str[2]);* Y" W- \8 x" o7 `) A
flag=0;    / @/ c1 i% \. J& S
}
: W' W; r, O5 p  K$ D( [& zvoid main()* N! k7 J& y: s9 l9 b: X/ w
{
6 T  r8 Q, i" p$ I7 Q8 w1 j" w4 r0 ^    while(1)5 T' K5 g, }. E2 d# M- b( H* C( j/ [4 A- }
        {' u$ V! F; T9 J. |9 X+ `
        UART_Initial();
7 N& [$ Y0 h) x4 I. l3 r& q                delay1ms(2);9 {$ Q4 z5 C& _. H
                while(flag)
8 C9 X% S5 ^  y  Z- d1 s  w                {- t: [+ r! P6 Q. m. P9 V4 y
                COM_SEND();
3 v$ Y2 ~: v+ E2 Q8 q- Z8 j                point=0;. s* ?1 X6 ~4 ]! [' Y/ U
                }5 n/ h! |; ~7 d2 f& _
                }
; I' w* P$ k8 }7 J}
- X# m6 |/ \# Z* j. H这是我写的程序,麻烦帮我看看哪里有问题

该用户从未签到

4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候 4 S3 Y! n5 q0 C8 i" \
接收一个字节 延长点时间  再接收第二个  7 ?) U1 i4 ?) n
我写过程序 接收多个字节的时候 不延时不行
$ X( r$ P9 H# B4 v+ L2 c' g) S: p发送的时候 估计也一样  + i+ R: ?& g( A& B
我看你没延时 估计就有问题  
3 a8 L+ N" y/ J( l9 R你把接收函数改成这样4 T6 b! {, W9 n. Q8 q+ W
if(RI==1)    //等待接收数据; k* r/ I8 V; j9 Y4 b: B
        {$ l* J" p6 |* R) m* w. I9 Z; p- ^% r
                  for(a=5;a>0;a--)   //循环5次 接收5个字节7 y3 }  q4 D# T+ ~7 g7 P) w! \
{$ V! f7 T/ N! G
          point++;                 // point随便定义个变量   F+ I" p' J- q
  {7 P# E0 K- b' x9 _
       if(point==1)4 Z0 w, D' d7 f
{
( g3 A7 {9 c! |    RI=0;
7 T- K2 \5 i2 [6 h4 Y/ S3 r    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序         
' Y9 {5 P* l8 _/ c) V4 n }8 q" i, c' X/ g6 O7 ^. O
   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写
- ?( Q9 r8 s$ `* a  if(point==2)1 B1 f; u1 D1 I' j
{* ]7 e: l; Z3 ~5 V- S7 B/ D
  RI=0;
$ }# ~0 d5 e. X5 E- j: d- G) [  str[2]=SBUF;* h5 U" o* S0 N# B" Y4 ?+ F
}
  o, Q' f( T# f& s   delay(200);
5 U- y, Z4 n( @7 A) e if(point==3)
- o. m5 K/ J1 |& K{! l/ L6 d) z6 ^
  RI=0;
* R. r% g* l4 T3 R9 Z# @: H7 B  str[3]=SBUF;
, z0 x4 n" r5 S7 O  A6 ?+ D" h}
; i2 V2 R+ J$ d  S. [! p7 c6 X2 f: b   delay(200);3 Y& d" s2 @0 Z; b$ B7 K, A
if(point==4)( I6 N9 p7 B) {& U" k/ k/ L
{
- c4 @. a0 ?1 Y- N3 c! w  RI=0;) P$ J6 c3 U+ _
  str[4]=SBUF;
" ~! Y( C1 R% s% \# Q& ]1 i}. C1 j6 Q/ M! n% b: t$ y$ T1 x
   delay(200);
9 w( S" x# o( |. u$ p4 [; H if(point==5)5 g6 Y6 l7 X- l/ ?. s: N- I
{* G( a7 N' p1 s
  RI=0;7 _. z; R+ r5 c. |9 ~5 u3 s
  str[5]=SBUF;6 v* ]5 O2 R" W1 L. v: B0 _0 H
}& }5 Z' ^+ g7 u; [, ], p
   delay(200);9 J5 X% w7 l( U7 P  f9 i8 G
   }   * Y) R3 y& g3 @& y9 V: ?# r0 X
}
3 Y% Z$ O! K% l编程习惯各有所好  你试试看这样可不可以

该用户从未签到

5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多 - H) b) @2 Y; u8 V# z
在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了
7 G/ q( g2 t2 {if(point==5)5 F+ K% g6 ?% v/ \  w8 o
{
6 S' E" g( Y* `! }% n7 K1 L  RI=0;
6 w1 V# @: ]* ]6 M! h% v  Q: P( j  str[5]=SBUF;
' o4 S6 i( I; Y( j3 h" Epoint=0;+ A9 D) f( n) Q- T
}

该用户从未签到

6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点
. c- U4 ~: v6 r0 u& T2 Q) x( t: J; w我比较喜欢写成 这样  一目了然 ) R1 u/ f9 n7 |) U
哈哈  

该用户从未签到

7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52
$ `" S+ W" ]# V$ {* H这个函数也可以写的简单点 ' ^. @) D  I( v, I/ l4 c
我比较喜欢写成 这样  一目了然
" ~- B6 l7 D4 E9 }, R哈哈
7 s! u* X2 e: p! L4 c
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01
) o5 l2 ?. q( V* n
( C/ b0 @( u( z1 j- F) S#define uchar unsigned char' K  f8 X, z( M, h0 M& ?
uchar  port;
. U5 L' d& Z5 {: I* Luchar  rec_data;# q' I4 e8 Z5 k$ A
uchar  str[6];
% i* `7 E0 g4 K3 j+ E# f6 J+ ruchar  point=0;: B  b0 y$ X$ l7 W1 b
uchar  flag=0;1 `; F9 _! X3 g, @/ c, C
//串口初始化
( a. X: i1 n/ D, E  Avoid UART_Initial()       
1 a0 }8 T) B! X% Z{
" b; w" o# R3 [    SCON = 0x50; //串口方式1,允许接收8 ?+ L: y1 f2 _: y6 d% j& C9 J
        TMOD = 0x20; //定时计数器1方式2  W2 G2 g& ?- @) \# a
        TH1 = 0xFD;        //9600 波特率 FD
1 ~6 f5 ~4 H- Q, _7 ~6 _        TL1 = 0xFD;; f9 M6 `7 D* D: k* e6 y3 `
        EA=1;       % n: ^' x8 b+ [) X+ H+ w* y
        ES=1;       * ^: C. M+ i' C- ?* t1 p
        TR1 = 1;   
7 Q0 g: Q+ n+ m9 c3 J0 J}
; [6 ~, G) p# C3 F5 L0 e
, k5 u; |9 A0 e6 Z% |: w  p6 rvoid waitsend()6 h+ s: k$ t9 _6 v
{" l) r0 M, B- {1 N: S
    TI = 0;
  T) o2 U& }" H7 c        ES = 0;7 U2 j- \7 }$ Z
    while(!TI)
; g- A1 x8 o, E& l7 B    {* V2 J4 B) y7 c2 s& g
    };
1 W/ ~: S3 M* r: q    TI = 0;
2 Y" L: N& g9 [/ f6 `: v. S        ES = 1;" @! h# a+ M$ C/ Q5 T- E  Q, _
}
, ^2 d  |. f% L/ u( ]' G
# n7 @* z2 U1 J3 x5 Uvoid delay(long i), }$ e$ T: I- U- U7 @
{
! J% J2 [- Z: k# D9 n% l2 V. _$ n    long  j;  x0 D; c* Q/ k7 V
    for(j=0;j<i;j++)
. c4 y: I8 {& Q1 v, |    {$ ]6 o7 C1 O9 v. N7 ^% N; t
        SomeNOP();
1 [, g3 e# X0 T  k$ T        SomeNOP();
: O9 t' e' H/ l9 G6 c9 i        }
5 z( l+ X# h! _5 b3 l9 F}+ }4 s- w+ l! p3 ^
, ]- b% ]" z- c- R. o! W- U: E
void delay1ms(long  i)$ M# F' T0 a, R4 ~- b  ^/ J! l
{
3 {9 ^  B$ U3 _( t$ N    long  j;8 Q' i  x7 s7 k2 a$ V! w' K5 o
    for(j=0;j<i;j++)1 y8 y" ^8 e, v# n9 Z
    {
7 y4 R! o  U* E            delay(70);
9 j$ O! W( D$ L        }
) P- d. h7 ]- C4 _  U}- X& t$ x9 L; ]7 \* P
void COM_REC(void) interrupt 4
* }) ^2 A5 c6 o7 C6 g6 a0 e6 D& ~# J{
/ ]) W1 ~! n( }; Z     7 c3 M! n1 Y7 h+ p
    if(RI)
/ @# d1 `/ U0 V  y! s7 W    {    //清除串行接受标志位. w% p) R1 ~$ y8 T2 E
        RI = 0;
5 H, {- k' Z: Q3 w- g5 v        rec_data = SBUF;  //从串口缓冲区取得数据
- P6 b4 C  }% z+ Y        for(point=0;point<6;point++)
" s1 h0 M- c9 e" T5 u                {
2 w& @, W4 u0 n8 D- y        str[point] =rec_data;
) ^/ B! H- H, k- N                //delay1ms(1);9 C/ {7 H9 a4 O9 Q/ f  ~7 t5 C
                SomeNOP();$ |1 {/ V9 n" J  S) c
                SomeNOP();
9 D! c( n7 S, F9 j                }" H  \2 e# a1 ^/ }1 h5 A
        point=0;
6 r% D0 J" e/ j        flag=1;& k% [1 G4 }* E7 p/ b
    }$ I; I# \3 y; }; e4 P1 Y% y3 L
}
3 U; h+ u; y0 d9 r, u8 E6 Evoid COM_SEND(void)
# w1 h$ \7 q* d3 K{( h) Y9 E  D% d! {2 i" F) Z5 @
for(point=0;point<6;point++)             //连续发送数据                                 & J4 C% p3 @6 I8 i# r- Z0 [$ n
    {
3 C, g* L& I7 Z        TI=0;7 f5 b+ f  M; l
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口) q# U* B' e: c( Q, X
        //delay1ms(1);
* B  W0 q- n; q! |1 O# [        SomeNOP();; |7 h0 l# X. f3 f
        SomeNOP();
* m, G) g5 P% O- C        SomeNOP();! m0 j8 I$ w- A* J- U! [  d  v
        }
/ k& ~% L$ e& R3 P; N/ i    //SBUF=Read_OneByte(str[3],str[5],str[2]);
$ |  l/ s0 Q) X: `   
8 k4 l) I) C; f' o1 N7 A}
# N6 z+ R( [; W# o/ z$ Z" Q, ^void main()* r, _# u6 p4 n% L# l: J: ]6 k
{
5 ?/ G* b' m6 T" h5 {! y: g    UART_Initial();
1 K& E$ C1 n4 I# Y& {& O/ f+ G    delay1ms(2);
9 s* B/ `+ K  `: Z( ~) ~    while(1)2 r. u3 W0 _! b" u+ G4 `
    {
2 t$ [3 p  Z& t: q: B- {1 v                while(flag)* G; b, _- E8 L
                {9 l4 X' D! Y$ q% V# }- h
            //RI=0;
' ~( H" V: F5 i. [                COM_SEND();  P- w/ E( P$ {
                flag=0;/ j: J3 P8 I- R6 J9 g
                }
+ o. z0 d0 Z3 Z        }
0 n  V) G$ d2 V. Y) b( K& f. ?}

该用户从未签到

8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   
7 C6 t$ a: H* V) w4 w- i你就按照我上面写的程序接收就可以了
( Y  {1 S/ v% B" \应该没问题  其实是肯定 哈哈

该用户从未签到

9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   + }& x1 G( @3 H
你写的我等下帮你修改下试试
4 g# d  y4 ~/ ?0 \不靠单片机谋生的   不是专业的

该用户从未签到

10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 1. {$ Q, \6 t# i+ C$ |! ^2 ], H
{
7 l6 u; B1 K3 K- T) g5 L- A    unsigned char temp,head;
% N6 M: F" j9 j. `% p- N( Y1 C' [( g, Z! j, l: P4 w8 j) G
    if(_testbit_(RI))
" ^, N9 R: r; o& u. N    {
# J2 F, K( c% Z7 b; d        temp = SBUF;6 f7 W% G. Z$ x' ]- C6 p4 R. ^1 D+ W
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));. m% D* D. g; F: z/ [
        if(head != uart.rx.tail)# c( Q) J& D, E9 W5 k4 S' {
        {
" ~% s+ i7 e, i) G            uart_rx_buf[uart.rx.head] = temp;4 I4 S2 g7 F1 _& K
            uart.rx.head = head;& F, V' i  R: ~" k- C0 o6 }: h
        }else
5 F, ~" M% b% O% G0 [/ m" G/ o        {
# v3 c4 `& v* l            uart.rx.error = 1;' c) K' \; T- S# r! L7 N( f
        }6 Q+ p; s5 ~+ {8 V  @) Z
    }
% M, p8 @5 Q+ w+ c8 l- P  J    if(_testbit_(TI))9 ]: \; S# u1 M  Z
    {# `1 y! y" L% b2 v) U9 h
        if(uart.tx.head == uart.tx.tail)
1 _; }% Y( K& A* G3 S$ G5 J+ H! C/ l        {
3 {5 g7 K. x( Y' Z            uart.tx.busy = 0;
. Q1 q* N; f2 \/ Q5 e+ |        }else. X$ K* R  ]6 Z# \8 v
        {: b" B3 R) d$ a# l
            SBUF = uart_tx_buf[uart.tx.tail];/ ]' R3 Y' {. K% N
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
/ x" y* k. t. `, z9 t        }
# G2 Q0 @7 y7 D! R/ h    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-10 15:03 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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