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

c51串口调试问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
想以这格式读输出板寄存器
# D7 b) H* {* K$ ?  r  ~# l7 j/ i, T0        1        2        3        4        53 ^% G) G2 z4 F7 z
                                       
/ {( ]% l. }3 Y; S+ E# iByte 0:固定为0x5a
( Y4 R9 O# i& r# ~, LByte 1:传输字节的长度,为0x06
2 G  y9 a& m/ {. y# YByte 2:port口
+ Z2 U. S, G" t# eByte 3:设备的地址; . t) n+ z$ T; F5 n
Byte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);1 [) i/ ^7 Y  m& H
Byte5:寄存器地址低8位(0x~0xFF);9 z/ d) q, U: R8 |
例如:5a 06 00 98 00 01
0 E% w! L' u" m+ A; _如何写串口字符串收发程序* S! i- a: {- Z0 e4 f; j4 q- @3 V
请大神指导下,新手不懂的太多

该用户从未签到

2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信% W7 L0 n  \/ {3 m- ~
你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序* S. u. R) p) @) Q
我建议你 还是下个郭天祥的视频  串口通信不难的

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42 $ M" V; @  n5 j* a7 n4 n9 Q
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信: P" y0 v2 E; A6 z+ t5 N' N( q0 ]
你要写什么串口通信什么样的程序  我有 ...
3 w4 _; `7 X5 _4 Q1 Y
void COM_REC(void) interrupt 4 " J/ \" j2 C0 ?" w
{2 H$ {5 F4 E' Q2 ~) X
     
# w9 W, k' _" w& T    if(RI)
/ H& E! M. V/ M8 W    {    //清除串行接受标志位
: D- e7 Z# V- c& W0 K        RI = 0;
0 U7 |$ A/ u% T) U0 }        rec_data = SBUF;  //从串口缓冲区取得数据
  q0 L$ e: A4 v$ [, C        if(point<=5)
/ ?) C2 K  R* e2 n        str[point++] = rec_data; & Z- {( h; [. S0 w  }# m. D
                flag=1;
& f' q% q$ \9 u* X0 ~% `+ q
; W# P0 Z3 ~. s8 }5 P& C% v    }
# D4 R  s  i; E7 W8 Y- Z}1 N  _/ ~! I- m; R, I8 i; O8 y3 H3 H* N
void COM_SEND(void)
: q1 f# z8 ], [{
4 ~) x1 v7 ]6 J, O/*while(flag)5 w0 g6 \, n  |. i' i8 b2 ?! y
{*/2 W# V- s, M  g! Q6 Y: Y. N2 l0 ~
for(point=0;point<=5;point++)             //连续发送数据; D+ {. }5 I. r' B- c
                                      ) r' j  G  T1 @: i
    {) M; o- @* V8 n* }9 T& y. q) J6 l: a
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口3 f9 p% ~6 ^% [# [/ ]" o# I
/ D; w1 L! M* H, e7 g/ N+ T- [5 N8 D
        }
1 r7 w  h2 f" s& b. Q   // SBUF=Read_OneByte(str[3],str[5],str[2]);7 m4 }% U# Z" @
flag=0;    ! m* |, F* g4 |& t
}
& }: w8 p7 P" O9 H2 S5 N6 t) yvoid main()7 M& f6 C% U! `% s
{
4 J( [0 F: l! u2 y+ T. n    while(1)+ m: V0 T3 w- Z4 N
        {# _; y* l# T" h& b2 n, G( Y
        UART_Initial();
/ O2 R$ A& z. _, ?                delay1ms(2);
! ]8 h9 G; S& h% M; N                while(flag)2 l7 T, B" s& ?3 d1 O9 ^
                {
. c  y& s/ F, p* y/ }  K- W% _                COM_SEND();' c+ U+ \+ S& A8 ]6 C
                point=0;- m, m1 j! m9 e5 o
                }( K: `" M" o" s! B5 D2 e3 W4 ^
                }2 J1 z9 M( F( E8 z. w, D, r7 `+ \' |$ {" k
}
( i5 y7 }: k) z: I4 s这是我写的程序,麻烦帮我看看哪里有问题

该用户从未签到

4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候 6 U- M; a# k4 t. l" u' u1 G$ z  x
接收一个字节 延长点时间  再接收第二个  $ z0 c! u4 ?9 f% K  Y
我写过程序 接收多个字节的时候 不延时不行
3 d) R' Q& E! h) x2 P0 n发送的时候 估计也一样  ( S* x9 x  Y0 M0 {
我看你没延时 估计就有问题  % o( S8 R0 v3 ]4 y  u' G1 Z
你把接收函数改成这样
, B0 H$ @8 I$ z) Eif(RI==1)    //等待接收数据
# e' E2 o) ?  X$ Z; Y9 t        {
% t9 e% y9 U% H% m5 }  W$ f                  for(a=5;a>0;a--)   //循环5次 接收5个字节
! J3 @/ P; y# O  X' p. I) C5 g, O1 l) d{
- e8 p. |" K4 ]- c7 ^) i          point++;                 // point随便定义个变量
; K3 C. }* B5 R% p) B* J6 z  {' a8 X$ R! r2 |: Q7 C4 _& f. ~# m9 R
       if(point==1)
0 S- w1 f7 u2 c; g6 Z! l5 Y% c* I1 M{( ~0 ^! ?0 b% U0 ^; O
    RI=0;
$ c  r' N2 V+ N" k5 d  a    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序          ( e# a5 R4 \) ^* J$ P
}* f  b# ]3 `; }0 [1 h' ?
   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写
- q- d; k) j4 d; S3 i: ~  w  t  if(point==2)
$ M( |3 ~% S/ m6 I' N2 F9 }6 [{. ?# L. c2 [/ \( J+ k
  RI=0;
0 ^: i) |4 @4 c: T5 U  str[2]=SBUF;0 D4 N/ d  X$ Z! s3 q2 ^
}  I, R6 \  ]; Y  g9 ]" m! f
   delay(200);& `: O' ]9 V- `$ V$ y4 N" P
