找回密码
 注册
查看: 1579|回复: 9
打印 上一主题 下一主题

c51串口调试问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
想以这格式读输出板寄存器" H* S" ]9 b$ ?7 R0 {6 x
0        1        2        3        4        5% U4 B0 z- n1 T- _6 V
                                       
- R* u( l0 }5 m; n6 S8 x+ c1 LByte 0:固定为0x5a
8 Y9 R/ c" S# m  [7 tByte 1:传输字节的长度,为0x06
( v. A2 s+ ]; W2 r$ e, oByte 2:port口
5 S* W4 o; S" D, ?& w& `$ R1 IByte 3:设备的地址; - s  I" z. f. l; F6 f2 j) g9 ~
Byte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);
4 p& R; j; a# G* q2 P9 h. bByte5:寄存器地址低8位(0x~0xFF);
+ s$ b$ N  i& h% }7 p2 Q, m例如:5a 06 00 98 00 01
. @$ A( o! ?1 w如何写串口字符串收发程序
& K1 f+ g6 ]! b8 Y- p- v请大神指导下,新手不懂的太多

该用户从未签到

2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信( ?$ r9 T( i0 C8 ^8 j* J/ z. ]
你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序
& _( ~/ y; u/ F% B我建议你 还是下个郭天祥的视频  串口通信不难的

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42
* l) P' |4 o2 `9 c* z1 v4 h你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
1 S$ X. a$ P/ f& v4 ]4 p+ T2 U: N* H你要写什么串口通信什么样的程序  我有 ...
$ K0 S* E4 J9 A- G+ y
void COM_REC(void) interrupt 4
8 Q5 o/ r5 c* P$ H5 Z+ x{$ L- e9 Q  t2 S+ d
     
( ^( t7 ^9 [/ n1 J4 r3 g/ H3 t    if(RI)) a7 O$ d7 V# f1 m+ a
    {    //清除串行接受标志位
; ?) p: m3 b7 e8 r3 e/ U  `" w        RI = 0;2 |7 |7 R/ v. a) i1 H
        rec_data = SBUF;  //从串口缓冲区取得数据( u7 @1 ~, _, y% P8 i7 k
        if(point<=5)
1 J5 F. D( N  t% F! n, e! `: t        str[point++] = rec_data; ' {1 h( @7 _9 ]1 o( C8 R. y) b
                flag=1;
" L  s  E( c. M4 _, X, q$ |5 p9 S1 L, m8 R3 j8 l0 N3 [
    }
8 x" k/ H$ [2 e+ u}# g0 j9 X4 H+ x5 x6 J9 ^
void COM_SEND(void)
8 }# g9 n, w& d; x{
7 S- ?+ Q  C5 D/*while(flag)6 U& F  S: }# Q% B. V+ M/ i
{*/
( E- k3 b( D: `% n$ `for(point=0;point<=5;point++)             //连续发送数据
+ _% L) j$ m( h  Z+ K                                      
2 L% Z- {1 Z' c    {6 [. m+ \2 t3 ?$ f* D# S& V
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口8 x" j- j: |' ^# ~

0 x1 M& n" |' {% U4 C. h, T        }
4 _4 ~8 L9 W- m5 \0 L0 N   // SBUF=Read_OneByte(str[3],str[5],str[2]);
0 p$ ]5 t! x* B9 G$ o5 Mflag=0;   
! z4 Y+ \; d* u}! h) @- ]; n. v8 W
void main()
# L( H0 t8 ^4 |! L{7 u8 O% l/ V4 v7 [' C, p8 o
    while(1)$ k/ n; w4 W. n6 e( A) }
        {4 P% m# ~. m' S/ F! E
        UART_Initial();
0 u0 b4 f8 n' b: r$ N* G                delay1ms(2);! r; c% n" X/ }, M
                while(flag)
) l& N1 f6 E7 e! P, g6 d  F5 ~3 r                {4 |- y; G- d/ [8 }/ z7 F& j
                COM_SEND();
0 Z+ \- b6 z7 x& j4 \; j6 U, z) Q                point=0;' ~' [. _# K5 `( t+ K- ]' z
                }
' R; V, M0 d+ [9 |& {                }
: `! t1 `. K% L9 w7 J}
5 y) L7 M. o) T% X8 t2 U! l, u- W这是我写的程序,麻烦帮我看看哪里有问题

该用户从未签到

