EDA365电子工程师网

标题: c51串口调试问题 [打印本页]

作者: zcl2012    时间: 2013-7-22 14:36
标题: c51串口调试问题
想以这格式读输出板寄存器
9 [0 G: |9 p3 x2 U6 v1 G5 O* U+ d0        1        2        3        4        59 A( y) O* X1 ~
                                       
2 L! Z8 g0 q3 S% j- j9 V2 FByte 0:固定为0x5a, c+ ], O* H, h+ _0 G
Byte 1:传输字节的长度,为0x06
; [2 u! p% z; s# n7 j0 p# iByte 2:port口+ j  |4 a: {  ?3 g; P- C) a
Byte 3:设备的地址;
2 V! o/ i: [. `2 G3 `Byte 4:寄存器地址高8位,(暂时没用到,默认为0x00,便于以后扩展);% x: X' R: D4 `& W# S  z
Byte5:寄存器地址低8位(0x~0xFF);5 K7 D  f/ k1 N- g, P& D% w
例如:5a 06 00 98 00 01
' K- i4 m- L( K7 Z如何写串口字符串收发程序
5 H7 R+ ^; y) ]; P4 j) w6 n请大神指导下,新手不懂的太多
作者: 幸福万岁    时间: 2013-7-22 15:42
你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
6 r+ T5 [' t# O# p& p( a4 n; W你要写什么串口通信什么样的程序  我有现成的  不过如果你想自己学会了 自己写程序' V+ [! J1 j; k* Z: B
我建议你 还是下个郭天祥的视频  串口通信不难的
作者: zcl2012    时间: 2013-7-23 08:53
幸福万岁 发表于 2013-7-22 15:42
/ Z: f$ N& l6 C) G8 n% Z1 Z$ c你可以下个 郭天祥10天学会单片机视频  他在第7讲就专门讲串口通信
4 F% q* \7 ]$ F$ G你要写什么串口通信什么样的程序  我有 ...
; n3 s/ A) p; _4 Z
void COM_REC(void) interrupt 4
- m, }% f: J( d/ _{
8 V; p1 Z8 ?* |) h* R5 b  p& v     
# f5 G  H3 F4 S* Z% I    if(RI)3 l; C- H. s. h5 q' D' }
    {    //清除串行接受标志位
2 A6 [, G, I  e6 i; g9 I        RI = 0;) T  U( B' t% H. D, @. d  W7 t
        rec_data = SBUF;  //从串口缓冲区取得数据# j) \0 q, t: x4 L8 u$ L9 Z+ U& G
        if(point<=5)2 n" k  l  _( U- ?8 i
        str[point++] = rec_data; 4 \1 B& q- Y* `: O
                flag=1;
, p+ A) J) T  c& }0 r' {/ p% T% c+ T; T: e' V) z; Z9 }+ [% ?
    }' P; O6 t1 F+ d0 u- V
}# U) p$ t8 d2 R" q8 k$ V
void COM_SEND(void)
" T$ T2 Z7 j8 g3 D; y% Y6 \{
% r5 l, m( \3 y/*while(flag)% w$ z3 A3 Y4 X; Q8 }# [4 b1 m
{*/
$ k, t2 U/ n: C1 jfor(point=0;point<=5;point++)             //连续发送数据) O; n; Y* Y2 p+ s# K5 N0 Q
                                      
8 q4 Q; ~/ @5 q* G    {
. m: P8 ~8 {( Y5 L7 |4 d( q: B, i    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口
$ v. U8 g1 w6 e" g+ C# Q9 p1 P' I. R/ N1 }
        }+ c3 T, [6 ~; G
   // SBUF=Read_OneByte(str[3],str[5],str[2]);6 v- j' o: c- Q2 `8 T
flag=0;    % W# W' T2 n, I9 t. n7 ~9 y1 {
}) f8 H/ h9 ^% V- C. k
void main()/ K& W: G. l. E
{
1 F' b# R4 k: `0 g    while(1)
/ y- a6 T2 t5 w+ V        {
. K* D0 B# Z8 }( h! S/ {1 E7 H; {        UART_Initial();7 d% ]  ~9 j( ]( v7 x
                delay1ms(2);
9 d6 l  X8 p: G                while(flag)3 _! |6 O% v) t) R* K- T
                {. L* _- [) A* ^* C
                COM_SEND();
/ H6 {  ~2 ]2 o$ f/ a  E                point=0;# Z( f! I3 |5 [0 r; Y( z; w) F/ k4 q
                }/ X, A) {4 m9 p4 r
                }