if(point==3)$ j, l/ n4 p$ e  {& B
{3 }0 `- `9 K8 C0 m- p
  RI=0;7 ]* y' C3 `) k$ i' j
  str[3]=SBUF;
' }5 s, U% ?; a  F) ^! e}& f8 _( h* g& V0 E: m
   delay(200);
$ U% ]4 r6 O8 \( | if(point==4)
$ a+ N3 g2 }) n8 \# D{
9 T# J! j8 g" W4 Z9 K- C2 [+ R  B  RI=0;4 a& [+ L9 b8 j; G3 {
  str[4]=SBUF;
% }2 _. [* |0 f# A6 _; M}
/ r. {/ j7 E* t   delay(200);& H+ o, k) Z( C
if(point==5)* }7 Q3 u: z' Q" {2 @/ E
{: Y, |5 X+ I; a! f) |1 h% V. c
  RI=0;" O# D! E" v( Z- X. b* U
  str[5]=SBUF;
% z  V6 q2 \' G' Y2 T& k' s$ s4 O}
. w4 U2 _& ^  o4 ]5 i, Q/ x8 F   delay(200);' Q$ l' a+ }8 {* b# F
   }   ' f4 h$ y, O; n9 t# n2 [4 @, D# ?+ o
}
! z  C( W+ a: [( b# d, }编程习惯各有所好  你试试看这样可不可以

该用户从未签到

5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多
2 K& w" x# T! m# w/ y在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了# n  I4 p: ]6 Y" i
if(point==5)
' Q& H4 k* C. A/ M: z{
3 R- ?2 [8 `9 r1 j; s) S9 R0 y* E  RI=0;* M8 I. S2 X7 [7 Y- ]- V3 e, r
  str[5]=SBUF;: D4 q+ J0 c2 G4 L6 M  t
point=0;
+ B. y; X! z8 k5 U) c+ ~  z}

该用户从未签到

6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点
( V0 |+ f2 U  j7 j8 o我比较喜欢写成 这样  一目了然 4 Q' I; E: |, G5 G$ s+ r& [5 C5 B7 g
哈哈  

该用户从未签到

7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52 - ]8 `8 \. l7 K: R4 A
这个函数也可以写的简单点
+ G1 E6 |; z, W( u我比较喜欢写成 这样  一目了然 - C$ l, _7 U2 e$ i4 m* q
哈哈
, R( ?! X5 m, f  O7 s
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 014 Q; ]4 }* [7 b7 I  z
9 B% I7 H8 i0 j% ]' V' }
#define uchar unsigned char
# S- M4 g9 _& J) g' uuchar  port;% y0 w& h- P! t- z3 n* a
uchar  rec_data;
8 t1 q8 S& B( {* Vuchar  str[6];
( M: v! A' r' L6 f7 y7 euchar  point=0;3 Y. N+ @: _8 ]8 b# b
uchar  flag=0;
8 e& E( L2 t4 D  n1 r% q//串口初始化
+ E% K# V  e* b0 J8 q, ]void UART_Initial()       
3 h8 g; o) y& s2 Z$ j9 L' p) M{
, V- _0 ?- e/ J# L1 Q) S3 p    SCON = 0x50; //串口方式1,允许接收
, i( r) X( y% ~2 z% f. m        TMOD = 0x20; //定时计数器1方式2
5 g  l8 s7 H, X3 b1 l        TH1 = 0xFD;        //9600 波特率 FD
# ?2 U: s% X3 T        TL1 = 0xFD;, ?! x; R6 ]5 Z, l! A* L
        EA=1;      
( [# Z$ _; f/ T9 X* i        ES=1;      
. q# ]- W! B6 i( M9 Y' B        TR1 = 1;   
' `  i# G7 H% ^& \}
9 u% A6 M. h) ~) ?
4 ~) S5 Z. ^. M9 |) P2 U5 ^void waitsend()/ o& p* }* U! P% ^, u( N. p* B
{
) Z: F/ w% f9 {; }    TI = 0;
8 X& I; n( o% S$ w        ES = 0;5 _  q8 I: v9 T! W% {- [, I3 L# G* s
    while(!TI)3 }9 u1 c- i% M3 p+ S! y
    {# Y' j$ X* }2 {9 i
    };* Q& F0 K3 F+ v2 g
    TI = 0;3 L+ w# d# |1 y0 B: M" Q, B
        ES = 1;
  u- U# G* D* O- S+ t}
5 A3 @( }, ^) n" n/ X% b
& P" V* L* ~$ E- bvoid delay(long i)) Q. A9 X7 P& q, X4 L3 p4 D5 x
{
! ~4 j+ w: ]  Y; r  x2 Q# i: \    long  j;
/ ~4 i0 E+ E+ U    for(j=0;j<i;j++)
7 n* B4 q/ N, a8 F5 @* x) J    {
1 _5 j  s5 R5 x, q. n2 S6 i        SomeNOP();# ^6 o1 W: `$ E$ M
        SomeNOP();
+ O% s4 q+ E: U* d        }& K! t/ Y$ l8 Z
}
1 O$ }- Y5 F# k, p) B" s/ A' s  W1 R' s* M
void delay1ms(long  i)) P. W4 h" @  i
{
  O% i$ g+ R+ Y# U    long  j;
5 @1 R8 L# c5 F( |0 }9 l    for(j=0;j<i;j++)" ~7 B& b( _1 s" t5 H# e; o
    {4 c& |, V4 P# K0 x4 i+ E* V
            delay(70);# D3 J& V$ b3 ^- a
        }
5 A) h8 |# k5 k, U8 v' s0 Y1 U8 w}
% j1 y- J3 K9 U: ]: `void COM_REC(void) interrupt 4
- D" w" Z, a* G( ?" h( B/ Y  L{
- \6 K7 \" |( M     0 T" ^0 V  E) l; }
    if(RI)
- G- n, Q9 ~) N    {    //清除串行接受标志位$ d9 V5 N5 `5 E* h' t
        RI = 0;