4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候 % ^+ W7 z  ?3 d6 K+ y& q  F9 z
接收一个字节 延长点时间  再接收第二个  . X* x) t1 }9 h5 f6 A$ U
我写过程序 接收多个字节的时候 不延时不行
0 u$ q& `+ }  h  r1 ?( i, `7 _0 u发送的时候 估计也一样  
- i3 G' W: I* i  m: {! g1 h我看你没延时 估计就有问题  
# T, M9 W! @9 {你把接收函数改成这样5 M3 `! n' m! E: a/ ^6 d. @& k% b
if(RI==1)    //等待接收数据
  c! y- r/ b4 g  m3 O0 ?        {
' F8 j, f. E8 `                  for(a=5;a>0;a--)   //循环5次 接收5个字节* u8 R# w# Q  Q1 {4 a
{
- K# Z; d: I# _' j5 O# i5 e* R( o: ?          point++;                 // point随便定义个变量 - B) f+ K1 S# V% ^# |3 A" N9 j
  {; U3 i/ {9 Y# M7 L
       if(point==1)5 I! N& d1 b3 }6 B5 c+ O2 L
{
$ b8 q+ }3 S: ?4 v6 o9 a    RI=0;
  n' S$ N$ q* E( a2 I    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序         
+ l8 x4 l, o# r6 N# a }$ k" P% a3 ~( {1 [: I! p! c
   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写
. n# U2 ?0 Q/ _4 ^% c0 l  if(point==2)
5 y, G7 n+ u. D. P! c# u( A& m/ i{) t$ N5 a7 a8 V/ h& c
  RI=0;( w6 d4 R( b# L5 ^8 W
  str[2]=SBUF;  s/ ~) z, F1 Q2 ]
}) n; O: N9 F4 ^4 _( @- @
   delay(200);
9 M  {% i: Q! N$ j9 M0 y if(point==3)& B, M* I" }  @) v; y7 F& s
{% q8 n+ x* U% p
  RI=0;
/ y! G8 x4 m2 A: L; |2 G: S  str[3]=SBUF;
3 i6 Z: s6 @  E* l# I3 v}
/ I+ \& w" s# I3 H7 z: H9 A  w   delay(200);
5 [( m7 j! ~: p$ j" L% X1 f if(point==4)
2 b9 U7 Q+ |: g* \{
5 K- e- A: v9 n2 _: o, }# i  RI=0;: j8 ~* D, b4 }9 L3 f! @
  str[4]=SBUF;4 }2 O4 W: ~) L; n4 y" q
}/ c. _" B) J% }* x4 Y
   delay(200);% n/ `" m5 o3 {; a$ V' h7 O1 ^1 p
if(point==5)2 H% F* S1 ^+ s0 h* v  k( D& e5 j
{
( @! ?  q$ Y/ E  RI=0;
- }- t5 n5 C9 R. e/ ]8 W  str[5]=SBUF;
6 |. D! J1 V2 t- @* Y% _! Z}
4 L; R: G: I4 v! w) |   delay(200);
& L! m: i# G) T) f   }   
8 G4 K9 V( a- R5 k8 w& g}
3 p  L$ ?; c' F, s9 W编程习惯各有所好  你试试看这样可不可以

该用户从未签到

5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多
; A% m7 A) j. ], d0 W5 w, d6 O在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了5 ^+ B0 y% H% y( t; u
if(point==5)
9 o/ S3 g% Z8 N& A0 c- \{2 _) W! {- D  `
  RI=0;- J* T2 |' c5 k) j# p
  str[5]=SBUF;5 l' F6 o. q  s4 e& A' A4 G
point=0;
* F$ @% q6 Z8 w/ g( K}

该用户从未签到

6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点 / g: K, Z2 t" U+ [6 {" V. R
我比较喜欢写成 这样  一目了然 ( i5 F( }% `4 c3 t5 W
哈哈  

该用户从未签到

7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52
2 P- `- U0 B& x这个函数也可以写的简单点 + W) @$ g$ `; D3 i' `
我比较喜欢写成 这样  一目了然
7 C' N8 _; S' I; ~& d+ f: C哈哈
- I% E  T. Q0 _* t& q, y* B8 d# d
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01) Y* K3 U# I  T5 u
+ J* b9 V& e1 U( n% }4 l
#define uchar unsigned char& E% E3 N) O# ^- n7 h' b- }" d
uchar  port;7 s; |$ e: H4 j0 M0 z, \' e
uchar  rec_data;; j! d3 m- T+ u  A9 [9 F  q  n+ e% G
uchar  str[6];
5 E5 _$ M& [$ ~: i6 k/ Euchar  point=0;
# f% Y2 x4 I$ l) Q& N" F' e8 G/ muchar  flag=0;* v6 e+ O  u, U3 k
//串口初始化
0 n0 }6 {! f5 s* svoid UART_Initial()        ' w" G$ Y- [0 C  M* Q
{ 4 p. X, j7 a( ?8 \; h
    SCON = 0x50; //串口方式1,允许接收
7 M& w! t0 ~. A        TMOD = 0x20; //定时计数器1方式2# O1 M/ K! c2 g5 c7 u* H7 P
        TH1 = 0xFD;        //9600 波特率 FD
: I$ c1 z6 s+ _$ E6 u" N8 w& H        TL1 = 0xFD;& z9 V+ A' Q+ U. g3 g
        EA=1;       . t' b; C( A8 R% |
        ES=1;      
6 F! l) K' y) B7 h. u% L        TR1 = 1;    # L$ n' u  {, W/ g
}' |, v( m4 J) h; T* \1 i, h

1 H$ I2 i1 ?" e& K; @; M3 L8 h$ Mvoid waitsend()
+ X" X4 ]1 G* i- j  F, ?{
* m7 L) }% u9 [0 V' o2 P    TI = 0; 4 U  e% S" h* f( X+ J6 ?1 j4 R
        ES = 0;( R$ A" c% m# Y+ S/ g4 |
    while(!TI)# k* g# p; J2 o8 l8 x. N7 ^# h
    {
' X3 r4 ~" o5 ~6 q    };
; {; l. l9 K) G) Y# B( p0 H! m    TI = 0;- J) P' u; h' g7 s
        ES = 1;
. E% c9 s. d% Z7 ?3 o  N9 N}4 Y5 t- [' a3 O; ^
9 i& b% Q- a5 t/ q( c! j- I/ z: w
void delay(long i)( C  ^8 H$ P8 f, Q
{
; k/ G5 K! F1 K    long  j;
# N  {4 ?9 U5 o- N    for(j=0;j<i;j++)- ~" V* V, M' A6 m% g9 x
    {" S8 n8 C' s- {3 j3 g# f
        SomeNOP();
* _- A1 C, x' r+ S+ L- s        SomeNOP();" s, Y5 Q. J  u$ u9 |" X8 _
        }
0 l( j4 @  \3 w; F" H}
) g8 T- [& }0 Q0 n' D1 ]) W: M( G& X, p; B+ j' z- C+ b; m7 K
void delay1ms(long  i)9 Z% {. P' T5 G6 B6 z) Y
{% s, T9 n( J( c
    long  j;* ~% }9 o" ^4 @' G; l& v8 X
    for(j=0;j<i;j++)0 S; S& h, U; F; V7 z+ V
    {
; s& s8 @/ G8 }- O6 S9 ^4 \            delay(70);. I% H8 e2 U* K* Z- `' M& e( t% N
        }$ u9 G) [2 a5 \* j( y/ I9 M
}
3 V( ]" O" @& j5 ?void COM_REC(void) interrupt 4
9 Y3 E% v& H- F0 H{, f8 I8 X  y8 p- U6 |
     
0 R% y3 ?5 f6 d8 ]5 E2 L0 t    if(RI)
  s! D' q: y* {$ T    {    //清除串行接受标志位$ B! S$ m! Q  k0 O' e
        RI = 0;7 b$ |0 Y% e' L9 Q
        rec_data = SBUF;  //从串口缓冲区取得数据
& f: X! t2 S0 v4 {! L        for(point=0;point<6;point++)
) i: b2 E6 c$ G* D                {
! T6 x$ U1 b0 P8 ?" U. V        str[point] =rec_data;
3 C7 U  p( E. q! R5 X                //delay1ms(1);
2 @2 O* c5 d- A                SomeNOP();( s2 V# g5 g9 ]
                SomeNOP();5 U  a( ^5 d( |( q- r* a9 X! }
                }- c* ?. z& c* z3 ]3 {3 |
        point=0;: P  q. _( Y8 \7 P: v  J$ \
        flag=1;; G% [( c, J; Y" [$ a! e
    }; m! K3 e/ f& H1 h! u; X3 ~
}6 @* a+ M" x+ {3 G$ \
void COM_SEND(void)/ U6 ]9 k- d, {
{
% }  \% m& a6 s; a% _" [( Zfor(point=0;point<6;point++)             //连续发送数据                                 
& K# o2 O  ?7 t% v4 ?. H4 G    {
! [9 ~8 h9 z, u4 b- m        TI=0;
% z5 m5 _' D$ A" b+ V5 g$ o: P6 P    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口/ c. f# Y% j2 B0 X) d. F- a; w
        //delay1ms(1);
0 b. H8 p1 u" H2 _0 [$ J. `        SomeNOP();( g7 ]$ S, U2 _; s
        SomeNOP();* g! v8 W5 v) r% T( ^! J% B
        SomeNOP();
# I1 _9 O9 b& v8 I. }        }
. N8 [0 Y7 f% Y* u% \    //SBUF=Read_OneByte(str[3],str[5],str[2]);
5 X% q& s: ?. S; p: f    * A) I) z7 X( s
}
# ?$ x* j5 I0 @; zvoid main()
, ~1 ^* b+ f$ ]# Q3 q5 S{
  Y- O: z9 ]1 d4 R6 U    UART_Initial();
5 s' Z/ k: S6 c$ z1 ^    delay1ms(2);5 |7 x, c' C( }/ ^& E  J
    while(1)
3 {: J5 Y4 |: ^9 G3 [( h    {4 X( p2 j7 D; U
                while(flag)5 J% m# E4 {8 M/ G6 c+ R& l
                {
' X9 s: v2 B6 w: l; Z. f) L3 H            //RI=0;
8 B: S$ H& d4 W' y& S                COM_SEND();. v) g: L$ V) i8 g* h
                flag=0;2 B1 P0 o) S. ?( {0 L* P
                }, j- G* y- a2 r0 B
        }
9 G; @  L1 M+ H}

该用户从未签到

8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   
7 ^/ F; ]- A8 P, c1 N# O你就按照我上面写的程序接收就可以了 / r# F2 q) l- l: k7 W" U/ [( O
应该没问题  其实是肯定 哈哈

该用户从未签到

9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   1 q& f% Z0 z3 y1 P
你写的我等下帮你修改下试试# U( v$ \6 f: E# I( X6 \
不靠单片机谋生的   不是专业的

该用户从未签到

10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 16 V. q, l. i% C9 U- h# I& O
{
2 {9 W9 i$ `  M3 D5 R* G  _/ T    unsigned char temp,head;
" Q  j1 |: n1 J$ P* B  k) F/ Y8 Q+ f. `" Z7 z. q; o. {( F
    if(_testbit_(RI))4 @  _* A: r. m; G4 l) B% R
    {
/ z* I! a% [, L7 Z        temp = SBUF;
6 R/ H. M+ ^# N( [  {* i2 k' E        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
0 L+ R8 D- \" q& l        if(head != uart.rx.tail)
# h% t2 M; J; \  t        {
0 C6 P' `+ ~  Z0 \            uart_rx_buf[uart.rx.head] = temp;* p/ j3 y# I/ \: j7 U
            uart.rx.head = head;
: f5 j3 G3 ^' Q3 O! P5 `: p0 W        }else0 U) U( g/ j+ E) y4 M; x1 E
        {% `% P$ T) l' _. C$ Q- r; s
            uart.rx.error = 1;
  h2 l$ q2 L: \        }
1 c* Z1 q* J+ Q    }
+ U. U* ^- P3 n  Q7 U+ d    if(_testbit_(TI))8 d% a) P4 K6 P2 V# j9 i' `+ z
    {# M: ]2 U8 P" E7 Y1 @, d. J
        if(uart.tx.head == uart.tx.tail)
# e7 ~. |4 Y! z; v        {  n2 m1 y5 F! U0 T9 n
            uart.tx.busy = 0;
' m9 g0 _8 a/ s$ K* P, E        }else- M' I( E* [( ^% j9 g, o
        {
9 c* k* I& p3 l  D* e* w            SBUF = uart_tx_buf[uart.tx.tail];; d4 _; F9 C* r) e2 B% r
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));: ]5 p& f( p6 R
        }
: ~2 I  a: Y6 a+ E$ n  u: w+ ]0 [) m& M    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-3 09:02 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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