找回密码
 注册
关于网站域名变更的通知
查看: 1783|回复: 3
打印 上一主题 下一主题

c51单片机串口调试多字符发送接收问题

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "REG51.h"   
# E) ?6 h2 ^  H- L; \7 j3 p#include "intrins.h"% z) {7 w( F* R, I0 G
#include <string.h>
% t; S. Q* i! Q: f% X, s#include <stdio.h>: `; X# f8 U, ]" B0 e2 W! X& t8 U7 Y6 g
#include "i2c.c"! I$ l6 O( e$ J' y6 H
#define uchar unsigned char/ k% v* w& a8 q" l* H) g
uchar  port;8 x0 L6 F- D* M+ }3 y% T
uchar  rec_data;
! ?7 L! F% [" L, |: T9 H( H9 @# buchar  str[6];
* T3 G, X8 T, Y% |9 K  Muchar  point=0;, P" K4 h9 Y4 a( p2 i
//串口初始化 / K0 C* ~8 }5 X
void UART_Initial()       
5 |1 J+ @' X, B8 x{ 5 l2 p( P9 D! p/ ~9 q0 \
    SCON = 0x50; //串口方式1,允许接收
+ A2 `  u4 [4 i2 W. o* x        TMOD = 0x20; //定时计数器1方式2
1 \6 s% G. e. j$ [        TH1 = 0xFD;        //9600 波特率 FD
9 U$ |# R; Q2 }/ ^7 i. Z. k7 o) @        TL1 = 0xFD;
: ?5 a/ B' P( P' N: C" ~# v        EA=1;      
7 e4 D5 k) G: C! w+ P( n        ES=1;       " }. m4 a9 {2 w! P
        TR1 = 1;   
6 @+ Z% z' l' E  e% d, W}
$ `, ]' O5 p4 J' c- F# o, }; v6 s ; g* x0 i! |3 ~/ k
void waitsend(); j0 W. u+ w- u% W6 E
{
& c8 [6 L/ @" |    TI = 0;
! ~  m( h/ r4 @- _        ES = 0;
$ b* w/ ~' t0 X2 h5 D! M3 l    while(!TI)6 @3 \; Y/ b7 F5 l+ d
    {" \+ Y! M% j3 }. T0 A5 w: X+ Y
    };* w4 K6 T0 f8 B3 q# K, V
    TI = 0;" t; h; ~7 q1 l% P3 F! ^, g' J  {
        ES = 1;
' N0 Z) k2 H, D+ q}
$ F5 b' K! P$ h7 P& a0 hvoid delay(long i)
) p! G$ x  u( p6 T{: f( d- G9 K3 P( T2 L
    long  j;
( I- y* b! f# |% {3 a, K9 K' d6 X    for(j=0;j<i;j++)
8 j5 U6 |3 D+ @9 b$ R: l    {4 C# U- g0 z; H
        SomeNOP();% ]& Z/ s4 M- G% I9 o
        SomeNOP();
# H, }" _& l: L: l0 p4 {0 k1 C7 f        }
" Q9 `$ C( T: }2 P5 n5 u}3 d- ?5 k9 s; X

5 D) u& S5 n8 r1 e1 k8 lvoid delay1ms(long  i)) Z3 f% J, z# N- O/ M
{$ o" |; Z# F. c( ^
    long  j;
! }. u6 T2 L; U/ f+ B    for(j=0;j<i;j++)
9 s; D) h1 Y) j4 i7 m    {3 I3 u( j% |$ _& d4 y8 k
            delay(70);
& j7 ?1 \# C" h        }
, V, l' @  P9 x" D2 w}
) x& w6 E/ J, N! q$ Lvoid COM_REC(void) interrupt 4
8 K& U1 z2 ?/ n  E/ P/ k# G{
* Q7 r- p( A# M4 ~     1 D6 r, ~! a3 t1 Q6 U2 {
    if(RI)4 R! J7 ~7 [1 C7 Z& Y1 R+ J, N
    {    //清除串行接受标志位/ T0 {3 x; c9 u
        RI = 0;
) L3 {  n& N3 \: `        rec_data = SBUF;  //从串口缓冲区取得数据
( ?" P# d) ?! p! F; n        if(point<=5)
' u9 k3 J7 ~3 s. E& d. }        str[point++] = rec_data;
  j: p" |2 f0 g& E& i) V% L' V0 _: `6 d
  h  }8 K% O: u: \- `    }
  S, O) U/ D3 f) ]4 p2 C5 |. w1 ], L  {4 k
    if(TI); h) I+ t- y' Q1 o4 B& F& k8 W9 G
    { ( r) u8 g. O5 [* C
        TI=0;$ l* r4 P, @9 P2 y$ @  W
    }
) v: r8 w: S' h% Q. M1 s}6 ^+ b. w  r! G# d/ ]5 G: T, j
void COM_SEND(void)$ O& Y. V% u; E
{7 l, g2 N1 ^, |5 e# q. c
for(point=0;point<=5,TI=1;point++)             //连续发送数据2 ?% w# B3 }  ^0 ]
                                      ( u9 f* f! }- a5 F. n5 p. }
   {
  c( D, N: l% B8 p: o   SBUF=str[point]; //把缓存区的数据都发送到串口
/ F' _% `+ Q2 W, \   TI=0;
7 m* L! r/ b7 _   delay1ms(2);( O5 O: h5 h9 M- _$ |
   }+ I% [+ w& _2 N, _/ K
   SBUF=Read_OneByte(str[3],str[5],str[2]);. c( X) D. y& A. e* \/ j
   delay1ms(2);
* v2 o: f8 _8 \( L- j3 h5 {( _}  f& d1 L# r! U# P
! }) H  F  p, J5 T4 c8 Z

" Z8 h+ A2 M) W4 Kvoid main()9 q3 |! j, p; q, n
{- G/ D9 M# {/ R, |. \
    while(1)& l% |' h' K- s: T# q4 h, r
        {
9 Q; N+ O. ?1 U: K! n; _* {        UART_Initial();. Y4 E4 S+ Z' m5 Q) i
                delay1ms(4);) x; ]! F" G+ f/ Y- K
                COM_SEND();
2 {, d. b0 Q+ j' I                //point=0;: u& Y# U# R8 s  F+ J. I$ R
                }
9 `; }8 f! L9 V4 V" G2 y; v* W}
* f& x: u( N3 \9 {4 e4 C; Y0 O& M
% d3 z. f' d, J* V9 ]7 ^6 h2 b  g 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊

该用户从未签到

2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的 ; M/ G& Z7 h: U9 d' o6 }
外围供电 把RXD TXD短一下

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45
3 [& N6 |  t& h( g你可以先试试看  那个串口板是不是好的
) E, r2 s0 x/ Z6 `: C% H. M' r1 b外围供电 把RXD TXD短一下
- T( |$ Y# ?3 `3 \$ V8 E* m
板子没问题

该用户从未签到

4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"/ v! d4 L$ E  c: `0 W
4 M: l; X6 W* y% w5 {
unsigned char xdata uart_rx_buf[128];' s/ y7 E( Y  q$ {. ~
unsigned char xdata uart_tx_buf[128];; d- \; u6 t. M+ }# j  r/ [9 R
volatile UART_T xdata uart;
) r9 T, f) I; f3 nunsigned char xdata uartGetBuf[8];
# f, [! \* \4 v% Qunsigned char RxCmdPt,RxCmdTimeOut;
  w! m. v  Z4 W" _. f# V$ x
4 p5 Q9 V* n& n; P% b* Jstatic void Serial0(void)interrupt 4 using 1
$ I, c) E4 W! D5 ^! @( x{4 J2 a2 n' U5 U; @: j; C
    unsigned char temp,head;' }. E# Y' M/ ~9 s& c
( m  ^& D% l: q2 \4 k, t
    if(_testbit_(RI))" J; ?; H8 F3 D. ^
    {* b% A4 R9 ]% n# z! w
        temp = SBUF;/ o) I$ N# h( z' {8 a
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));$ T9 ]. E' ]6 G2 G8 A/ R
        if(head != uart.rx.tail)
+ o7 M7 d' x1 B. ?6 p) D! b        {& j8 d* k' X8 [, z. h
            uart_rx_buf[uart.rx.head] = temp;
- D: [) O# g8 q  S5 y' g4 U/ `            uart.rx.head = head;
) o" n, ~- }4 c% n# ]        }else6 N( H! [" X8 W" k1 H- p* b. U
        {
+ x. |* {/ p5 d            uart.rx.error = 1;
, G/ C, V1 o$ D5 `( V, `8 g( `% W        }  u8 H: B: _: \' w! L+ B
    }
4 F- l6 f, y  \" ^    if(_testbit_(TI))4 P% o3 r! Z! {$ u8 Q, E; C
    {5 T. j& s- W8 x1 P+ g
        if(uart.tx.head == uart.tx.tail)
( g( T/ @7 \8 W( |& Q; k& x        {7 C5 E5 j: r; X: y0 |( ?
            uart.tx.busy = 0;+ `" q) `. H) U" y# M  z
        }else! b5 h2 }- I4 u, M# U! @
        {
: \9 k2 c, [% y0 D, o            SBUF = uart_tx_buf[uart.tx.tail];
1 D7 }/ h# U1 |" h& E3 ^            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
* ^. V) x  ~" n5 A. f        }
! g" j# h/ {: o" }8 c, W    }
1 Y8 ^  A; z0 g9 Y}
$ U% L7 H. J& h5 n5 _//函数  串口中断初始化2 L( U$ ?/ r5 F2 x; E) ^: ^2 }
extern void UartInit(void)
: w% ]. f  d; M0 S{
  A" d; b* d8 ^3 ^; Z    RCAP2L = -(XTAL/32/BaudRate_9600);3 J$ ~& X- Q, |+ P0 A5 q4 D  [2 X9 |
    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;. W0 g1 H5 L. h6 H& ~5 S& W- i

: @0 o% A% x) I3 b4 W    T2CON = 0x34;
6 F+ ^. I5 j. }# d; k+ P  R+ n" J    SCON  = 0x50;3 j7 A) z1 Q" f7 v6 t

6 t, b( N" ]7 J! C2 U- W    IP |= 0x10;     //serial 0 high priority' H" s4 N. H' [% G; g
    IE |= 0x10;     //enable serial 0" \6 Y0 I( b; Q, j3 G

0 O; u5 p# e! z; _7 E4 \/ {    memset(&uart,0,sizeof(uart));+ g+ a" a* F! I. n8 b
}
) r+ _* `7 L  v& u( v// put char# h- S6 {. @4 z1 j% W7 k$ l6 ?
extern char Putchar(uchar c)
0 `1 R- O2 I+ e3 a{
/ S( L- O4 P. W# a" p2 K    unsigned char head;1 x4 C. s: H/ J( `( \9 n

- V4 S( |* E2 f/ v) P: v0 s    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));6 E, B$ C0 ]( O8 }
    uart_tx_buf[uart.tx.head] = c;$ l, G) x* h1 i+ Y$ q
    uart.tx.head = head;
