找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

c51串口调试问题

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
想以这格式读输出板寄存器
+ v: ]- r7 y' L0        1        2        3        4        5
/ ?- N% N$ x3 |/ N                                       
. w) y, P, W7 ~8 Q. rByte 0:固定为0x5a
5 [! P/ V7 r; ?" `# OByte 1:传输字节的长度,为0x06! k$ x- s' c( M* Z
Byte 2:port口6 c4 `1 r+ @- U1 I) }/ c' P7 u
Byte 3:设备的地址;
! p1 A# U5 B* n  z: W  b) k$ G3 G1 QByte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);( u' Q. e1 S2 ?" z4 x
Byte5:寄存器地址低8位(0x~0xFF);
2 I  n  t* [4 q; R. Z2 r$ v6 k8 F$ l6 Z! _例如:5a 06 00 98 00 01
: }% ?& b+ ]. @) Z- S如何写串口字符串收发程序/ [! U# ]( X, T! `8 o
请大神指导下,新手不懂的太多
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 15 k4 _4 B% _- K* X$ Q+ H
{+ U+ Q: n& j( ]& D3 V
    unsigned char temp,head;; c3 s1 f$ o! S( I

, L' F8 q: A4 I- @    if(_testbit_(RI))
% h" M* A% x2 O' T! P    {
# q0 N! w0 h& n        temp = SBUF;
* e% T% V6 P, B! g* y! Z  y# s        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));' a: j  Y) I. w" O% o
        if(head != uart.rx.tail)
! O, u# K  J  f* p- j: b8 Y        {, ]; h& F! z8 j5 T) O7 y
            uart_rx_buf[uart.rx.head] = temp;8 U% V" `* Y9 I( s+ ]# g# N2 R: {* Y
            uart.rx.head = head;1 Y9 K+ N/ b( j2 W& w; i; w
        }else- C5 D7 a" \8 H9 {! H# Z% Z
        {( H1 o& |6 v% P) \; W
            uart.rx.error = 1;
, }+ i/ P* I8 W9 r1 O3 p# g: I; S        }
0 X! \' C- d8 M* v. D5 \    }1 x" m  |3 s; X- @) Z! ?5 x
    if(_testbit_(TI))7 o& S( P% j0 ]6 [$ l2 A9 z# W
    {. O9 J  v5 `7 d0 `2 R8 U$ w
        if(uart.tx.head == uart.tx.tail)1 n9 [9 C4 _  L$ C, Z( Q
        {" Q9 o5 V7 v" [0 I" Q
            uart.tx.busy = 0;
7 n# ?: C* n8 r. ?0 ?' ^/ o/ E        }else5 C; h% r2 D: Z+ z$ z
        {4 D) m# |6 O+ r
            SBUF = uart_tx_buf[uart.tx.tail];$ M3 a+ E" t& b- T% o3 J
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));" n+ v0 P7 i" W! m; r& n+ S  O6 a: A  P  _
        }& y" \& F8 `$ D; g7 J
    }

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   & z0 [0 o9 Z: c! O4 Z
你写的我等下帮你修改下试试
' H( d9 {1 a) w; ?/ R. b3 z不靠单片机谋生的   不是专业的

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   
! Y7 O2 {% w; F. s你就按照我上面写的程序接收就可以了
" Z' _! H2 y* L% y- P应该没问题  其实是肯定 哈哈

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52 - D$ @3 W3 x9 ]* B, e
这个函数也可以写的简单点
6 T6 G" ]7 W4 ~* ?" f3 I9 l我比较喜欢写成 这样  一目了然
% B+ v6 x2 X0 r4 r哈哈

% K) P* d7 g; ~- Z0 g非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 018 R9 d( m! h/ Z
6 d* X/ c# o( [+ _# h% t; t
#define uchar unsigned char
8 g% ^  p1 Y1 h3 C% P  Iuchar  port;8 r7 A3 Q, H9 t- \$ F
uchar  rec_data;
) E+ v' b' S$ D# V+ i7 O1 duchar  str[6];
" ?1 I( G1 ?* Q; E6 K& M" k+ ]uchar  point=0;
- M$ Y( ]  p/ A" K3 b. Yuchar  flag=0;. J% Y/ ]3 m$ F7 }: ~( H/ }* k, l
//串口初始化 1 L- P4 A3 T5 \6 w3 [
void UART_Initial()       
9 l3 G% i4 D, t  E+ H% `8 J{ ) W9 r: z, T, Z  m( S% Z; H6 o" j
    SCON = 0x50; //串口方式1,允许接收
8 [; [, c2 ?" o4 b        TMOD = 0x20; //定时计数器1方式26 w+ X. f# Y9 w- s( N% S  t& ^! h
        TH1 = 0xFD;        //9600 波特率 FD
1 ~; G& o% T- \; u5 W+ L        TL1 = 0xFD;& t6 h/ Y* w0 \2 u2 d9 `; s
        EA=1;      
- e( c3 d: o0 ]4 M8 L9 b        ES=1;      
$ @7 t0 @; H, a+ s! X" P        TR1 = 1;   
7 ~9 m8 F0 w$ U% ]}' T$ K! L' v! {! [+ @  g# _( s
5 I$ @. g0 O, d& C
void waitsend()
/ O  a, o, y# T+ j$ C{8 t% ]9 I( |/ V  |4 y7 U/ W
    TI = 0;
1 w! {( i! ^" v/ U- k" K        ES = 0;  v3 A9 r) I' E5 Y+ W0 B6 m; a
    while(!TI)4 s- _  ^, U8 P& ^8 @1 b8 j
    {' j: M7 m( [% z2 E) {$ b
    };
) k8 ]& h5 y8 M/ k7 k    TI = 0;
: Q5 T: B; p: R. J* Y' v9 U        ES = 1;
$ m, `, z/ _- _+ q}
; D6 [: z3 S3 X4 m& J
  E. `1 n! ^/ ^, I. {1 m+ K) }void delay(long i)
% h4 u& i5 v% d' c) K, {& ^{
# u. ^4 D' o+ G2 b' Z- B    long  j;9 Y) [5 }6 v: o* r
    for(j=0;j<i;j++): |) b) a. m5 A
    {
% T7 E& c* m4 G0 A3 z        SomeNOP();
8 @+ z' ?6 ^9 x        SomeNOP();
0 D5 R$ ^+ X9 H/ A, Z; R        }* Z2 F) E! L6 z* x
}% \) O  {4 {3 s" v
! E1 x' B8 s( Z" z5 d  I2 w
void delay1ms(long  i)
- r( q4 B6 h% ~: q5 V  G* p4 V# `{
" }& h- Z) O, y1 {% D) S    long  j;
; C: C% ?% I% k9 m0 h1 A    for(j=0;j<i;j++)) n# M3 d# J4 E- `
    {
3 Q6 d% R. D. W% V3 I            delay(70);0 h' o6 e5 T4 O
        }7 |" I$ a3 ?1 E% G. |
}
! e' N) g, h4 `1 evoid COM_REC(void) interrupt 4 . a% d" v! Q& `
{. D' @1 n! L& }9 L0 D# H* F! b& ~) \
     ' P7 v! Q2 {: t7 ]9 A# g
    if(RI)* ^5 H7 g/ M" U# j
    {    //清除串行接受标志位0 j) i. k9 u% g  g
        RI = 0;
$ |# p& m9 A% M+ r        rec_data = SBUF;  //从串口缓冲区取得数据
9 C+ Y- n1 O' i( M& m& t        for(point=0;point<6;point++); l. Z6 o  Y# R( w: A' H
                {; k8 V4 H+ x  a% n6 u& H+ `
        str[point] =rec_data;" w% B$ f) L& Q
                //delay1ms(1);% F4 t& \( ~5 n: _
                SomeNOP();% l  c( Q$ i% E: G) H
                SomeNOP();
: F: k, ]9 n; [8 e- E                }  G9 A. K( ]3 n7 t1 q. I4 I9 ]
        point=0;' C: M+ v) Z7 q
        flag=1;1 H9 @' S+ X8 X
    }
, r  h4 R" `/ i4 j}- Y7 g/ [  B! d* a- x' t' d
void COM_SEND(void)
! Z* @& M" O. g" x; ?' B" J7 F{2 Y( R+ d. k1 \$ D4 m3 |. I2 T
for(point=0;point<6;point++)             //连续发送数据                                 
) g) c, I( C9 F: Z3 s8 P$ S    {- {: Y* F1 b  A3 g- T. ^$ o
        TI=0;/ F) b9 k9 j: n  ^6 y1 X! {
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口4 {& E" v1 H+ g
        //delay1ms(1);
* L9 J8 u" f- B( D        SomeNOP();
" U9 y' |1 {2 l0 {        SomeNOP();
( i: W: S% t; j% O# ^  a        SomeNOP();
& W5 Q9 ?, ^2 c' y. N) c$ I- a8 u        }
3 {% S( U& u! P7 R    //SBUF=Read_OneByte(str[3],str[5],str[2]);( Z! x. A, L0 l
    + ]3 ?- ]: ]8 Y# M+ V$ m' [, {
}
. s0 L8 B, q3 S" U/ M5 q& `void main()
( F: E+ V9 ]9 w8 @  [# n5 f{1 b) H3 g2 r) X4 Y$ W% d# G1 R
    UART_Initial();0 L0 O2 _# ~) I- ^
    delay1ms(2);
6 F& r5 }% _0 j0 x    while(1)
6 X5 d! L/ g+ H# x7 ^" e    {
, W" C3 ]4 Q. Y5 f. t8 b                while(flag)7 L  _6 t* f  A8 h
                {6 F( j& k' i' X9 J
            //RI=0;4 g- Y2 Y5 K! B
                COM_SEND();
; S5 B+ y, l( a# ^. ?" V                flag=0;
0 j2 e/ r- E. V, @" @7 J5 ~                }
$ H, l4 C9 f. l5 K/ w; K0 j9 x* j        }
/ X* D5 ^0 G% X! t' m. [/ I" v8 N}

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点 0 L# L7 `/ g* v0 Q+ n* T
我比较喜欢写成 这样  一目了然
' j' z( {# r+ R/ S- l哈哈  

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多 7 ^! Y" O  m& Y2 z" r; P
在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了+ x. p3 Y# |: d- ~% M8 v/ s
if(point==5), C  L% E& N* a
{
; g$ d& k( H8 T( Q3 u* w( A  RI=0;
1 t7 Z4 h0 x+ g" [- d$ N7 q  str[5]=SBUF;1 D0 u0 M% `. F6 G/ A
point=0;
5 J3 w( p9 Y4 c) ~& t# F2 Y}

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候 % b( O9 z" F" v$ y, k# m" h& f
接收一个字节 延长点时间  再接收第二个  . c( C$ X* b$ k4 }9 f# t( Z) w- m
我写过程序 接收多个字节的时候 不延时不行7 }( l7 e; d7 C8 F7 e7 }
发送的时候 估计也一样  + ~4 R6 a, f  }5 B/ e& {9 d9 I7 r
我看你没延时 估计就有问题  
9 G6 d; Y# b( `+ p( M( J9 w9 ~你把接收函数改成这样: [3 y2 J, Q. Q0 y
if(RI==1)    //等待接收数据+ m4 C; @; c# v9 G/ v6 H  H
        {9 ?$ |) g! N* C
                  for(a=5;a>0;a--)   //循环5次 接收5个字节+ e3 ~6 Y8 \3 D
{; c4 a( C$ H2 m) g
          point++;                 // point随便定义个变量
7 s  y$ \" d& J* R+ _  {
. R1 P% D  @( R8 x2 ?: r       if(point==1)& v9 w. v# R9 w; X
{
" R, }2 p, L. w7 t1 x    RI=0;9 f, D% C. t( g
    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序         
2 O" e2 i8 y) ~4 t. c }
; G  h/ W# N% d   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写
/ H( O. r# j: d7 p, i6 R. s5 n* `  if(point==2)
/ B3 K% ]. k* E3 q8 d7 Y{
- ]$ W& Z/ u' [* I* ~& G  RI=0;
3 r7 N; e; K+ E3 w9 [5 Q  str[2]=SBUF;% x! a  ~  v; L4 h  L
}
- v5 l2 T) ~; d9 a) X4 Z* C' B   delay(200);
% w+ U4 T) l  J7 @5 z; B$ q. W& I if(point==3)
. X, q$ u/ D# N7 X* D{7 _/ s5 f: u& c; k" W$ \2 Q! Q
  RI=0;6 f* L6 F! C0 `3 v! n' h. W- X* O+ E
  str[3]=SBUF;6 ?2 L$ [5 V) W& z- L/ k
}$ J7 D" s* C( `9 g" t0 W3 F% \
   delay(200);
6 l) U7 Z. N: N% Y! B+ b* q% U# @ if(point==4)5 c4 V( N2 i) `) g# }
{
3 N* v. J4 B8 m; t+ ]0 T6 ~  RI=0;
$ q* b6 @% J5 t- @, ?0 k$ [  [  str[4]=SBUF;+ ?, k: ^! O: k* t
}( V' d2 w/ j9 K- Y
   delay(200);9 j% R% i7 w& p% J
if(point==5)
& h! a4 P$ ]/ c  f- `7 g- L{7 J% V! q0 l6 c! A# d& n
  RI=0;
2 {+ g/ F! e; T4 x4 `- T9 b  str[5]=SBUF;
0 d  X( e' z: V! [% z/ }3 K}3 c% ^; D% y& q! o4 w" r
   delay(200);
. Z6 ^$ [. ^5 ~   }   
8 b! |; D/ Z" y2 @. h* \}
0 {' h; |3 T$ u$ o编程习惯各有所好  你试试看这样可不可以

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42
9 r' G& W+ I$ n& @' P9 t/ Y你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
, G$ v0 |) `( q! C你要写什么串口通信什么样的程序  我有 ...

& t/ F$ e+ I" a4 T2 ivoid COM_REC(void) interrupt 4
: S, y$ x; v, j$ M& J{
; m2 r4 S7 I! F& q5 b6 y     
  i4 `- [( T+ d    if(RI)3 s& F5 ]  g* z! V: U9 f7 l* P4 ~9 R
    {    //清除串行接受标志位
. V" g& n. F5 A$ F        RI = 0;' L) P5 ]4 ?" D) ~9 X# `8 a
        rec_data = SBUF;  //从串口缓冲区取得数据
! U2 g7 Y0 n4 f. w& v! r. H6 o        if(point<=5)5 P4 N# j, Z2 Y% T$ y: |0 r% U5 H
        str[point++] = rec_data; # D; Z/ W. _8 J8 D
                flag=1;
3 v$ H* V( M% U( M% q& F& Q
) O  N6 w( D% ^7 x# r    }" Y, [6 A. ?5 ]5 h9 n
}
5 p7 w. d) T* O9 evoid COM_SEND(void)
1 m3 I2 ?! @8 a+ V{0 a9 g* j3 x7 L) I) [2 c
/*while(flag)
* R. j% \4 X+ d; i- j6 S{*/: {/ v: Q/ ?. v# }0 M% ?
for(point=0;point<=5;point++)             //连续发送数据
5 j0 ?* p) N6 Z! R) h2 s8 F                                      
: I: s8 ]' _7 Q8 p    {
$ f; h" @& K+ b- Q3 p    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口$ q% o: n8 `# j3 ~/ D; A
- B2 D" @$ S* G/ P) U  @% U
        }
# C; i7 q  M' q# w, P# |" s   // SBUF=Read_OneByte(str[3],str[5],str[2]);
8 i; K. [) [: Q' qflag=0;   
5 m* u- {5 Q% _- ^' {* x}
+ \" p* e' N4 X2 ~void main()
- g0 Y1 S6 r, V' {6 T- ?( c{: `2 Z9 d  q5 }+ x# c
    while(1)
+ ^0 E5 L( d7 v4 K# ~        {2 [$ j  V: F# f7 E4 Z
        UART_Initial();9 T+ S3 K9 h: H, g8 Q* j6 u
                delay1ms(2);
. y" j. A% F* Y# Y                while(flag). j. z$ V8 Z3 c& A
                {
' n( m  v' }! _: O! d                COM_SEND();7 Z$ v0 V* o0 }; I7 s" n
                point=0;
& p' X# _( @1 P+ F                }
. x9 w( {' }, Q8 Y; B/ I' }1 u* p4 n                }
5 ^! M2 y8 W+ b( J+ G}4 D3 \6 y- z1 Q
这是我写的程序,麻烦帮我看看哪里有问题

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
3 ~0 e  n0 h& O你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序8 [7 U6 w' k# y, @) h" c0 }+ `
我建议你 还是下个郭天祥的视频  串口通信不难的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-20 06:34 , Processed in 0.074794 second(s), 32 queries , Gzip On.

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

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

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