找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

c51串口调试问题

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
想以这格式读输出板寄存器2 e5 d, Z7 J9 }$ K
0        1        2        3        4        57 ?: e  u. F+ L4 I8 J4 H
                                       
1 [* v  Q5 V8 ]) Y. t- ?* s4 `% iByte 0:固定为0x5a1 a+ Z- E0 d' C( E8 k" `1 m
Byte 1:传输字节的长度,为0x061 Z. d- |4 x! I
Byte 2:port口
  i' Q6 |6 M: b! }+ y# _Byte 3:设备的地址;
  P* F, d8 \9 i, h9 x( s& EByte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);
# @7 l/ U7 c9 l% H& I% g3 aByte5:寄存器地址低8位(0x~0xFF);
( w) E! A  a+ ]' C例如:5a 06 00 98 00 01
) C. |) o& e  K6 J8 r1 K) F  u如何写串口字符串收发程序
- A& F% C- e' a6 Z请大神指导下,新手不懂的太多
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:42 | 只看该作者
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信& U' N4 t/ E' g3 a& x- e( L6 j5 {- m
你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序
+ F& {% U' [% q$ o; Q1 K& {我建议你 还是下个郭天祥的视频  串口通信不难的

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
3#
 楼主| 发表于 2013-7-23 08:53 | 只看该作者
幸福万岁 发表于 2013-7-22 15:42
2 g9 K3 h: [: C" J4 v" j你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
: a5 D" o' X* ^# h, ^$ g你要写什么串口通信什么样的程序  我有 ...
/ a' ]) P& A0 s* [: J7 A
void COM_REC(void) interrupt 4 , X# N  k) P) h4 `. [2 U- c- W: d7 K
{
8 n7 \% r6 _/ t$ g& A5 C2 q     1 a; u( u. W4 ~) g
    if(RI)
8 ]( M2 @/ B* K8 C    {    //清除串行接受标志位7 P' O9 k, @* K% }( Z% J) d8 v0 }
        RI = 0;
& J7 M  l% _: [8 P. b2 [* n        rec_data = SBUF;  //从串口缓冲区取得数据
4 p( `% D; f8 O3 Z& Z5 @( Y3 \        if(point<=5)4 N7 x  d# |, Y& T) Z* ]
        str[point++] = rec_data;
  v9 l* J1 t* \( H: ]: X" n# q                flag=1;
2 C& E/ v: c; x' g% v! `
0 `8 Z# A& ~) N) L( r* D2 A    }
" C5 a: D% O. R8 `* f/ C}
6 t; p: L4 H/ e2 W4 U# ivoid COM_SEND(void). d! k6 _; g# @0 w2 l
{6 x, W( h. N2 `. ]* b
/*while(flag)
' y2 F, X. c: y& I: R# }{*/
/ C7 S6 ~+ M. N  W, Y& afor(point=0;point<=5;point++)             //连续发送数据; Q2 V% _: t% u2 m
                                      % T6 J2 H5 N" ?9 a" ]; x4 }9 G, [
    {; C  M6 y9 k$ i" q5 w
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口8 \, T7 h& O% c
3 x- l: Y, i) e& L
        }
2 v- a; a4 N* j3 y+ [   // SBUF=Read_OneByte(str[3],str[5],str[2]);. ]; ?1 W. H" }- A( Q
flag=0;   
; r# x, _9 o1 f( y6 g! N& b9 k}
9 l/ R" _: O! i3 Q; Q" _# ~* @void main()8 ?4 F/ o! b" E, {/ q1 y+ m
{
" L: \$ B$ T* T5 z  A' B4 j    while(1)
# P' ^3 t+ |3 d- v- L. Y        {
% u9 ~8 T; z& v* Q% t6 ?        UART_Initial();4 a- A& x2 @# a; d' g, P
                delay1ms(2);
* u! S8 r9 p' t5 u                while(flag)8 _; }- |9 P# P2 \* Q9 s
                {
0 Y. N/ k) J  b5 `- I                COM_SEND();3 K9 Y# x! p/ W. O: }
                point=0;  k; t+ P7 c! \- [
                }
9 n, k# V: T9 Y% c8 s( ~                }0 ?& M  @7 ~  w0 T
}0 H. w- f# J% B
这是我写的程序,麻烦帮我看看哪里有问题

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
4#
发表于 2013-7-23 11:36 | 只看该作者
串口通信的时候单片机在接收多个字节的时候 2 A: }' J1 {9 l. P9 m
接收一个字节 延长点时间  再接收第二个  1 R! q) g% `; u3 x# R
我写过程序 接收多个字节的时候 不延时不行" s# V* k+ f& A
发送的时候 估计也一样  * a) h( |( x8 R$ p# J
我看你没延时 估计就有问题  
/ W3 f" x8 m: F0 n4 O你把接收函数改成这样; x( G5 p% }) o2 x
if(RI==1)    //等待接收数据" v8 W/ h1 ^. c/ t
        {. A5 B$ C0 P5 n2 g0 O6 b& m
                  for(a=5;a>0;a--)   //循环5次 接收5个字节+ I+ o7 J0 Y# ~
{
$ S/ I7 e; d1 T          point++;                 // point随便定义个变量 9 A2 w2 k& E& v/ @2 Y- U( _
  {
4 c$ x& e4 S8 s& n       if(point==1)
# \* ]7 x( Y. B7 e6 @9 S{" v! N! g7 w7 G* Q2 O
    RI=0;4 V% S+ M7 Y# X( q7 p9 e6 \  u, D
    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序         
! w9 I! S0 m. o5 _5 t- O }( N0 O+ ?0 Z/ Q1 e3 y! ]9 Z& H
   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写
5 F  O% `# m/ T* b/ m  if(point==2)4 v+ Y0 ~9 L2 |" p
{; R7 R% A  O! s4 q
  RI=0;( X% u2 q" v2 W" f+ A4 z! \0 \
  str[2]=SBUF;/ |. @, [: ]/ I; _2 X
}$ p9 }5 J+ G7 U1 ?1 X* B
   delay(200);' V6 Z; `0 d! U# ~
if(point==3)4 w( t1 t$ U  G8 _6 Q9 F
{
2 U4 C% p) c, E, U: D- p  RI=0;' j* }4 }: F% K' z' d2 ?( ~
  str[3]=SBUF;6 f2 z# D. Y* r4 y
}/ |1 r5 d3 H% s) B* ?: T
   delay(200);
' Q$ X3 l9 R- E+ z4 \# f2 t if(point==4)0 @6 U& p% Z: H& {/ q& |
{
$ N$ k' O; N% A, Y+ ~; B  RI=0;
! f" D& C# _. X% ?' X( \  str[4]=SBUF;
$ f% w; T7 _; y( V& Q7 G. ~}
- R0 o* o& Z6 B/ t$ g   delay(200);
5 T1 ~! v: b! _# D5 [! j" _2 Y if(point==5)
6 H4 p6 i( h$ K7 Q$ b2 i8 S{6 H# v, r) b4 E6 m6 @
  RI=0;
' ]  s7 P1 w1 t" t3 N  str[5]=SBUF;
$ K' o/ _% s1 I$ D% y. L}: }4 @2 A& ]: D  \; Q
   delay(200);; C& y( V$ U1 W* I6 e. g2 x: g
   }   
, J- a; S5 z( D; i$ U* K  Y}
! y3 a& s4 X8 a/ P3 K编程习惯各有所好  你试试看这样可不可以

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
5#
发表于 2013-7-23 11:39 | 只看该作者
不好意思   程序就是这样  要考虑很多 8 A9 A. y% w3 |5 k2 D- z
在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了
+ w, t' L2 B; R3 J' V$ v% p. ~if(point==5)
7 {# l  K% n0 K9 F$ j0 F, ]( x" \{
8 I+ P. y' N" j4 K0 p  }+ r# G  RI=0;0 x" Z4 o* x# r+ I  J) k
  str[5]=SBUF;
1 p9 {: h, O& z7 r2 C) V- N2 qpoint=0;* E! M  |6 k  ^. @3 I
}

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
6#
发表于 2013-7-23 11:52 | 只看该作者
这个函数也可以写的简单点
# b2 r/ l* F# f. M我比较喜欢写成 这样  一目了然
  Y1 Y( Z2 z) @2 N, f  q哈哈  

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
7#
 楼主| 发表于 2013-7-24 09:56 | 只看该作者
幸福万岁 发表于 2013-7-23 11:52 ' o" _, b+ z/ R+ X
这个函数也可以写的简单点 8 b! p% \& ]/ X- R' g
我比较喜欢写成 这样  一目了然
9 [( d+ x5 l! b" T1 k哈哈

8 X7 D! P4 P) \/ E1 F/ q1 C非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01
1 |: H. [0 p  L
, B7 W/ [( y$ J- Z' Q  E- ^3 L  N  j#define uchar unsigned char
9 Q5 Y/ e- U6 N& d+ r. _uchar  port;9 Q5 o! {3 k1 v6 z0 R
uchar  rec_data;0 a8 G. S2 e2 v, W8 p5 A
uchar  str[6];
/ O" W% b, H3 s- e$ [uchar  point=0;$ B' ~9 T* r3 W! T% |0 k
uchar  flag=0;* q, h. L, I  s; O: ]
//串口初始化
# X3 N" w& A/ A: E6 Q$ z# |, `; g9 Hvoid UART_Initial()       
/ f& L: ]# a1 w; J6 y{
- j& Y' B9 t7 r2 s3 |+ ]    SCON = 0x50; //串口方式1,允许接收
, P; h4 }, g( I  B8 {* R        TMOD = 0x20; //定时计数器1方式2
% z1 K# B: b/ Q# ]# u2 a" e1 p        TH1 = 0xFD;        //9600 波特率 FD3 W7 ~' o# G: k1 s# f) \  q  O
        TL1 = 0xFD;. a4 s1 T6 F- F2 K9 o) l
        EA=1;      
: k% I# W4 V" M+ ^        ES=1;      
& I( M# @. K3 l  Q2 H1 k: U        TR1 = 1;    ! i. r5 F$ s# X, U
}
2 M6 U! v9 q& Y2 i
- B$ u" Z$ ?1 B1 P/ vvoid waitsend()( T( f" F3 x2 K8 V- X# W
{1 W( S) k7 b/ m! @) Z5 @
    TI = 0;
. p6 V' v1 X8 {& {) P7 r        ES = 0;, r. O& d- e& Z) c9 m
    while(!TI)
* q+ f. n; [7 g7 v  n    {
# ]7 `% r( k8 B5 _! C6 M' X    };8 Q$ ~2 U  D0 e- X
    TI = 0;
- w7 r, t1 L* n* g        ES = 1;2 y4 {' m  N! B: p4 \+ v
}4 c% z* P  L) k/ M! O

8 b4 i! a. a$ u0 A. a5 Dvoid delay(long i)
6 c) B6 E0 j; s3 @% w& q{- R5 E4 E5 o8 ]0 r7 \- M
    long  j;
# g3 R6 `8 B' E, ~7 Y    for(j=0;j<i;j++)
- s; [/ H& l7 w* ]8 o, s+ d4 A    {
3 H9 f, u# u  u$ ?        SomeNOP();
3 n5 [! r/ q; i/ m        SomeNOP();
1 C2 W9 u1 M: e6 v3 B        }1 ]" Y4 D6 }# v4 n4 Y8 K; E/ x# X
}6 F# m! s* G. t2 Z  w+ _

9 g5 g, J" l- {void delay1ms(long  i)
8 m$ w- |6 W; P2 U/ e' n1 u! W{; O5 _+ \) I# r2 |. C8 R& k
    long  j;: j0 \+ @: ^; ]# @# n
    for(j=0;j<i;j++)4 \, q5 V* U/ e' g
    {
; k6 i0 j; ]( M* }            delay(70);+ V0 ?0 q4 B: Y7 J, i
        }
  T3 l- T  g+ G5 p8 i2 Q}# l1 U; D  m8 e; {6 f
void COM_REC(void) interrupt 4
* `4 K2 o; w, G$ P{
+ s) ^% h; e9 j$ a6 Y     
6 X7 ^+ n, K9 J+ Y  ]7 I+ ]    if(RI)
8 e: Q* m% T3 Y' p4 _8 F    {    //清除串行接受标志位
3 Z9 z. ~5 L0 Y        RI = 0;$ a$ ?" U7 {2 s' D
        rec_data = SBUF;  //从串口缓冲区取得数据% i! l2 Q$ ]/ r8 {& b" u
        for(point=0;point<6;point++)
6 [/ g# ?* l3 F! F                {
% K) p  |6 l* J4 j$ J        str[point] =rec_data;* i7 X9 \* p8 Q* x9 Q1 a
                //delay1ms(1);# Q- o7 L) a) y  a: D# q
                SomeNOP();0 v  r' i, x4 B- j
                SomeNOP();  u7 d) ?5 V! d# G" V4 F+ d2 A
                }; A2 ^9 _& n0 H' A+ ?7 k8 Z3 N2 T
        point=0;
+ D* ?- o  L+ M* D/ d" I        flag=1;
" D* N$ T$ ^9 Y" \9 X' M    }
% k4 f) ]4 m  C! ]4 i+ g; U( K}# C  ~5 @# {! K
void COM_SEND(void)
: `, z2 Y, u9 Y{
: M- a2 e' \+ K2 _5 b* Ufor(point=0;point<6;point++)             //连续发送数据                                 
. {4 G5 ^/ \. D( n& @    {4 ]$ ?& x. ?* S( H; L# B$ j
        TI=0;
# C( C- J2 d! ]0 I+ d% A+ R    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口2 l# L+ x/ j; T3 K+ h7 j) m
        //delay1ms(1);
6 U' N" {. H& H, r        SomeNOP();
# Q/ P' f5 K: G% i9 U        SomeNOP();- s: B  }8 w, o- t4 I$ |% I/ @! M
        SomeNOP();
1 {2 z5 s! i4 _        }
9 o4 K2 ?# w  s    //SBUF=Read_OneByte(str[3],str[5],str[2]);+ D# Q; O+ e3 Y; m# @9 }
   
8 y. ?2 [: e& V, h+ c}% ]& Y# F1 k% W, o( S
void main()1 C) L) [7 ^8 z8 V' D) q
{# }2 {; X/ Z1 @7 X' M- u4 y5 z! B
    UART_Initial();3 C( `6 j3 }5 w" s9 E
    delay1ms(2);% V4 G( O& S& f& W. F
    while(1)
, H# L+ p$ s8 `/ R- A3 x3 }: T) X    {
9 ?9 [3 l4 X" ~; Z# i                while(flag)
' R- U% c- }0 H0 p0 ]7 q+ G, {                {) E# @+ C% C3 t2 ?1 d5 z! [
            //RI=0;7 T+ `4 X& X1 ~: r0 j% `; |
                COM_SEND();
" d+ `* V8 V7 Y6 u( }: K0 j( R                flag=0;# d" g$ H" |, Z
                }# q% y: X4 T/ |1 G7 [2 u
        }
% e, p' [7 c, [  z6 P# L. f}

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
8#
发表于 2013-7-24 17:42 | 只看该作者
你这个程序  串口中断里的程序有问题   
! b6 m' V0 A/ [* s7 ~8 z你就按照我上面写的程序接收就可以了 5 ~4 G, l+ f5 X; r; A
应该没问题  其实是肯定 哈哈

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
9#
发表于 2013-7-25 09:26 | 只看该作者
我发现我写的代码也有错误   
. X  _* T6 ]) V# q" @  Y; N7 k你写的我等下帮你修改下试试$ b. B3 A2 k; P! ]5 ~# {1 `' ?. ?, A
不靠单片机谋生的   不是专业的

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
10#
发表于 2013-11-15 01:44 | 只看该作者
static void Serial0(void)interrupt 4 using 1* B5 S/ z* C7 G! l# M+ ^% ^
{; }# y( k5 g3 R( q
    unsigned char temp,head;
0 \8 k- t8 d3 J, v9 b3 O" {% v/ a$ m& h7 B
    if(_testbit_(RI))
! P/ I$ {* d& ?: [9 n$ W    {
5 j6 ~$ _7 a0 I2 a2 D/ Z. B        temp = SBUF;
+ {& [* z, L; j( w        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));/ q$ Z! Z/ j9 m5 S
        if(head != uart.rx.tail)+ N5 S; d9 s5 h% `6 ?8 a% W
        {
7 H+ o# t/ }5 Y' v) Q+ r$ j1 t            uart_rx_buf[uart.rx.head] = temp;  E# q! E: i/ b3 q5 m
            uart.rx.head = head;
& D1 L1 L. W; z( x6 A. P        }else
, T* h" g( [, F        {( x3 h  b4 C: g  x  L* B% I
            uart.rx.error = 1;
& w( d2 ?1 k; X0 D- ~7 V; m4 K        }
3 A8 f5 P9 {) @* `9 K    }) r. i7 f% g+ o5 @6 M
    if(_testbit_(TI))4 O) Y0 M% R- B, i9 f2 }, M
    {' k& K; y; v% Q+ c$ |$ M+ r) I) Y" |
        if(uart.tx.head == uart.tx.tail)& {9 T, m9 W( n* B/ R0 {. u) m
        {5 ~6 G" x) m/ e9 u
            uart.tx.busy = 0;
+ Y0 e& ~6 J5 E& b; J; `        }else; x4 s- W) Y9 [  V7 e) [! z
        {
8 a5 p# q! L/ C            SBUF = uart_tx_buf[uart.tx.tail];; G3 o) q- o4 k/ d. }% N6 n
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));' L! o+ z2 @: E8 A8 @
        }
# V# w, q( w1 d    }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-20 00:57 , Processed in 0.073798 second(s), 32 queries , Gzip On.

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

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

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