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

c51串口调试问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
想以这格式读输出板寄存器0 s9 Z8 L: b* V. q7 |0 h! A6 ~
0        1        2        3        4        5- ~" S/ N% j% q
                                        " I2 K6 k. e  ]( p* ?8 k: @
Byte 0:固定为0x5a4 u$ Q7 ^- c! n/ k. t+ d$ K
Byte 1:传输字节的长度,为0x06
" k0 b1 M' |; k% VByte 2:port口. N4 X  |& M/ w3 o
Byte 3:设备的地址;
! n: n2 U/ V4 [1 qByte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);+ R* c6 S; G; Z6 q' a/ J  p
Byte5:寄存器地址低8位(0x~0xFF);3 O8 o7 d6 S. P. y/ T; b7 x8 Z: U
例如:5a 06 00 98 00 01
; M4 y) m+ k) M( h! @* ~4 K' ]如何写串口字符串收发程序, y7 l- e, x  k% W4 ?
请大神指导下,新手不懂的太多

该用户从未签到

2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
; O6 l3 I. j. |' t4 c5 h7 F你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序
) C6 C2 n8 d' t我建议你 还是下个郭天祥的视频  串口通信不难的

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42
* }3 |0 c8 W2 G$ G- V你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信. e' s) R- p+ w" m. I8 w
你要写什么串口通信什么样的程序  我有 ...
! t5 J: ~8 f' i3 B/ t
void COM_REC(void) interrupt 4 9 G# k5 b2 b# V0 h' v; I+ `
{- S2 u7 h6 t# e' I! B9 V7 ~
     
, B' Z+ U+ }# V  _1 v+ w0 ~    if(RI)4 h# c) P3 B7 ?0 n
    {    //清除串行接受标志位
" J. Z1 O9 Y; C- }1 Y        RI = 0;
0 ]' a7 L8 |. r; M! l0 C, k        rec_data = SBUF;  //从串口缓冲区取得数据5 u1 l* X# b- I
        if(point<=5)  Y) L/ v& ?( t0 |% I% o
        str[point++] = rec_data;
% k. ~: M- b* I+ R  n2 S! |                flag=1;
* f5 J7 B# J, @. i8 ?$ ]( J7 r: u  d7 R0 G
    }2 o9 R4 I0 k$ z  ~
}
" Q% O' d3 {4 D, m% s5 ]9 mvoid COM_SEND(void)8 x3 x+ @0 G2 ?/ {: s
{& b9 N% F% b* s* P* |
/*while(flag)
8 z5 E8 N  ^$ ^, L2 w1 T, C9 W{*/
+ F& ~0 T) p6 O+ rfor(point=0;point<=5;point++)             //连续发送数据" G% _/ t4 b" w( S* D/ S
                                      8 n- S8 W$ m/ a. L
    {
; q* n* v; M6 u: T+ |    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口
) w7 Z5 j' B" _. ]# R: k" g  t5 c  C! o0 T1 L; ]
        }
- b5 U0 Y# q) t% s. }1 j$ I* d   // SBUF=Read_OneByte(str[3],str[5],str[2]);. l2 \, o5 k8 c. r
flag=0;    - y6 N3 V) ]- O: I! a+ P
}
. F7 v2 Y" g. X- l3 `( rvoid main()7 H) Q% s& i" h! e) \6 k- n8 h# P
{
$ R3 l9 j7 n+ z    while(1)7 T1 Y/ |" ~& P8 v" N6 c: U
        {
% N* {0 I0 ~" u8 ?" Z        UART_Initial();
' q+ e6 X, J& Y& D: a9 b3 A                delay1ms(2);3 V" G1 e( ]6 h. V! _
                while(flag)
7 o0 F& ~% V1 c% E8 }) r4 o! M: p                {
' R/ F% C6 Y2 A                COM_SEND();
8 e7 b1 h0 j$ x' j0 k                point=0;) Q; M, @0 C: |7 f# S
                }3 y5 l7 ]0 F- Z2 H7 Q
                }0 X# Y! m  F6 k2 w
}
: D$ j* @% l( Z& G9 }这是我写的程序,麻烦帮我看看哪里有问题

该用户从未签到