% H  t9 Z5 f. y3 B: D}- W  S/ b. t: {( @3 O$ b
这是我写的程序,麻烦帮我看看哪里有问题
作者: 幸福万岁    时间: 2013-7-23 11:36
串口通信的时候单片机在接收多个字节的时候 4 _; J. g# v/ s/ G
接收一个字节 延长点时间  再接收第二个  
  K/ b4 M6 d, f- t7 o# y! j1 f) F# y我写过程序 接收多个字节的时候 不延时不行+ N) R* M  `" b6 \* b
发送的时候 估计也一样  
7 T. D0 p4 [; I# t; I" q, m我看你没延时 估计就有问题  6 V; z1 a; }  G# ^* `4 U0 Q4 l1 K
你把接收函数改成这样
' T5 W9 y$ u* I: O0 X. Dif(RI==1)    //等待接收数据
" |: g; K2 ^3 f: a: L  u+ C        {8 f+ {; g& v3 g! r  ?
                  for(a=5;a>0;a--)   //循环5次 接收5个字节
# `2 X  O5 X6 a" ^$ Q7 `% ]. b{8 D. y( Y. |' ]# G
          point++;                 // point随便定义个变量 # f: \- z% Q9 z, B0 b
  {
( N* k1 ]7 M* S: R6 L; b( ^) T& c       if(point==1)
1 t* L6 q4 }, Y4 s: j% ~, v9 I{' y; g9 z* _4 ?4 U9 k6 o$ l" `/ l
    RI=0;
% D; b1 V$ S3 w$ O1 Q    str[1]=SBUF;            //你应该是定义一个数组,然后把接收到的数赋值给数组的第几位,然后根据判断这个数组的数或者根据这个数的大小,然后再执行什么程序          1 o; W5 U( J, e( K( s+ `. c
}
; B0 \7 T/ b# {# H" `1 f   delay(200);  //  延时一下   不知道你延时函数怎么写的 我一般都这么写
% ^' y/ a, V5 l& H5 q3 r  if(point==2)% ^5 c- v6 P9 H# _$ c" {& G4 p  K% z6 c
{2 `, P. z9 F5 g9 L1 ~# N8 d
  RI=0;: o) {. Q% i! j
  str[2]=SBUF;
4 Y. a6 `  O6 o9 }}5 P1 V- _2 g$ k5 F( S# T$ V# a* u# @
   delay(200);$ c5 L: ^7 h8 W5 r4 J0 Z0 L4 D
if(point==3)7 z$ e. e0 B* G/ v3 ~
{3 ~" x+ q4 u6 {+ q
  RI=0;  `0 r2 D4 V) ~! t9 A
  str[3]=SBUF;8 x- g9 F- h8 k; [; b3 H& ^& t
}
  f( m8 F( Z. W   delay(200);
& X  h! C1 {! V8 h2 R; y2 }  Y# _ if(point==4)0 H* ~* p8 G# D. B* s
{6 p, i: _& {9 Y* X) m2 m
  RI=0;+ J, w: z2 M  B# x- }. S& H6 u
  str[4]=SBUF;
) O$ r0 b: {9 |& ^7 i; O% g$ ]}
; ^3 Q9 _, G. x, X% H   delay(200);
. m* j) V8 l+ ^- R7 g& s if(point==5)
0 K3 k. E  D1 o$ M# c{
( F  P( k2 {. c7 z6 U4 v8 R  RI=0;' \" I& Z% H0 W# o5 h
  str[5]=SBUF;8 i% R4 X+ t5 N* t) A
}
( @1 Z: {4 W/ p( I+ r4 _; W+ s$ |   delay(200);/ O7 p: E9 C) e* {3 m+ V$ v8 o; |
   }   ) q9 W9 @3 G  M. j" I0 B
}. f" T0 c1 l# `/ s
编程习惯各有所好  你试试看这样可不可以
作者: 幸福万岁    时间: 2013-7-23 11:39
不好意思   程序就是这样  要考虑很多
& l3 O" T) e/ d在接收最后个字节的 忘记把point清0了  要不第二次接收5个数 就不行了3 j. |1 _/ N$ u
if(point==5)
' s0 b: N5 C- e) L{
+ V* a7 L+ ~2 w0 |/ c  RI=0;# V6 O0 V9 l  |/ F/ R- [1 @* {
  str[5]=SBUF;
/ g/ ^& k" p" l* Epoint=0;$ I: u+ ], V0 H- U% s# z
}
作者: 幸福万岁    时间: 2013-7-23 11:52
这个函数也可以写的简单点 0 d# d, n" D3 [: Q- [# X8 w
我比较喜欢写成 这样  一目了然 & o7 y8 A1 g) g9 r* I+ ]
哈哈  
作者: zcl2012    时间: 2013-7-24 09:56
幸福万岁 发表于 2013-7-23 11:52
( q! N7 j3 d2 X" i) s这个函数也可以写的简单点 + Q' Q5 t& o1 O! U8 r) |6 t3 a
我比较喜欢写成 这样  一目了然 : `' P* Q1 L2 {
哈哈
% l" O- \- \( q$ _, z: M/ ~% n- N/ L( L
非常感谢你的帮助,确实是延时问题,目前是发送6位,接收10位的问题例如发送5a 06 00 98 00 01 接收为5a 06 00 98 00 01 01 01 01 01" A4 e* [" `: W5 {, d3 o
8 D6 I3 l/ O0 o, z: c* q$ R$ `
#define uchar unsigned char
4 q4 {, o0 L' ]$ o& K+ Q4 L, Juchar  port;
6 C4 d  g3 {  W0 @7 `uchar  rec_data;" p; D  f1 p( G0 I9 g' s' }2 D2 p
uchar  str[6];
- A; @4 a1 h3 Xuchar  point=0;
5 n! b; J6 l  {  s% puchar  flag=0;/ }' P; x- S4 A
//串口初始化
6 L4 z& `9 ^$ {2 Ivoid UART_Initial()        - R, a7 ?" F( Y) e% k+ t6 j
{
3 z+ M9 U# u% t    SCON = 0x50; //串口方式1,允许接收" k. A: B: \8 l& n8 R' K/ @
        TMOD = 0x20; //定时计数器1方式27 Z: S5 x6 O& E' {, |5 C
        TH1 = 0xFD;        //9600 波特率 FD
% C3 R$ |* y+ `& }4 _! X        TL1 = 0xFD;- {0 b! j& L3 e0 m* v, O- @
        EA=1;       " i# Z- O& a8 s7 B9 ]5 W: v* c+ x
        ES=1;       0 B. Y1 y, l# \* p2 ?% O8 w8 Y$ j
        TR1 = 1;    - m8 ?5 k# ?8 K. A& x6 N
}$ ^4 m" {! R  y3 O4 w

+ y% M: P+ j: q5 dvoid waitsend(). ]) A& r. o  q! d8 F1 L2 a, o0 M
{
4 P' A/ v/ A. H; O0 w4 [    TI = 0;
/ q: z9 q3 C9 F6 v        ES = 0;
! g$ M7 v$ u- x* ^4 l2 j5 z& ], ^    while(!TI)
% f/ z( y7 \% p* ^- A    {
3 v2 i# C' k# @    };* W: D7 \& T' v
    TI = 0;* ]$ O  _# S0 Q8 L3 k9 p- g
        ES = 1;8 \- [, Q  M) `/ S
}/ m, B7 O7 U. P
1 i$ C$ t$ }) `4 ?' {/ }4 V
void delay(long i)- i6 L4 O! T5 Y0 ~
{
( G" s- d5 \' D8 j7 m9 Z6 i    long  j;4 c+ h6 W. U9 h: [
    for(j=0;j<i;j++)
5 R0 ?: H& W. s! j    {; B8 p1 i6 T( C, Q( y
        SomeNOP();; A3 |+ i9 L- d9 T7 D  H: g+ c
        SomeNOP();
  T+ e  j, o  g, n        }2 L; j) N. `0 t: n+ K& R6 b% ~
}
6 n  {& Z( q. o- u9 T+ Q9 _4 C+ c( O: b$ ~  U1 ^% W
void delay1ms(long  i)" [: G+ w  s# H4 D% P. f
{! w% n2 V0 X5 H7 `
    long  j;
# K$ s  f% G/ ?. D+ k$ N/ ]; m, W    for(j=0;j<i;j++)0 {7 a, i4 x, b7 H( k& [+ d) w
    {
" J6 n, {$ X0 ^" |$ @            delay(70);& S# Q" N5 z! N8 _3 h: o7 V
        }5 O8 Q, i) N/ k0 m6 _
}
/ m$ e% E& y/ B1 Evoid COM_REC(void) interrupt 4
# y& w8 x; u/ L, {5 n6 I{5 c( W, j" a4 Z% t, T' p2 f
     & Y6 t9 V! x5 t7 {7 H. y7 {1 p8 V
    if(RI)
! R: I' X7 S% k* g    {    //清除串行接受标志位& U; U3 m4 \% z( J
        RI = 0;+ n) |- _/ ^. t
        rec_data = SBUF;  //从串口缓冲区取得数据. y, G4 ~( R% M  ^% x2 s
        for(point=0;point<6;point++)4 K* a4 W$ I( v8 m0 J8 E
                {
' B# h" a& _3 ]2 {        str[point] =rec_data;
1 B7 t, O+ \; k' i" V                //delay1ms(1);
/ f3 U  v) X7 x! |                SomeNOP();
3 }) Q0 E  ]" f, y% k                SomeNOP();
, M7 M. u- c! ?# h                }
% d% t' J4 D: |" Q2 L% N        point=0;
7 q" Q0 P0 i) _1 T        flag=1;
. \7 X6 i! @$ ~    }
+ C, v$ r* w3 F9 C2 `+ r}
& a) _; [+ w+ D9 Cvoid COM_SEND(void)6 C! p1 Q% G2 ]: O( E
{6 Y4 J0 g/ j/ y9 K5 R
for(point=0;point<6;point++)             //连续发送数据                                 
. I7 `) ]% j. ^/ G5 R/ q) G    {' a' y) J. f6 \! Z* j0 p0 [
        TI=0;- d' \; e! g9 a/ @& n3 |2 @& X" L
    SBUF=str[point],waitsend(); //把缓存区的数据都发送到串口; u) Q( D4 d4 U* g- z2 Q
        //delay1ms(1);& P* d' g* m' Y$ [/ w
        SomeNOP();
  M& F& U! W( ?: g0 ]1 t        SomeNOP();
0 \5 U/ x" ^' W0 Q! `4 m' M        SomeNOP();2 @. F% ?! N% Q# W2 V1 d' y
        }6 w# ^  b5 D9 q1 g/ `. S) E
    //SBUF=Read_OneByte(str[3],str[5],str[2]);
