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

c51串口调试问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
想以这格式读输出板寄存器
3 {8 t( g8 p- K6 s& P1 o/ W0        1        2        3        4        57 a& Y% c; k: w. G% |/ @/ K
                                        1 J' a+ {9 @  o7 _
Byte 0:固定为0x5a
* e7 o! [8 o2 q: v2 UByte 1:传输字节的长度,为0x06
4 y; E4 Q, ?7 }. ^! D) W6 aByte 2:port口
+ _! O# c" {$ _: E) kByte 3:设备的地址;
) m5 d' B+ ]& X0 w" AByte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);4 \! ~6 m" c8 p$ o' P" m3 @
Byte5:寄存器地址低8位(0x~0xFF);! r( ]) @$ f  q3 i* [5 X
例如:5a 06 00 98 00 017 u5 W3 j9 l5 m  T! P
如何写串口字符串收发程序
" x0 y  A/ f, ]请大神指导下,新手不懂的太多

该用户从未签到

2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信  V5 R- j) X/ i8 z, j
你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序3 V* Z# q9 ~! r, {( V
我建议你 还是下个郭天祥的视频  串口通信不难的

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42 9 [) [: u7 a5 s5 @) l8 G
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信& x! V1 Q! p" h6 ]% d# W0 R9 Y0 Q
你要写什么串口通信什么样的程序  我有 ...
6 T9 q. n* t0 I' M6 a
void COM_REC(void) interrupt 4 ! W3 z5 y, V( Y3 C
{
2 F  `5 _1 g3 J) |$ e4 G. |     
2 {) ?( _- U4 ^  x5 R( `    if(RI). [- S6 j0 H2 x$ X8 Q# l* ]
    {    //清除串行接受标志位. ?% p; A, h9 s; D! ?, `5 F9 L
        RI = 0;/ ?  L; [2 D/ [3 C
        rec_data = SBUF;  //从串口缓冲区取得数据! j2 D) g( G: @' w; {, r' f% U
        if(point<=5)
( I; J, t0 C! `  R        str[point++] = rec_data; ! F0 ]; d: [; v
                flag=1;
$ j  A6 _3 [1 m8 l$ m7 p& \; c( W/ \: o# `6 }
    }
. C+ A- V% g( t3 C}
: u5 {+ w; s6 a6 y- |  U* W( uvoid COM_SEND(void)
2 s0 G' Q' ?  E$ Y: n1 C" a{* D1 E2 H; L1 D; J5 c
/*while(flag)1 x6 w5 z7 b* m: w. s# x  J  Y( U
{*/+ w' D0 K6 I* r! F: g) l1 H
for(point=0;point<=5;point++)             //连续发送数据
/ D3 V% Y/ d0 ]. P                                      
1 ]+ X* }+ B7 l, k  x. M; r    {
" X+ T% E2 O& s    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口
2 x9 z- f7 S: `1 c* S7 U1 s5 k3 ~
/ N0 @5 J. O, o        }
% {: B- J8 Q2 p$ ~0 F8 T5 d   // SBUF=Read_OneByte(str[3],str[5],str[2]);# L  n7 `" n1 B. l; S3 l* |
flag=0;    & j7 F  Z; d# M; V2 e5 y
}: J' W9 X5 g: ^' e! x
void main()* b& x! S6 Z9 J" x% V8 O+ Q
{
  b  e1 p3 K" \; ?: I( ]0 H! Q    while(1)
# U1 l+ k% f8 }4 k: Z3 `8 i        {4 b2 a: P6 ]9 b( H( y  K- I
        UART_Initial();
1 v. V% W& {- Z0 b( \! u                delay1ms(2);
* F1 r0 `% W; f) L9 @) U# U7 |                while(flag)2 ?/ M- K# y+ u# W6 K
                {' M: K+ A) v/ B# o% V
                COM_SEND();
, S! ~) ^) m  g7 _; x3 Q8 ~  Y3 B% u                point=0;
; x) C- K$ M5 N8 D                }4 G0 y" s" @" M9 j. C- Y1 F( }9 l
                }! B5 L1 a+ L/ S; }( ]
}. r, \) `" m1 j+ U* _8 @
这是我写的程序,麻烦帮我看看哪里有问题

该用户从未签到

4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候 % I/ x# p6 ^/ p" H- p
接收一个字节 延长点时间  再接收第二个  
7 [3 a- L& w; C$ F* L9 j我写过程序 接收多个字节的时候 不延时不行- w. b2 {8 r9 \1 v5 K
发送的时候 估计也一样  
& R8 o& w: g# z2 `' W7 ?) S我看你没延时 估计就有问题  & K# W. Y3 D* ^& g$ k
你把接收函数改成这样
' q; L9 y5 T& G1 ], {% b1 s$ sif(RI==1)    //等待接收数据7 x5 C, @3 _" d/ G( T3 P& Y5 @8 _3 B6 Z
        {
- ~; ~  b, `2 H- {7 z, V# i( ^! Y                  for(a=5;a>0;a--)   //循环5次 接收5个字节
6 }) Z4 Z  k/ E3 F{
7 S; p0 Q' t- e8 ^          point++;                 // point随便定义个变量 ; O: H+ i8 l# H3 w& a5 M
  {
& g6 {2 o/ g# K2 n: q: R       if(point==1)! ]7 Z( Y3 Q$ i, a5 l& d7 J
{; V7 K& |& E' T9 @+ N2 Q% b; T
    RI=0;/ |$ E/ R0 G6 z" s# Y
    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序         
. Z2 ^9 ~  l; v; H# {  j8 D }7 E: ~1 h8 T0 P
   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写 ; R5 x2 h7 d/ x. n4 q
  if(point==2)+ {3 S3 H8 f/ }& |; v6 L# G
{
' V. S8 n$ n' K% B3 t5 \% E  RI=0;
- u- n( I+ h. d% O  str[2]=SBUF;, f, K& R/ |2 ]" P: B
}
2 V4 W# e' Z2 N   delay(200);: S3 d3 J* r: X7 i& o
if(point==3)) h5 R3 M3 {9 y
{+ r, O1 A# i% d4 X
  RI=0;* Q# s. z% _: l4 z7 H
  str[3]=SBUF;
7 J' T: k2 }5 }* [/ v}
. u- V& A' I' R% Q   delay(200);
: F/ B7 c+ ~: A' G if(point==4)
% @. F0 s/ q, G7 F/ I1 b" Y- W. B{& ?0 Q, D7 d3 D- j
  RI=0;- `: e, ]1 A& ~
  str[4]=SBUF;8 h& v3 [( n: S
}7 H! G) q2 j! J- x1 _2 ^% J
   delay(200);
7 r6 w! J4 O$ B: h1 p' c! y- U" } if(point==5)8 z  ], B5 l2 \  e/ |
{$ d: R9 ?; r5 Y  W% m
  RI=0;
1 T1 m- p" n# X, j9 V+ \6 ]3 {  str[5]=SBUF;* M4 P0 G( m  J' X
}: J% s1 x4 A- Z/ S' L' K
   delay(200);
- Z# v* ]! {, A+ }   }   7 L1 [# e6 i+ q! k
}6 m& ]9 m$ j! f7 E
编程习惯各有所好  你试试看这样可不可以

该用户从未签到

5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多 9 s' Q* M) e* s
在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了
+ t0 O0 r2 y2 ~( Sif(point==5)
7 [' I  w, A9 k5 o7 D( l{
# c! p" _" z+ g; F  RI=0;
# L9 W" E& b& N! @4 o' [  str[5]=SBUF;5 X* l; d4 {! N! Y# t
point=0;
" D, ~9 s. ?6 X2 V" e% S' ^3 z}

该用户从未签到

6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点 0 y2 u; e( I; N8 l' H
我比较喜欢写成 这样  一目了然
' W; ?6 v9 X  s3 p: d% K哈哈  

该用户从未签到

7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52
0 u) j, {  V5 |6 f5 f6 `, A5 b9 B这个函数也可以写的简单点 , m8 i5 G5 Q* f4 W9 E& k
我比较喜欢写成 这样  一目了然 8 @1 n3 c0 R8 R% ~
哈哈

6 w* U& h0 [/ K, h& ^. w% f非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01
7 z, n# x3 v2 c4 O- X# m
6 m- ]3 E8 s, [/ O1 T  N! d#define uchar unsigned char
0 f& i6 j6 `% k. H- m6 t" U8 W% {uchar  port;! @3 e3 I% c: o: G
uchar  rec_data;" z2 t  \- O! [
uchar  str[6];
; H/ w7 F6 c' y3 W$ l7 B5 H$ E! _uchar  point=0;
& `) [$ j) p4 c1 F; G8 ^uchar  flag=0;1 S- a3 t% E1 d# @
//串口初始化 9 ]6 Q; n6 V0 g  h1 R
void UART_Initial()       
$ L, ^3 L( l, I) }4 ~7 c$ c4 D8 i{ ; A, }! w4 N0 Q9 F
    SCON = 0x50; //串口方式1,允许接收9 m9 k7 o2 Q3 |; W2 \7 c
        TMOD = 0x20; //定时计数器1方式2( d/ E# X) T4 x" N
        TH1 = 0xFD;        //9600 波特率 FD  T- T2 C/ B5 x, ^9 N
        TL1 = 0xFD;' M+ e+ Y$ m  V  h% {
        EA=1;       * A5 E7 F1 M. M) m* t
        ES=1;      
- ^" W0 Y+ B' b6 y' f' m4 t        TR1 = 1;   
/ U8 b/ a3 e: E7 b' l}
- n+ U+ u6 X6 }; X2 ~ % w# h' ~) q6 t! |3 b
void waitsend()( B( e' d) I$ t4 U
{
  h% ~6 U' d  V    TI = 0;
- X: L/ r4 s7 J# g9 Z* a, V        ES = 0;* E; U& E. _" N6 R* j
    while(!TI)+ u4 \. \% k& V, W
    {
6 F( a$ S& C. q# U# i+ P7 ]    };: F/ r' {0 s; |0 W
    TI = 0;
* Q; x& j# t! E        ES = 1;, g! a8 M6 ]. M4 m% R3 P0 E
}
1 I, `( W' A) Y) }9 n6 ^
+ h0 f7 N- r2 a: x% Gvoid delay(long i)
( S4 f8 Y& |- h{
5 Y4 r6 C1 \' {. D3 g' G# a( U    long  j;
- j, o- |' L. p8 b3 L  A- z    for(j=0;j<i;j++)
* I  o% u3 p4 h4 U) k1 V2 V. b: L4 ^    {
' z0 T* H: T4 Q! k8 j! \& s! h        SomeNOP();
1 C4 X" V9 L1 I9 G. }        SomeNOP();
0 l6 l3 ^! Q" C6 ]' }        }
- U) {5 u4 t4 a5 a}
6 c% o# K. c2 x' s) L$ H4 a& s" l3 f8 ]6 I5 r) }
void delay1ms(long  i)' b! b: u0 D1 r: j, i0 I4 z
{6 \3 m' |* Q8 D) ^. @: \. I
    long  j;: V. R+ V% _) K7 Y$ u8 F
    for(j=0;j<i;j++)
0 S% ?  g# L) X& ^3 t; s    {. J8 _1 A3 S5 n& M
            delay(70);
9 N4 d7 ]* y% l) H3 a  a2 w        }/ ~: F$ v9 t. ^* L: n9 u
}
" T: [8 z8 E% S3 K0 {4 E, Uvoid COM_REC(void) interrupt 4
- E8 \. N0 ?9 ]7 C{  [' ], a1 L, I# X* \
     
6 _/ T. a0 X3 H* e0 A/ {1 v    if(RI)
; b5 r& p4 @% |; c    {    //清除串行接受标志位1 e" {8 |7 D& R# z! W/ K  H
        RI = 0;
1 e% _9 y1 G" U4 g% X        rec_data = SBUF;  //从串口缓冲区取得数据7 V$ {5 L  t6 }* M
        for(point=0;point<6;point++)
( m4 }2 @0 M* ]! H4 _; }3 S9 X! u                {2 N# \" P0 j+ a* g- N% b2 f
        str[point] =rec_data;
8 S6 G5 z& B  u2 V3 U3 `                //delay1ms(1);1 ?* L9 x/ _+ S7 @+ D0 \# M
                SomeNOP();$ v+ ~3 p% s' u; P  M. x4 m* y
                SomeNOP();
3 j( ?+ q+ j0 e* b4 M                }# d4 w5 H0 X* v% i3 A  @/ A
        point=0;/ c" ~0 a0 b- g2 @  g
        flag=1;* K1 k3 i5 j8 `, @, p
    }
/ c  X) V9 j! R' _}
$ P+ R, V, z8 W$ k: Bvoid COM_SEND(void)
7 t  N0 n- a: X9 d{
) q6 O) J7 T& C: U$ r6 c( i: _4 kfor(point=0;point<6;point++)             //连续发送数据                                 % f+ @' X8 t' U$ n% o; q) ]
    {% l: A; G! z$ a! s7 j# k# q
        TI=0;
& h& e3 q4 {" ~+ N5 B    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口, `& Q* q' b& {. }9 M, R/ p+ U/ w
        //delay1ms(1);
5 D, Y0 z* Y+ ]% ~1 s6 z& C        SomeNOP();! L$ Y) }% V2 J. d
        SomeNOP();8 j; b7 a% Z( E+ n7 d
        SomeNOP();
& P& _+ C/ r: `) V. X1 @        }) @6 v4 l5 ]# @+ G
    //SBUF=Read_OneByte(str[3],str[5],str[2]);( T, |! R) k1 W0 y
    $ Q+ o5 ?: W4 r2 q; M
}8 o/ a  ~; _% X
void main()5 Q" ?6 R1 p$ f4 b+ R$ W) P
{3 S( h. L) H! f* D
    UART_Initial();7 D9 M% V% d7 Z& U+ H
    delay1ms(2);
' y2 M- s! j; s; _    while(1)
" [: \' K: U6 n' f* ~9 c" j  Z    {
* l: W% O/ ~) m3 n                while(flag)
. t! {$ |6 s( ^' @; ~                {$ Y3 X& z& ^5 P4 I
            //RI=0;
4 H- Q7 {- q+ V, U6 ~+ O5 X$ k                COM_SEND();
9 Y( x5 x/ ?) f2 P- i8 w                flag=0;
# [1 F7 @6 i' D2 V6 ?                }/ {! Z3 W+ b' [  L$ h
        }' k1 f3 H1 V$ e/ y! i+ U# X7 n" {. q
}

该用户从未签到

8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   9 A" T6 E. o* T$ k
你就按照我上面写的程序接收就可以了 ( b6 ]) |( J2 \/ F) T) H
应该没问题  其实是肯定 哈哈

该用户从未签到

9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   $ d* X9 r( y8 I7 m
你写的我等下帮你修改下试试% ^) ]$ b$ Y  m& f: T
不靠单片机谋生的   不是专业的

该用户从未签到

10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 1
2 M/ y8 I. v' K- X) z{
; L* D3 g: a' j3 d7 r    unsigned char temp,head;% _" E6 H- T2 q5 P7 U" w4 M
: P# c& o0 c4 v8 X, H, z+ z
    if(_testbit_(RI))! T3 P, T( Y8 ^9 `
    {; L# m- L+ D3 E0 j
        temp = SBUF;
, n" ^2 V( g; Q4 [3 v( G1 Y! _        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
) Y; Q3 Y( z9 f; u) t+ P        if(head != uart.rx.tail)
) t) {/ a, m8 H2 M# K- {8 q        {/ U5 E( h; r5 X, M( F
            uart_rx_buf[uart.rx.head] = temp;
1 G5 S# N' ^8 Y( d) I+ ]            uart.rx.head = head;4 }4 [& b* ^8 s% z
        }else' C9 F& X0 r4 v% `4 z3 C' h: o
        {
' h8 ?# N- X+ D            uart.rx.error = 1;& b/ m  P; n& n- v" _
        }4 U. ]9 O0 N. d' z) o' C9 z0 B
    }
5 Y+ g' E$ w$ l- o9 M. x5 n$ ^( o    if(_testbit_(TI))
9 C# L! H. @9 Q    {1 K! U4 E& B2 h' M% l  D6 ^0 c
        if(uart.tx.head == uart.tx.tail)
, q; d3 Q4 Z& f5 ]/ G. t# F        {
+ f$ p* D7 U5 y- ~0 Q            uart.tx.busy = 0;. X& `, k& I" q; R3 w: E  @6 Q% F
        }else
9 G3 x3 U! |5 d& Q2 H        {
2 _2 i1 H% J9 j! E6 ~4 H4 i. r2 W            SBUF = uart_tx_buf[uart.tx.tail];2 {$ F& Z- P5 o$ Z
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
* C5 x5 C( H2 Y$ s        }
0 C, a9 H. [# z    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-23 14:45 , Processed in 0.187500 second(s), 23 queries , Gzip On.

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

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

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