+ k8 y6 O4 A# M
) z3 j8 Q  P1 I$ f    if(uart.tx.busy != 0x5a)# D4 U# o# V4 M( i: T2 K* t% C. l  R9 x
    {  [6 W5 w7 y4 Q, ?+ q4 ?) Z
        uart.tx.busy = 0x5a;
5 r& d2 D% C% s5 b* [        TI = 1;% t1 C6 V  D0 V3 `' p
    }' ?- v' T& X' o6 ~
    return c;
% R, F7 z" n1 M( G}6 ]4 v* z1 d4 y
//函数 判断串口是否有数据传进来5 R0 H! L" T" a- C% J8 W- l' Y1 u' I
//     如果有,进行接收数据( V) r- o4 ~, @$ Y+ ~1 W4 ?
extern uchar GetRxBufSize(void)
: O, [6 g! d. y$ \' D" b{
% u! d: T0 Q4 X1 u; s1 m' @    unsigned char head;
/ L8 E1 a: V6 p; `. U: ~' _6 G
1 `0 }5 d# [1 r; k    head = uart.rx.head;3 Q2 O0 P* w9 d, A& J2 D7 O
    if(head < uart.rx.tail)/ T6 ~9 L* H( B) f. W4 X/ y- M
    {" R7 u; v  B2 H5 r. a  P; n1 m
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
) a, c6 y: Q! L3 B+ f    }else
6 z8 |; z) E# o  O    {
2 v0 k5 S2 ?/ i- Z( v4 n        return (head - uart.rx.tail);
5 O, P4 T7 M+ f4 O- i$ c1 B8 H( m, F    }
9 r2 X0 [4 ~8 b}5 z# D- S) Q  j
//函数 从串口缓冲区取数据,只取前8个字节的数据
  Q, h9 M, c, ^$ }& ]; ustatic void EnterRxCmdModeByPc(unsigned char c)
5 J' ?+ G; p; W( }{
5 u% ^. x) ?+ L8 s    if(RxCmdPt < 8)2 t: g5 ]2 F2 q* [" f
    {0 p2 L# x2 _" w0 [% F! J, J. B
        RxCmdTimeOut = 10;' a1 r6 s" D3 n: c5 V- O
        uartGetBuf[RxCmdPt] = c;
' _, [. s8 g) M$ J        if(memcmp(uartGetBuf,Updat,3)==0)
7 ^$ G5 u5 @% L+ G; [  ]# k& R        {3 m, k# ]' O  D
            EnterIspMode();" B+ p! h  B1 Y3 R* X% b0 j
        }1 P* {6 j  @7 m
        RxCmdPt ++;
/ ?" ~+ P9 y. w/ j/ l, l- O' _2 j1 {5 H    }
  e6 {$ r+ U. M+ k: l$ y3 d2 N4 F}) v0 }# c; L& h) C7 M
//函数 取缓冲区中的数据" |5 h  L( b. O. e; e
//返回
4 l4 t8 [( A. j: y/ |4 eextern uchar Getchar(void)) K) S/ |8 {/ v
{& c( b" M+ E9 z  K8 k# p: K  q4 H
    unsigned char c;
7 h' @* G/ C% M6 o* Q% N8 {) O- N* ?0 w( p
    c = uart_rx_buf[uart.rx.tail];
$ Y  j% m9 r+ T' m    EnterRxCmdModeByPc(c);
: a2 M# ~; u4 E) M% v    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));' a$ |/ H& _: @" ?6 g
    uart.rx.timeout = 100;
3 a; I- `9 G: _. [7 f2 I" L' }+ N    return c;
1 q5 y" q* a( F}
5 k/ @2 ~6 [* z, Q0 y- G! ?% j0 m3 B//& d: i- p- p2 q' h0 s% Q. a4 T
extern void UartTimer(void)using 10 S4 F' H+ {" y7 q6 |- D
{  A- g  @; f9 [! ~
    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))  C7 a* p+ p9 @; F9 _9 }) p- }* N% Y
    {' |* w  b4 n& M5 D9 k
              uart.rx.error = 1;# {; E, h  q/ h# X$ N
    }7 P) j6 i* `: Q/ l- K: l8 [% M5 s
}
: g8 P/ D* C8 {/ ~! |$ F9 w//* b; H3 A* u+ X
extern void ClearRxCmdPt(void)- s1 _2 e  W% Z
{( v0 e, z0 k# |' R9 g* H# K
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))% i0 G. T! ^" I+ o9 k. d2 S
    {. @' A1 M: P9 ?+ C! b8 V
              RxCmdPt = 0;
+ O) N! x5 K* C8 A$ p    }
4 j+ ?1 |. D0 e1 t! |1 t: I& F}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-23 21:12 , Processed in 0.156250 second(s), 23 queries , Gzip On.

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

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

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