; U4 S. o( O" _. l' s    ) h' b0 a/ u/ X! [
}' r# z# w2 \6 v0 O$ D6 @
void main()
$ R% D; V8 V, d* j& T" X{! ~& r( V& F! F) V& t2 D2 f
    UART_Initial();* l2 u' }) g& }
    delay1ms(2);
$ x( H* x3 G  U- z3 d+ |    while(1)
( m: Y/ @" q- @; q: B, W: `( f    {9 F7 Z4 ?: h. f2 ^
                while(flag)0 F' ]' H! G. N! k% L4 `7 g, }
                {
& |2 F1 \$ e( w' P            //RI=0;- }+ p' E. i6 N" T" b
                COM_SEND();
5 @4 o' N) n# @                flag=0;
2 B# l$ x# ~  A( i1 C3 x                }
4 g/ y4 q2 c  r- q: E0 O        }, g4 D  |2 a6 [0 W* a: T
}
作者: 幸福万岁    时间: 2013-7-24 17:42
你这个程序  串口中断里的程序有问题   
  X' i3 ^& e/ W你就按照我上面写的程序接收就可以了
/ C6 d! b% z) g/ A4 L) M应该没问题  其实是肯定 哈哈
作者: 幸福万岁    时间: 2013-7-25 09:26
我发现我写的代码也有错误   . o0 G; W. I+ U/ T1 F
你写的我等下帮你修改下试试* B, U  L) u; U) _# i; q' _
不靠单片机谋生的   不是专业的
作者: 天才小痴    时间: 2013-11-15 01:44
static void Serial0(void)interrupt 4 using 1
# A" W6 {: `) B: O4 L{
/ q( y1 i. @+ N    unsigned char temp,head;+ k; e9 S1 l, {0 F0 g1 @

! i3 R8 A1 V9 M+ z/ p% K6 C% ?8 }    if(_testbit_(RI))
7 ^! G- E4 |. \4 g+ r6 d+ U    {; p8 h/ O# {! W
        temp = SBUF;
% A, L3 F& K( B. _4 N" g        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));7 r3 d. X& G! R
        if(head != uart.rx.tail)/ a5 \* @/ @# }- z8 o
        {0 E  f/ i& |: m/ t, d
            uart_rx_buf[uart.rx.head] = temp;
$ ~# H0 q' _+ z( _  A  W0 N0 O3 {            uart.rx.head = head;
% R! q3 [$ Y/ M0 S1 x1 {) w, r$ v( G        }else
) N+ R! H- M- ]: ]" T" O8 t        {
" q$ R* |2 y: p; Q            uart.rx.error = 1;, {. Y. a! Y, }  A( Q
        }4 E# f+ J" @3 l. [2 d' R" `
    }. W: N+ d, M6 B* ?) r& l
    if(_testbit_(TI))
9 h/ W+ O  [1 c* t/ b    {
8 F. S% P; t; R, W- h+ S        if(uart.tx.head == uart.tx.tail)* O2 l( t4 y* C  e* J
        {$ ~6 R2 ?1 g* }, B
            uart.tx.busy = 0;
" I1 h4 N  i, O7 x        }else
% Z( K6 V" [* ]# p0 x- s: k        {, w- ?4 L' v3 e5 R; A( L  R
            SBUF = uart_tx_buf[uart.tx.tail];
' u3 [0 c" y6 }: {, Q            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));6 v  Y0 v. E5 E
        }6 W" u- L" a. C! h4 B
    }




欢迎光临 EDA365电子工程师网 (http://bbs.elecnest.cn/) Powered by Discuz! X3.2