9 X  w* k& _$ a9 Y& I( H: r9 ]  h4 I        rec_data = SBUF;  //从串口缓冲区取得数据$ }0 T9 Y( _; U. K6 F" G
        for(point=0;point<6;point++)
0 {6 M; e8 D, e0 b2 ~" N                {
2 c% J7 O% Z1 s; b0 B& \4 N        str[point] =rec_data;# k/ K' [* \  G
                //delay1ms(1);
4 c) }' N, e% z5 q% h" D                SomeNOP();) J( _% ]$ l0 k
                SomeNOP();
; ^& \0 @) O& A7 A: T                }- P7 `: Z9 K+ [% m( N
        point=0;
. c1 N" w( o6 ]6 Q        flag=1;" a, E9 t& d+ ]# t
    }
2 {( j( e" O4 G) O6 I8 B, o  ?}
  ^, Q% ?2 y/ _void COM_SEND(void)
+ k) f4 A( k1 C) I- ^{8 ^# R2 D, Q1 I4 r' w2 `7 ?& B
for(point=0;point<6;point++)             //连续发送数据                                 
. j5 Z+ j0 U1 b; G! t1 h5 J) W; e$ F    {  L8 }; A$ w  i
        TI=0;
5 y0 z1 D  V6 ~* M% M* v    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口! e+ @3 H5 @- N' o" T
        //delay1ms(1);