4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候
& |9 }2 K/ E( F接收一个字节 延长点时间  再接收第二个  ) w% j2 b* R4 |  f* o5 e- q$ c6 i
我写过程序 接收多个字节的时候 不延时不行
& z7 _7 l+ v8 I" l发送的时候 估计也一样  
) K# L( O: e% W5 M/ x我看你没延时 估计就有问题  
' ~* q/ {* i, [" N1 C4 W你把接收函数改成这样
" U1 N5 P2 a; ?% pif(RI==1)    //等待接收数据
* a# Z+ N/ K5 T" z7 H- \        {$ V0 R" @# k% C* C6 a" u2 P+ A
                  for(a=5;a>0;a--)   //循环5次 接收5个字节
; o6 ]: d9 ~+ y2 v! T{( `# S& ~4 T1 a0 h  e
          point++;                 // point随便定义个变量
6 c. V% w! `, I* K" P1 D  {
9 w' K# p* \6 W& B# e. ~/ p1 ?       if(point==1)0 S1 c# O: x) }, B  i" W1 k* H  _
{
* L1 }6 W+ e: {$ O: |9 T% P% F    RI=0;
. W8 w+ A7 l) B6 o    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序          ' ?# n+ k- [8 b& @
}
- g/ r+ o+ J( ~2 Y   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写
7 l2 U& L8 Z# g6 u& \  if(point==2)
) V6 ^0 N, `6 l- u" ~{* @# _& h  `5 _3 x. F  `
  RI=0;: z. P9 @' D( V# A, R" }8 w
  str[2]=SBUF;" y: K9 l: S  U* ]$ \2 c
}
' C3 w3 a6 X% @4 F   delay(200);1 d# |) ^) M, c, j' R5 v: W$ U$ g
if(point==3)6 O: M2 J' M: d0 z( `+ J" K. y' Y% Z
{2 U* q. _1 f" S( }  o
  RI=0;4 s0 ^  U1 D) M$ |9 I# X/ _/ K
  str[3]=SBUF;
& J. Q5 U; J* j}( K: s& h0 E2 N2 K
   delay(200);! o  ?3 r( A3 \3 r) e
if(point==4)) u3 @! i* ^1 v; U* f6 e5 V* S
{
* f# i0 C7 P, F* Q2 t: S  RI=0;' ~, v& `/ z1 g7 Q" o( E9 c1 r
  str[4]=SBUF;
2 ~6 x( X  z: o" ^" c}
5 B% s: K5 |. ~" l( G* O   delay(200);
! M" Y; r1 E  ^  W9 Q6 E) [' C# v if(point==5)
7 M8 {: W3 G: A{
8 D( i! W; g1 Z  RI=0;7 N* d  W* e! U, n' m: m$ Q
  str[5]=SBUF;( ^% h3 Z( Y- m5 _( F. s$ I
}
1 ~6 {, F, ?, K" ]4 c+ a   delay(200);
$ G7 ?$ |) K% s% g' M$ H& N  G$ y( [   }   
' }6 E% ~$ X3 o# u+ h}
# k9 b/ h: @; q' s, C& _7 p编程习惯各有所好  你试试看这样可不可以

该用户从未签到

5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多 " h7 U9 o9 w7 a, [( U/ [
在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了2 z+ s& V$ T& H) t/ L6 O& R
if(point==5)
2 r4 H4 U2 @- C( b4 d0 T{" u9 T- w" }# v) \- B# }2 |/ Q
  RI=0;
& o+ e4 S2 v5 ^  str[5]=SBUF;
% g2 L. x9 P3 ?point=0;
" S$ {! o# u7 L/ s! n. a5 B}

该用户从未签到

6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点
, Z: n2 o" K: |$ `% \! C我比较喜欢写成 这样  一目了然 5 i* H5 e. A: }: x$ Q0 O
哈哈  

该用户从未签到

7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52
3 q1 O/ m. ~/ G( f1 J这个函数也可以写的简单点 7 ~4 v4 y; v! p, ^" v3 M
我比较喜欢写成 这样  一目了然
1 Z0 }! P6 {& ]: x哈哈
$ g. ?, n) [7 F4 N4 l. f
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01
- @7 c$ `8 T9 u; W/ N8 C# v 1 v1 l- T& T4 y  x
#define uchar unsigned char4 e0 C, c2 F- B# Z# l5 u
uchar  port;
) c5 A+ `3 u3 V2 e: Q0 ?uchar  rec_data;% r7 @$ k2 ]( \9 r6 R  l/ i
uchar  str[6];
& a6 k. x! {7 j' N* V$ }  Ruchar  point=0;) H- D+ m  k2 T8 Y
uchar  flag=0;
% E$ M$ L: n0 N# _4 s4 K! @/ z& U//串口初始化 7 }$ s' a+ K% j# b/ z# L" H7 O7 x
void UART_Initial()       
1 a& I% K- z: m; k3 \{
  ~/ J8 K/ t1 J    SCON = 0x50; //串口方式1,允许接收
* b# V1 L2 X- n( v7 q) B( p- _        TMOD = 0x20; //定时计数器1方式2+ _" ?; W2 H+ b& n" }1 C
        TH1 = 0xFD;        //9600 波特率 FD
$ n; }' J8 J" o# w. z( C% t3 p        TL1 = 0xFD;
! e' a( v" y' Q3 h- {  `5 t& D        EA=1;      
* [* S# F7 f, z+ k  k3 B        ES=1;         V) b! w! a, J5 C, Y, O( O
        TR1 = 1;    " }6 l0 J" O& @4 N; @
}* N9 Y2 Q3 R7 k! B3 h9 r6 n
$ [/ }4 I" `) w( T
void waitsend()
' g7 Y/ A4 V$ {+ P' f1 I; q{' a3 ^3 |* G: }
    TI = 0; " U' g" k* r( C8 ^7 F7 ]
        ES = 0;
. A8 I! L$ U  d( f* t# f% p! Q    while(!TI)
' n( \7 s# R! J7 S    {
; j0 v, w; D( h  |4 y    };) j3 _, o8 p  Q
    TI = 0;0 _9 C% Z9 ~0 l. f: ^
        ES = 1;
: l: t) _3 a" K( \  i! A7 S}
* f; l5 i5 N- M  f; H
* C# B5 k) i8 J5 }  Zvoid delay(long i)
5 {9 s- }5 u, @- s- v7 G" Y! a& S{
. p7 X% Q6 T$ J  `- V; X4 I5 e1 L    long  j;
& n) G/ z! m% L    for(j=0;j<i;j++)1 v' g: |+ o( [4 _3 x2 X  A* Y
    {( l5 F+ p, \  B* B8 P" G7 @
        SomeNOP();
" B) \- `9 @* M4 C2 x        SomeNOP();5 i' x. e5 X: _7 N1 N! c. L% |
        }
% O( G" ~5 b, P" o- j$ j% A}0 }" z4 V1 Q4 ^7 G4 f
/ G# B) N; \$ K% [
void delay1ms(long  i)
7 C. q' U. M6 Q0 B" P{
* I  q; i9 F2 x- ^/ H' A    long  j;
$ L  G4 U3 A7 E: B    for(j=0;j<i;j++)# \" }+ O* ^$ P  N. ]( |" F/ o& e
    {, I. l; s( P8 T3 U
            delay(70);
4 u4 D/ {% H( V) A* U. J        }2 P. R9 ]! h( C5 }1 }
}
+ j8 z/ d+ D! f% a1 u4 w! Hvoid COM_REC(void) interrupt 4 6 }" c# M3 F4 K6 N
{
  q0 F/ i, v6 g9 d+ w     
1 i" L2 K6 c% i2 y8 i+ f4 u    if(RI)
& [; A/ ]  g  r  S) E    {    //清除串行接受标志位+ L7 |$ v, C! ]: v. x
        RI = 0;
8 N3 z6 E7 d2 ^2 R        rec_data = SBUF;  //从串口缓冲区取得数据/ B9 w& S6 o3 \( M. |$ ]4 \
        for(point=0;point<6;point++)2 c  M, J( I2 c
                {3 x3 n% D/ D+ q# q5 Y/ ^
        str[point] =rec_data;5 P" U; i6 n4 r0 J
                //delay1ms(1);
& ~( p0 ~# G" {% A                SomeNOP();3 y0 N. E- o  D! z4 x
                SomeNOP();
+ O& u2 V! X4 S' \  c                }3 U, L8 D0 @% x- @
        point=0;
2 s6 k% S) l6 V        flag=1;
" u: t3 {, i) m0 o+ H    }
! l9 N4 I" ?9 J) N0 b; z, Z}
3 P7 s# s% C" W* ]3 Y4 Cvoid COM_SEND(void); v7 n' K& V9 {! p1 U" Q1 f/ q
{( A- r, N+ j" `7 e. y' e$ M$ ?! P
for(point=0;point<6;point++)             //连续发送数据                                 
5 T6 x6 H, X' O7 d6 R, a    {9 }, O. C' o, l  `7 t
        TI=0;
3 X* F8 s; p% m# F9 G4 s7 P* Y( s    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口( w; V4 X2 F" I: Y. S, S
        //delay1ms(1);
  ?" U# m# O0 h' F+ x        SomeNOP();
! ?! @* T, h6 m  p4 B        SomeNOP();& V9 K* X9 |& {: G
        SomeNOP();
6 Z3 ]& H) D( s5 i; }        }
. k2 u0 L- C: R  b2 t    //SBUF=Read_OneByte(str[3],str[5],str[2]);5 h" a9 c& f% ]& H
   
: |0 c- h! v# ]  N* K; q- Z}) a- U7 X/ i. d3 K
void main()! A5 t, b$ z) v+ ^3 E
{. V3 l1 c6 u8 ?' ?
    UART_Initial();
; Y1 ^( e4 x8 V) Z/ j% B    delay1ms(2);( y# E* l- Y$ j/ Y/ m, K
    while(1)
' _) x0 n! L  a/ E    {
! C( e% a% K; I. a$ U6 |8 X# i                while(flag); {$ W# X6 {2 i, m4 z, q( E
                {
$ V+ l+ C; e! d1 Z            //RI=0;' [: z" G1 P, i1 r; X7 e# g
                COM_SEND();# n! e# e8 F9 m8 ^9 o
                flag=0;
- W( |  p; C2 J1 _4 |                }
# a! `/ @6 O' n/ g, t$ n        }1 S( P6 e6 h4 M. j/ Q" c
}

该用户从未签到

8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   # V0 M( s. M; y" ]9 I
你就按照我上面写的程序接收就可以了 / C" N# Y$ G4 b$ {
应该没问题  其实是肯定 哈哈

该用户从未签到

9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   
) W, n2 A, O4 e% ?0 ^' L你写的我等下帮你修改下试试& V# H( ^) Y2 m9 i7 S
不靠单片机谋生的   不是专业的

该用户从未签到

10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 1/ K0 v: {8 h8 G/ c3 o4 v$ t
{
/ G1 i2 U* p3 b. ^' T5 M- V    unsigned char temp,head;
( i( F, Z5 F' l$ I/ I: n& y% Y& v+ I6 N4 K
    if(_testbit_(RI))+ M! x0 O. m  k1 P3 u7 Z
    {& {+ u! s- f( {7 D
        temp = SBUF;+ D5 \5 R& P- z# W, C
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
4 D/ o! @# d' p% ]- w5 k7 E        if(head != uart.rx.tail)0 p  P, |# H/ z5 M
        {
9 {( z9 I/ m8 m7 u/ u            uart_rx_buf[uart.rx.head] = temp;: d  |4 \" X- ?
            uart.rx.head = head;
# `7 P" u6 \! f* v# f        }else& P& e) X! J  W# o- [' {
        {& M: P0 Z; O8 R7 |' _
            uart.rx.error = 1;
3 p& ^6 B- L2 [4 D        }
/ M- a: z9 _5 \6 b. }7 R    }# q6 W* m  ^5 U
    if(_testbit_(TI))9 v" X3 o& `; i- `  p
    {
2 l* K+ p0 W8 e8 w0 Z8 x; S        if(uart.tx.head == uart.tx.tail)# s, ~. r$ {; L7 R" `
        {
2 L- x' s; R" k5 n1 \9 n) B            uart.tx.busy = 0;; b" z* ~1 T9 G" ~
        }else
0 V( |% }( v. m- b" k- f( v        {/ w% M8 ?! ^5 u$ F2 f" @& @
            SBUF = uart_tx_buf[uart.tx.tail];3 t% X5 C, T- i0 X
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
" Z/ Z; }& W& X% l7 o        }8 |& l: v) @! n3 ^
    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-22 23:25 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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