找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 1105|回复: 9
打印 上一主题 下一主题

c51串口调试问题

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

EDA365欢迎您!

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

x
想以这格式读输出板寄存器2 A+ }  V& u5 p: H8 y' x& p
0        1        2        3        4        5
$ `$ q* E, ~6 J; M+ {8 ]$ q                                        $ Y. @# |  L9 I. n+ R5 `- c
Byte 0:固定为0x5a$ N' D) e/ v* Y% C  K
Byte 1:传输字节的长度,为0x06
6 `3 \  U$ R: N: NByte 2:port口
; c$ G/ [1 Q8 y( I& l; j% wByte 3:设备的地址; . ?4 y2 K& _  `, i1 p( T' W" u
Byte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);
; j9 H( M! }3 {, j) |! B" ~/ eByte5:寄存器地址低8位(0x~0xFF);  }; C- A: q7 s$ D+ a. y
例如:5a 06 00 98 00 01
& b: r( H( y9 v, W5 y: J6 `+ T+ n( S如何写串口字符串收发程序$ r% X6 |3 d# O5 Z% U
请大神指导下,新手不懂的太多
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
) a+ n$ J, r6 V* n你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序
+ w7 ~& q; C, s- K我建议你 还是下个郭天祥的视频  串口通信不难的

108

主题

498

帖子

2289

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2289
3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42 8 d* ^) P. y8 h' s$ `$ G+ P; F' f
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
# y# ^  c4 @/ ?. J8 A你要写什么串口通信什么样的程序  我有 ...

0 h( ?9 @! T! p9 }, o- H& |" Gvoid COM_REC(void) interrupt 4
8 k8 _  |3 r; _; e' g{
+ i7 F# A9 g5 ?0 `2 i) x     & M, w5 v6 `. y* P: H$ i
    if(RI)
: j6 k, p- a7 }5 u, {: w9 J    {    //清除串行接受标志位/ [" P; K2 B) N# h. x& L
        RI = 0;& M; u; n2 d, z7 H
        rec_data = SBUF;  //从串口缓冲区取得数据
1 E/ d, [5 Z; p$ }8 H5 w0 o2 D3 n        if(point<=5)
1 p5 g; X! n* ^        str[point++] = rec_data;
& G- k+ Y" F, G. i+ L5 v/ |- m1 h                flag=1;
$ u4 t  k; L' Y1 W' j# v$ w- U( |  h  X4 I8 i1 S1 x
    }+ T; p  `7 k) Z; L
}2 r1 t; u, n- n- W
void COM_SEND(void)4 H7 L6 {7 [4 X4 O) [! u. z  z
{& h- L* o) ^$ ^& q3 X
/*while(flag), w# B# b$ q0 U5 ]* m# B9 g
{*/
5 w* ~$ B& y4 T0 H* z/ _, Mfor(point=0;point<=5;point++)             //连续发送数据! ~; ?0 j+ n! b: s
                                      
* \, B( @3 W/ Z3 R+ ]    {4 p& C- a5 G1 K) {. ?
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口# }- Y) |- Y% G! u" o% I3 P5 }/ V
+ w/ P/ L8 {. l& P* W8 M% q  Y
        }. }& Z( M9 m2 \' q4 Q3 s' k
   // SBUF=Read_OneByte(str[3],str[5],str[2]);
) Y. l$ J$ n" V9 N$ x* U" f1 `' hflag=0;    $ P% d7 Z! e* N0 t# T2 Q) i
}
4 f0 x2 a$ S/ H- a' J' f3 P5 x9 wvoid main()* }# _2 c( @$ q8 I/ Q
{4 E& h6 }: ?% P7 [9 {' i
    while(1)
5 q7 s0 Z4 Y2 O+ n7 e        {
9 S3 x! W/ D3 d( G* q        UART_Initial();
" s" m6 X* A3 n% ~                delay1ms(2);/ {2 N; d4 }7 F0 h- Q3 |
                while(flag); t6 h( ^% p2 Q
                {8 Z' j- k0 G+ m8 ^, u
                COM_SEND();& e& r4 B7 D- b
                point=0;
, b8 h6 s- ^! S% T                }
; K% @7 `/ ^$ R2 ?4 ?' i% j                }3 f7 A+ e" }6 d: s+ o
}
: g2 M# e, O+ Y# s这是我写的程序,麻烦帮我看看哪里有问题

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候 2 C% r: p0 |+ |+ ?6 G
接收一个字节 延长点时间  再接收第二个  
- q' e* l, X3 l' ~, V' f2 \我写过程序 接收多个字节的时候 不延时不行: `/ p! Y+ U% O
发送的时候 估计也一样    h/ n; ^+ g4 s! P& }* q) N
我看你没延时 估计就有问题  1 C. ?$ ]- g* U, \1 y. Q* b3 w
你把接收函数改成这样# B) R- b4 c) S. h
if(RI==1)    //等待接收数据" Q; q" R6 |. W
        {1 t( M! I! l$ U0 d
                  for(a=5;a>0;a--)   //循环5次 接收5个字节) |2 ?+ t6 ~$ x
{/ r5 `, R& t" E$ |4 w( O$ n
          point++;                 // point随便定义个变量
; s1 {+ T+ G7 g0 M0 x  {
9 r+ W* v" e( H+ b       if(point==1)2 ^5 n/ n! L- E+ n7 Y% @2 v
{
* Q1 _) q0 S. X2 v4 K( O) _    RI=0;  Y/ [+ [# G4 q8 C6 ]! o$ `
    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序          3 \- ~+ m' V$ r1 H
}
- J$ p3 A: r% w  n" K, O   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写
. q% i( o* \+ {8 Q& D  if(point==2)
! {% `3 Z# ^& X! b/ b0 D{2 A" l# u. R* N; X. m! T$ i
  RI=0;" G/ b; ^7 U/ s' A9 ^
  str[2]=SBUF;$ e- k2 J' s! q4 p
}" k6 r' c$ P' Y4 e7 u, F. ?( \' ?
   delay(200);
) z' ]/ N6 g& h7 E3 i7 R% c$ ] if(point==3)
7 t/ M! R8 @/ ^' O6 l{
1 c6 y' e) ?* K  RI=0;3 T% z$ ^7 c( {) q0 p
  str[3]=SBUF;
% W& D5 ^" G! q* @. z: Y) @8 q7 i}
/ s' C1 v+ J/ _  |  M1 B7 z4 w   delay(200);
* J2 c3 B: q/ y  K+ Z if(point==4)$ U+ H1 g2 ~9 x# Y5 [; F% ?5 ^5 [
{8 P2 U$ e5 [, E% Q$ O+ `0 q
  RI=0;" a) q: r- u4 j4 m# S! m
  str[4]=SBUF;
' j& R( @% A: ?* R/ B" v2 o}/ L; ^5 U6 r. L+ ^9 D" D5 K
   delay(200);9 a  C; g! I& Q- `8 n
if(point==5)
5 w3 S! x6 ^8 b9 ?$ v{7 o9 a/ }% p: m! X  G: ^
  RI=0;3 I: k& i# L- g; c' y
  str[5]=SBUF;
5 `( |& L: K, l% [- R$ f5 t" ^}3 V6 f% ~7 [/ Q- c1 X" Z
   delay(200);
# K% U& m# h% a' e8 k, X   }   
% d, T* U4 M, u( v}
: R3 L2 z2 w- t, [7 p编程习惯各有所好  你试试看这样可不可以

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多
0 R7 f/ {* f- Z; L- X8 t7 H7 b在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了
/ E. n  N9 ?) C. i3 x- qif(point==5)
5 t1 \# V6 Z' X/ K3 M{' w- O% h  g+ }. ]
  RI=0;
6 E& s! e' g: {/ H  x5 v. P  str[5]=SBUF;( ^  X9 I; Y0 y5 u
point=0;
$ n. e8 M5 v4 S8 T! N}

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点 0 R; U/ A( J5 u$ d+ x7 ]5 S
我比较喜欢写成 这样  一目了然 2 Y( f+ G& h! E  K7 Q
哈哈  

108

主题

498

帖子

2289

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2289
7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52 7 f9 A" ]; i# p7 b: ?4 N( G0 X" Y5 g2 j
这个函数也可以写的简单点 ( C9 M2 E0 W% r/ X
我比较喜欢写成 这样  一目了然
/ p/ G' n3 W, ]/ ~3 G哈哈
7 Z: V- A0 U( B# c% a
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 019 _0 [: f: K. N& j, t. J

' C, ^, `  r& F' {6 P( H. r#define uchar unsigned char
+ L5 m* G: n2 [/ h% Uuchar  port;
7 Q+ ^" F' l' S! r9 Puchar  rec_data;7 U# K- N, `# i  B  m' S( H2 u. }
uchar  str[6];2 L  o' s$ Q/ s9 D  @/ A
uchar  point=0;
* N* r+ X  I7 `  a' yuchar  flag=0;& N4 y* U# P/ K0 u2 M
//串口初始化 & ^; J. T6 c4 ]9 Y! \8 q" P( |
void UART_Initial()       
6 I: G. n! b) f1 l3 [{
) M2 X$ R, d! ]! x! G4 }    SCON = 0x50; //串口方式1,允许接收
6 N0 _5 o* n7 I        TMOD = 0x20; //定时计数器1方式2: y" w3 C: Z' @" H" m4 Z: v
        TH1 = 0xFD;        //9600 波特率 FD
, [- z" L9 a3 _% t' y  ^        TL1 = 0xFD;
8 X# m; O' r- m        EA=1;       0 D% _9 z/ r: u8 F6 Y- F
        ES=1;       $ l& p2 U  [0 z8 T3 V! `4 j6 P
        TR1 = 1;   
1 {+ e) Z4 o1 j) L, g4 `7 j}
$ l+ I  u: P7 b- S+ C; @- D: W 3 r7 K7 y) e7 C5 p1 K
void waitsend()9 }, ~. P4 \* n8 D9 C4 G
{" l( ~6 L- L0 i
    TI = 0;
/ p5 [3 y% [3 z1 ?9 ~2 x        ES = 0;3 z9 y- w* a, ^# B1 y3 M  s
    while(!TI)# O# ]$ R9 o1 g) q# Z* Q6 R: W
    {
8 W; T7 Z6 ]$ ]% r    };
- H) ~4 o1 p* W! D+ p    TI = 0;
; @$ c+ Q' u9 Q+ W3 C' f0 _0 b- F$ q' w( Y        ES = 1;
+ J: h, X7 c, o  b}/ l) O& {8 M$ c6 [

9 T4 O! O8 P: _, a5 W  u8 _4 Bvoid delay(long i): T" t  {' G% B* H# l8 H( _; p
{
! h6 O5 V3 S, y  ]7 |: _% f3 g, P    long  j;6 }& ]7 H& ^3 V' _' A
    for(j=0;j<i;j++)
5 L. z# j. V7 G' Q6 U1 K7 x3 U! ~# E    {
7 a+ Y  m( `2 J% Q' E8 p0 D5 E' o' x        SomeNOP();
: E# {5 w" A: g  Z* @0 W        SomeNOP();6 @  ^# m! f2 f6 h6 X4 R4 \
        }
3 M& s/ c5 E5 u% X! j}5 L& d1 D* T! C" s5 B3 e$ B

1 ?9 U* Q: Q: O9 A1 Bvoid delay1ms(long  i)* j$ F/ w3 V  k: R
{
5 s7 P( ^5 k! `/ R+ S, u    long  j;+ b9 U" c- a/ d8 Y3 |& t( l
    for(j=0;j<i;j++)& ^. Q, E: k! [+ h
    {
* p# }- |6 W- V( Z& W# V* D            delay(70);
* G+ o- V2 u: \. `4 b) |1 H* v        }. n3 N6 D$ q: i; T: w
}
) T- L6 R0 e) R6 O) w# p7 b# F8 ivoid COM_REC(void) interrupt 4 " O( L5 j: C8 o# W4 ~9 l% d" m
{
1 J& n- D7 ^! V' m6 c$ n$ T6 j3 @       r3 o& h1 Z: h, F9 }0 ]- l
    if(RI)
5 E3 L6 Q: \2 u+ m( T. M    {    //清除串行接受标志位
% C8 A" {8 T% x& x. w: d3 s        RI = 0;  _! O. h5 X% |( e
        rec_data = SBUF;  //从串口缓冲区取得数据3 M- M. _( W. S- L9 N1 S( o
        for(point=0;point<6;point++)
0 e5 W" J' d% C! w' C                {/ I5 a/ u5 F- n& a8 R0 I& N9 Q8 w
        str[point] =rec_data;
+ ?( ~+ \! l1 K7 s( k                //delay1ms(1);& @/ o. {! h: K; _
                SomeNOP();
, D; _7 K( G* w9 l9 Z& O( H. a                SomeNOP();
4 Z' z2 h% b4 P7 `4 h( ~                }
, I! M0 g2 n1 \7 H' g# v1 E        point=0;
. c; e! g9 V+ Z        flag=1;
) w2 e( c$ n5 ]4 n* b4 W" Y    }
& W+ ?  I) X$ z/ h4 g" P( Z3 w! q. k}
% M# l2 Y9 D  evoid COM_SEND(void)" |7 d, b1 I* {3 J' A. ^
{
1 a- l/ n- b  |! }) }for(point=0;point<6;point++)             //连续发送数据                                 
* B# H1 M, r0 F  ?. A& N" @    {: W" q1 N8 y! p! h( n. {5 f* l
        TI=0;
' O8 I0 |. u( w* I' S, K3 v    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口& M" e9 D8 v4 w' K: B- J. W
        //delay1ms(1);
/ V* p* j1 [. s) a) `        SomeNOP();
- [" g* p7 h+ R& ~. O! D6 i        SomeNOP();9 \8 o  l! m8 T$ ]
        SomeNOP();
% K7 `- Q0 ]1 g3 T# H$ J% H: i* e        }" x" d+ M$ a( v5 w  m9 o
    //SBUF=Read_OneByte(str[3],str[5],str[2]);
' }/ o$ j4 _9 e0 k   
1 U8 R  S$ ^# A% I9 r}
8 O: o' l. y7 W! x* x7 cvoid main()
+ _8 w4 J4 E) A5 s0 |5 h8 ]{
1 i. s' Z) x  Q8 b8 ^. c    UART_Initial();
, S/ h/ K. C( \& k- B1 q    delay1ms(2);
3 n' V0 a' G: W! K    while(1)
0 m) ^# e. I3 f" @4 l: v$ D' ~* ~    {) t0 D) e, y& S3 ~
                while(flag)2 o  P2 [; ?9 Z8 x1 A
                {
: t# z: J$ @! P3 s) A. P+ \9 @            //RI=0;9 p& F' q+ }+ s
                COM_SEND();8 O* v: k& o; M# |6 I  U! p- ]; ~) ]6 F
                flag=0;8 L8 K! r$ p: r: [/ m
                }
1 ?+ g3 r, J: g: [8 X        }
; J+ W' t9 U7 E. X: t}

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   
7 z) n1 {; x* E9 ^7 [6 Y: q/ n你就按照我上面写的程序接收就可以了 ' e6 m2 b; H6 c' ~
应该没问题  其实是肯定 哈哈

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   3 Y2 w; i7 F1 }$ H4 j
你写的我等下帮你修改下试试, [% u3 g+ X0 \) t& i
不靠单片机谋生的   不是专业的

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 1% M, L' ^" d; s6 o* Q+ B
{
& D- p, W- ?1 c0 _, b4 f9 |1 f# l    unsigned char temp,head;0 a0 z  y6 v5 G% ?3 s) a. U& ^
* y& m" n! k" s) }' S7 O/ z' [
    if(_testbit_(RI))
) p7 @. N! g+ C+ y; U0 w+ ]5 c. @& L* p    {
! P; Q+ s1 U! M" Q1 N        temp = SBUF;
) W0 k8 ^4 K$ {( Z& E        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
# e6 E5 q4 L! {5 C" D% W* ^- m! H        if(head != uart.rx.tail)5 m. J' @4 a* f( c5 w( z8 v
        {4 R7 D& @" O$ `% D4 j9 P3 `6 v
            uart_rx_buf[uart.rx.head] = temp;
" H) A7 W7 @( [: i2 j/ D            uart.rx.head = head;
, x# {( j+ H6 l3 [' d/ s6 B        }else4 e  f( I2 P! X- |7 L
        {6 F7 r2 }5 c) X4 c% n
            uart.rx.error = 1;' z+ f& c. i1 S3 L% {, c
        }6 Y0 Z' r$ B8 ]) ]
    }
, n6 v, X) L5 B- J) Q: F, L% U4 _7 @% t    if(_testbit_(TI))
! j; J9 @6 N- l) k) t- U4 Q    {
  R, t9 l3 M+ \' v* W        if(uart.tx.head == uart.tx.tail)
, N) {5 u' t3 h9 x3 F        {( _1 v# t. K; h" M
            uart.tx.busy = 0;
4 Z! Z( J2 Y' o. `% X' H+ G( s        }else
* U" J' i; m5 E0 l        {3 e0 E; F& T% s1 G
            SBUF = uart_tx_buf[uart.tx.tail];
3 F& u8 Q% f4 Q$ f) O& g            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
7 W. W1 p) n( u& \3 z; _6 E) X        }
: ]9 \7 i4 `7 O4 Z( Y* Z    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-9-20 08:59 , Processed in 0.062637 second(s), 31 queries , Gzip On.

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

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

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