找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

c51串口调试问题

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
想以这格式读输出板寄存器
$ Y; H( p9 h4 e0        1        2        3        4        5- H' M+ {9 ^: D3 a
                                        4 y- N# M$ H  E4 F1 ^  U
Byte 0:固定为0x5a( z6 T! i. u: [: D
Byte 1:传输字节的长度,为0x06- b5 T) z1 m+ V1 o# ?+ B
Byte 2:port口
2 r+ C- t/ t% Y& e) MByte 3:设备的地址;
% w& ?3 s6 T/ h, ~8 VByte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);2 |$ e% i5 I! r% u2 w$ F
Byte5:寄存器地址低8位(0x~0xFF);
- J% J- n- x# t7 K" K例如:5a 06 00 98 00 01
' f& ~+ C' o  T8 o如何写串口字符串收发程序
9 T; n7 @: @6 J& o2 e) ~5 A请大神指导下,新手不懂的太多
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
  S3 y3 p1 X& |  i- q$ k+ D+ q你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序5 D+ @. k+ L5 v& w, @
我建议你 还是下个郭天祥的视频  串口通信不难的

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42
5 d3 I! j" ]: \* q6 m你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
* d/ Z6 u% P" Y4 B你要写什么串口通信什么样的程序  我有 ...

/ z9 b# H: @7 bvoid COM_REC(void) interrupt 4 . H3 M; c/ D+ K1 ^! A
{: q8 R" L5 Y& ?0 Q, R$ [
     
& B5 h" r$ }# \& H. G' b1 t    if(RI): c% I) S/ X% A+ {( W- F9 M) v/ P; W# C' k
    {    //清除串行接受标志位+ D1 l4 x: r, j; P% ]
        RI = 0;
( P3 S9 f9 ~/ A+ d6 t- q. W  U2 ]        rec_data = SBUF;  //从串口缓冲区取得数据
4 R( J  b0 `- {6 f( F9 h- J        if(point<=5)# P! {& y1 h: S
        str[point++] = rec_data;
" T8 ]/ X, V0 o! q2 c+ T                flag=1;- C! P% I. w( i
& J3 S- F0 |- q$ Y
    }
; M6 h" H6 m+ v% b& j* a}4 Y& }5 G$ V% G" ]: t9 ^+ Y
void COM_SEND(void)
) |+ f' n! V2 s5 k- h{
1 D7 T/ a. k4 n5 j9 u8 L. x/*while(flag)
( I& a. e' _0 r% T/ T$ ^$ C9 i{*/
6 F( M3 x" k2 \8 Kfor(point=0;point<=5;point++)             //连续发送数据
8 ]# j$ @' ~% q- t                                      * `0 b1 f# h& q3 a) g7 F
    {2 H) z! U  F5 x; O
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口
* f6 T+ ^( f" m* n! u! J
5 c9 g- D3 H2 Q5 ]. V2 \! L        }5 p# J. [9 S2 t( v( N3 P+ L
   // SBUF=Read_OneByte(str[3],str[5],str[2]);6 C4 h2 K  i3 ?: B; G1 O# M% u
flag=0;    8 ?5 g9 ]5 I! M# n, v
}. c8 V6 C6 i' X* A+ G" E+ y+ X
void main()
2 ]+ M5 C6 n7 M' [# w% i{
' J8 R& M  [; t' Y    while(1)
+ Y' s  J  g* I4 u/ w) {        {
# y+ U9 S. Z' U, W* ~4 U- _4 ]" B        UART_Initial();1 l5 G8 f' E+ c$ V
                delay1ms(2);* T8 G6 T( K+ [0 X
                while(flag)( v! t4 m9 j  [, ^! \
                {
: k6 |7 _/ K% B  O, T. k. C                COM_SEND();
: d" J8 x6 |7 ]* g: }" b* I( u                point=0;6 E' D$ {0 H9 s: z8 I& S- u- A
                }
. y3 X) A2 B0 Q2 {& Z) F                }" M) L# E6 Y# `9 A, S* S
}
/ S: f6 Q6 ~. E- ]$ u8 j3 {这是我写的程序,麻烦帮我看看哪里有问题

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候
2 B& r! O/ H% r( I接收一个字节 延长点时间  再接收第二个  
$ `/ w/ {; K( L6 c  h, C3 X我写过程序 接收多个字节的时候 不延时不行4 I) J# Z, z3 J/ J" M
发送的时候 估计也一样  
, O7 u$ o- n) @, t: `; ^6 K我看你没延时 估计就有问题  + k9 Y+ @( w9 ^0 Y, W
你把接收函数改成这样# A/ E# a9 X( u1 S7 L1 o, x
if(RI==1)    //等待接收数据
8 s" F& m+ M- n# M: ?0 i% K        {
" r7 b. D1 K6 H# C                  for(a=5;a>0;a--)   //循环5次 接收5个字节2 Q% G, x9 \& S$ ^8 t2 _5 i# b
{
* g" o4 x& \, V7 X1 d4 g& F. ~          point++;                 // point随便定义个变量
( O/ Q* L7 n4 p% X  {
3 j, p* \7 `( J9 A. D       if(point==1)" G% _, h; l5 g* z* P$ ^) Q2 q$ h7 O
{
; q  V( M" c* Y- a" R    RI=0;
  {4 c1 T- I  h; J8 O5 \    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序         
5 r6 k- L/ w; u }2 \/ A, r6 P& P* K( V( |6 ^$ p
   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写 : T5 h' z; ^, @* ^1 v
  if(point==2)
. L/ n* ^- c" ?0 L{
+ O. H& D/ q: s  }! ], g6 X) u7 F  RI=0;* D1 C9 l* k' Y) z
  str[2]=SBUF;7 p+ i% K8 N* c  p2 b4 h% c
}" R9 d4 M: O1 {1 D
   delay(200);/ o; \# `$ N9 e* C9 S; t
if(point==3)
1 q/ A# e  u. N8 ^9 J{
: J4 ^$ t' \! R7 V  RI=0;
) N9 E/ `% V3 Q& Z1 C  str[3]=SBUF;
0 O# Q8 C/ B3 k8 R2 ]' c' \}
& ~5 F; F( r3 i1 j8 @' {5 T   delay(200);
+ N" S3 a. ~1 ~. ~" T3 ?! }6 k: N if(point==4)9 f( q- B8 U7 v) {0 R
{
- L' z( k8 `7 u& S) ~1 A/ N  RI=0;1 ~& Q0 U/ K( ~& ^5 C
  str[4]=SBUF;
2 r( e* b" m* _( o9 e. Q}; A" U$ |' j3 A, R
   delay(200);2 E8 P: m' k- s7 Q
if(point==5)
) }* b1 u9 r1 G2 X+ |; C{( {) X! W( n4 P; Z
  RI=0;
; Y3 S7 B0 K8 D. E0 |  str[5]=SBUF;
% o' b) _3 h& [) ^3 S' q( n& \}  W, y( {) D" l* ]; Y
   delay(200);
& q! Z4 G3 ?( N4 T; B) U   }   1 Q7 Z; A4 l9 @  R) Z3 d
}% N, h/ q* A  r% }$ j9 r& o/ [
编程习惯各有所好  你试试看这样可不可以

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多
; ]4 U- r" I# ?& R4 d. d在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了
. {2 r& I+ J6 m5 Z; G( x8 S# T( ?# D' Fif(point==5)7 |" k( K; I5 ^7 c  l2 q
{
3 ~4 |- y- Q. V, e  RI=0;
7 n) {. _6 r2 [6 w. ~  str[5]=SBUF;
0 Y* z5 p# {- r8 Q' |6 @# r0 y$ P" z4 w/ I, _point=0;& b; Y- u# l* V, J" P. C1 _
}

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点 ) B3 r' v) W0 p; G
我比较喜欢写成 这样  一目了然
' N  g$ J7 ]9 G" P6 t哈哈  

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52 0 Y  j4 v4 t. a  W  y" T2 g
这个函数也可以写的简单点 2 w  ?5 w% A9 D
我比较喜欢写成 这样  一目了然
0 s' P( ^5 f5 Q- U( a哈哈

, q6 F; d; k4 f非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01( M/ d. n  ^  r$ K/ \: j, ~

4 t7 v' i" r: x2 k#define uchar unsigned char
! L3 _5 n4 u; I4 m. r; S8 @' uuchar  port;( X3 v) J; @& q& h/ ~" X
uchar  rec_data;  B# i# F: d. v1 i7 y
uchar  str[6];
; y7 p: ]& q* y- P' n( H8 kuchar  point=0;
, {$ V; E4 c7 z. H4 S6 l9 X! o6 \- Tuchar  flag=0;6 f9 D$ Q8 W/ W
//串口初始化
2 h" c) Z2 O# @- Z; Ovoid UART_Initial()       
) W- b8 Q& F0 g+ R9 y9 c{ 1 Y, X8 ]: E2 m# ~4 y
    SCON = 0x50; //串口方式1,允许接收8 \5 E1 G" t: {/ y* ?/ E
        TMOD = 0x20; //定时计数器1方式2- g* x# \$ G8 R: u
        TH1 = 0xFD;        //9600 波特率 FD
6 Y' R. `  I1 T& C; A3 p0 w" I        TL1 = 0xFD;
7 O  G& p. a. g% S0 q        EA=1;       / [6 g4 D; Z6 ?8 k/ \
        ES=1;       * d+ X9 e0 t( R" e# g
        TR1 = 1;   
, {6 d6 Z3 u( ~+ [  ?}
4 N0 p, o3 ^$ j2 o9 S0 n5 {
' e2 o, c4 ]1 {3 C. \! Wvoid waitsend()
7 s5 S  J/ |/ k8 R3 j- t& i6 O{
& g- Y+ P2 o* R; u: c    TI = 0; " k' i. G9 v) D" }
        ES = 0;
# h3 o1 H& s5 M5 K    while(!TI)8 e" o) b' C  |* g
    {
" Z: H+ C6 s0 {    };+ F; h2 U6 V- \$ Y1 n
    TI = 0;& }$ a* F" ^  z- \3 Z' [3 Q4 P* E
        ES = 1;1 y0 y! \1 @# |6 @- B5 h6 n! ?# U5 e+ h
}% o8 F: n! ]& w8 S  t

1 P" Z' E' Z" Y. V0 ]6 Cvoid delay(long i)
$ K$ ]) q8 ?: D# B: k* D+ j{+ M1 V& w. \7 @+ }1 I8 c$ f# J5 g
    long  j;
' v# a9 A' k2 _: s" _    for(j=0;j<i;j++)  ], j. V4 i4 d  j& j
    {- A' _0 s$ g! W2 I. \
        SomeNOP();
# J5 Y- L. v/ C& w1 T        SomeNOP();
( u* k) u" z* a. }3 n        }
; B, a; h: h+ U& {}
7 `. y: E% A4 Q  \+ [' [  b7 s9 k1 W5 e: d. c
void delay1ms(long  i)
+ ^/ g2 _  }5 m% a7 a{/ R3 p7 C( f& b* h# S6 a
    long  j;
7 B+ O& `4 r, t' y& H    for(j=0;j<i;j++)
4 J& O! v8 }- E  J/ m8 L8 G    {
5 i+ [. c% S9 C$ O, h: ?- s            delay(70);
2 m/ O5 D; ~8 v5 h# m- G+ Q        }3 P7 L" s4 V0 I, ^3 e' q
}1 j3 o: o- P( \" r
void COM_REC(void) interrupt 4
9 u) w5 N$ A4 `& C5 J{% d! r7 \% ^: P( L$ @  k
     / O0 I& u  c4 k
    if(RI)
3 ^0 u7 r1 k/ y; R9 A! U    {    //清除串行接受标志位
6 O9 [; y2 c$ x1 g- T2 s* ~) R        RI = 0;
3 C. X) K" y2 z  d3 Q" ^# p$ g        rec_data = SBUF;  //从串口缓冲区取得数据
7 `  u! [" q5 A5 F  z, z0 Y# Q        for(point=0;point<6;point++)2 ^" _1 }. T$ B4 {4 l
                {: G: i# r! d+ P/ U* i
        str[point] =rec_data;
7 O1 V& @3 I' o! ^                //delay1ms(1);
, i4 b  v! c7 _                SomeNOP();; t0 F5 ]. |1 i8 l; e
                SomeNOP();* ~2 Z2 t( z$ K2 M
                }! u3 }. e- A: X( q1 \
        point=0;
$ A. p0 i- T; h; s' v        flag=1;
9 g. X# {$ F, c% X, A+ T    }
5 x) d9 w4 v( C5 ^9 `8 S8 {, c- ]" R}0 S& Z* i* }3 s+ l# d( d
void COM_SEND(void)0 I( [- H9 W+ ?
{* ?/ X  @: C  U/ [% [3 Z
for(point=0;point<6;point++)             //连续发送数据                                 
- C! a4 M. D6 L0 {1 V9 m7 J    {; ]2 B6 T3 f$ c4 ]- a8 B/ H
        TI=0;" p* R5 M+ W6 Y9 ^# V
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口
% u# {4 M0 }( i( x# |" U/ W        //delay1ms(1);
" d# f, \5 G. E$ B. I        SomeNOP();
( A0 q3 f$ y5 n        SomeNOP();
+ h) m6 p! A4 }0 |' t        SomeNOP();% T" `6 q* R! Z* M
        }
& l# }, e- K6 ]' W; K$ G! O: p    //SBUF=Read_OneByte(str[3],str[5],str[2]);2 b9 b+ ]8 K$ W2 C* o5 V. n/ D
   
# R; }5 S/ c& {6 L( X}
8 A, d6 [& \% P2 _& j; _void main()1 e+ e3 F2 F# H3 T" C
{4 d/ L, v0 r6 o! |' t/ z& H
    UART_Initial();
2 Y; z3 X1 c' O    delay1ms(2);
! D4 z4 ~" u+ i$ K1 v2 `( c5 s( n    while(1)2 i6 i" [6 ^: R9 S
    {
% \, Q, C5 W: z( Y2 C' ?- q% N                while(flag)  ]( t, i8 U% J6 ~4 J
                {
5 F: _- T! g4 B& \            //RI=0;
3 Y: w! K: k! ]" z                COM_SEND();
: j! a  R  y0 K                flag=0;
( e6 b' O" J- l+ \                }
$ e5 r7 L- G7 _, Q$ C1 `& T' Y6 S        }
# A; [+ K3 I# R7 [# |}

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   
& o+ t0 Q. R8 n你就按照我上面写的程序接收就可以了 ' F1 h- I3 N$ S& L3 P7 g9 g
应该没问题  其实是肯定 哈哈

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   6 r0 N: }5 W5 T, N( A# \
你写的我等下帮你修改下试试4 `- g" |0 ?5 ?0 Z$ O- ~
不靠单片机谋生的   不是专业的

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 1
! v9 `" K9 L6 F5 O0 f{5 c! Z4 J' d) m7 {
    unsigned char temp,head;( O* M8 u4 e: F7 a7 v
5 w" g5 y% E; P3 k8 Y' T* Q# y+ o
    if(_testbit_(RI))
$ L  h8 n; h, f( b    {
. ~2 M" v5 M- U; U5 {        temp = SBUF;
' E( T. D8 ?9 s  C8 _. h& q6 f- Q        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));" k1 c  B8 V4 m1 F% H2 o+ u
        if(head != uart.rx.tail)
0 ?5 I% i3 T; K6 }% [! W: q        {
8 c3 M/ O- P2 x( w% t( q$ Q            uart_rx_buf[uart.rx.head] = temp;& D! ~! n& N6 n. t
            uart.rx.head = head;
& s% \* J1 l/ J% ^( L        }else
4 P. `4 M# h! s. U% p# I3 ^5 Y        {4 l. }" C. j- \0 B- K4 a. i$ S
            uart.rx.error = 1;; F$ }% @3 P2 r2 u7 }
        }
  \# J4 R5 `1 q0 j: G' h% \( [    }
+ b) ]4 m- _9 Q* ~' m9 N    if(_testbit_(TI))
5 t" {" A1 s% u5 F. [, y  X    {4 O& N0 h: d8 O1 i4 [3 |
        if(uart.tx.head == uart.tx.tail)9 r. W9 _7 m! n# |# a- L& B, W
        {. X) M  b1 k2 _6 i4 C" N0 P6 e8 S, p+ z' k
            uart.tx.busy = 0;; P( a0 L8 L" l: ?
        }else8 M1 ^# f! n6 k; R- w* z0 ^
        {( |: N' R9 ~. A
            SBUF = uart_tx_buf[uart.tx.tail];$ }7 `& I2 Z+ x+ o2 z. z& m
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
$ r0 {8 w0 p0 r$ d" ?+ ^        }8 h" l. c% N. ?8 Y8 \& e
    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-8 22:25 , Processed in 0.062047 second(s), 31 queries , Gzip On.

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

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

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