0 D/ I; ]6 h1 w5 m# m        SomeNOP();
! J3 N/ E5 F0 ^* B' {$ D5 l        SomeNOP();" m4 g5 q4 n7 v# [. I3 I0 W; |: m
        SomeNOP();  q2 n0 M4 v5 X$ k4 d" [" J4 V
        }
% G- N2 H+ v! w- R& z; L/ O    //SBUF=Read_OneByte(str[3],str[5],str[2]);
/ b! [- ^: L5 R# Q% U    " j9 g$ ~( k' P0 v& P8 ^
}
7 \' r. ?6 c- \& mvoid main()
3 ~  b6 ?" Y; R# F, t* o{. p7 L/ L2 q3 t
    UART_Initial();
6 d& X3 _3 y% }+ o2 O8 s1 U    delay1ms(2);
$ q7 ~$ F  U: U; ]: B    while(1)
5 A2 \0 [7 p$ o/ G) n7 H    {
, ?1 p2 x3 `  ]+ W. y                while(flag)# V! u# [* O- N# R5 W
                {; X' c" C* N6 T8 L
            //RI=0;
$ W# B6 X  w( I0 B' ]4 c                COM_SEND();
& V, }. I$ ]3 v0 l% Y                flag=0;
4 Z1 \& i+ y" T( e( v0 P! L                }7 o1 k# c/ F$ c! M# _
        }
) a  x  W6 M4 i& D+ ^}

该用户从未签到

8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   4 b& i3 `- R4 j
你就按照我上面写的程序接收就可以了 3 }: |8 S, j. u( s' q7 t
应该没问题  其实是肯定 哈哈

该用户从未签到

9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   " g, G0 x! q+ c+ {& o4 Y! ?6 D: N6 E
你写的我等下帮你修改下试试8 [& w* r8 X" A' I  `$ d
不靠单片机谋生的   不是专业的

该用户从未签到

10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 13 g  u9 I4 v6 a. N/ J; m
{( ]6 G( p' S% D2 ^8 ?: S, }) M
    unsigned char temp,head;
/ q/ x2 d" d1 E+ {# B9 b& f4 Z/ P% Y
    if(_testbit_(RI))4 v1 q& \* G7 I
    {$ e+ L; `8 `7 |% O# w9 Y7 [
        temp = SBUF;
' \) ~; o/ c5 y        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
- G  i* A+ m! H$ Z6 M& H        if(head != uart.rx.tail)- k4 a2 p# N! D. [/ z, u9 E5 Z7 k
        {
1 K# m7 V- d- B& D            uart_rx_buf[uart.rx.head] = temp;
* ]( X  V+ O" ?* S            uart.rx.head = head;
, a! g* }: {4 [1 K: E; l# ]        }else
: [( |. w  @  J7 t* b6 ?- ^% k        {$ t1 i* C; H$ K6 a$ j' ^: Z
            uart.rx.error = 1;1 B' I: H3 m: `/ D  i+ J
        }
# ^" o7 W, i, j. s  Q5 m% f    }! j, M5 ~1 l9 |/ V+ [! S* i7 j
    if(_testbit_(TI))+ T/ _5 U/ Y/ y/ e; M- `
    {
! Q, x9 Z3 ?  h- l( S$ S5 \        if(uart.tx.head == uart.tx.tail)
$ }/ p5 `: u, @        {
% {+ o+ `. L' p- S& V2 Y6 s) e            uart.tx.busy = 0;( ]4 D6 N3 P) g- s. i
        }else
7 T) h: x/ c4 O6 A2 n0 _1 M        {
+ Y' o7 }3 G: J& a: q+ }            SBUF = uart_tx_buf[uart.tx.tail];
/ N" h. F0 a' H+ C8 D            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));! U$ d2 T! u: A2 l& }
        }
3 A% l5 W* J" N( S8 O  T4 T$ n9 f" G  O    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-28 14:58 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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