找回密码
 注册
查看: 1715|回复: 3
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "REG51.h"   
5 q& n) A7 |3 E5 s8 v6 P#include "intrins.h"
9 C: Q% p1 m$ M0 {+ L#include <string.h>3 y# E' [8 s- k* `
#include <stdio.h>
9 h) e. X7 H+ w7 e: B5 N8 x#include "i2c.c"& t% K+ j. k" V9 q5 a
#define uchar unsigned char7 g% i2 y. u- S4 E: G
uchar  port;
, [8 p! x% B& H6 euchar  rec_data;5 j- K# P$ _( K% R2 d7 p
uchar  str[6];
3 a  s" O0 x0 r# E/ N* L# Zuchar  point=0;
( P8 Y5 P. Y' b' _) v//串口初始化
' d2 Q, Y. ~- s; ~/ N4 j5 g+ p0 Fvoid UART_Initial()       
) m& c* \% ^( M4 E! q; b4 U{
+ H3 f5 w1 f& @* r    SCON = 0x50; //串口方式1,允许接收
7 g6 |, M" V+ g7 d# l        TMOD = 0x20; //定时计数器1方式23 B! ~# ]9 w# c( f, A7 G4 [
        TH1 = 0xFD;        //9600 波特率 FD
% {1 e& i8 T3 I% l% K$ }0 _        TL1 = 0xFD;; u$ D( W% p2 u7 y
        EA=1;      
2 A' V/ [7 s! N0 a! N- i2 J        ES=1;      
; P. r* z2 Q% \# d2 J: B: R        TR1 = 1;    # o; P* P( |* a/ m
}9 I8 i; [6 X* e" V  b

. l# k5 q) l% ovoid waitsend()
8 A4 h" A# X  f5 U/ Y, N! g" x{
$ l3 k8 Z8 x: [    TI = 0; : z+ p: w% S" V; }; z
        ES = 0;- ?: z9 Z" W4 W
    while(!TI)
4 B( Q, R3 W0 d8 d    {
6 b9 n! `% x, \; J    };
/ {7 N: _% O3 D% l; m/ k9 L    TI = 0;, w* \; W: u; ~8 l( T$ }. p
        ES = 1;: ^& F7 W0 _' A4 ]. t- |$ a& V
}: O/ N$ r. c, R9 J
void delay(long i)
# @# R$ d- z5 H. A* z+ S/ T{
* T$ b. m! q- C5 ?  m' K    long  j;
2 L5 Z1 h7 }$ ~0 k$ U1 X    for(j=0;j<i;j++)" C& h8 v1 S$ {+ s
    {
; H2 v/ D1 i- M% r. B% D# p3 [        SomeNOP();: p% G  L  H! ]. l
        SomeNOP();6 R+ n# Z/ U4 u# P1 t6 Z
        }" [; T' _3 {3 S1 F4 z7 ^
}/ J7 I) N9 n7 W+ G% N
8 W- R4 b1 E/ T- W- z
void delay1ms(long  i)
- E" S, k6 l1 B* H5 E. ?3 C{( r% k+ N) ]* {( K
    long  j;
5 n; I5 e' r1 B. N3 H" s    for(j=0;j<i;j++)
( B9 t: E: Q2 O  t4 O! K    {
7 K5 h6 |* ^# D+ P            delay(70);
' V, m, b& M4 p5 {3 w1 r0 J        }
3 ~. W* k( W: G$ ~* o}: L7 w: F  r) U1 h: h6 u+ [6 {; a
void COM_REC(void) interrupt 4
# _; M) P5 w9 e# ^{6 u! Y% E. m/ w
     ' M+ _2 E" j* m2 l: `  P
    if(RI)
5 r+ R5 ?$ Y  Z+ c. k& s! V; N    {    //清除串行接受标志位( R4 ?) @5 \  i. ?
        RI = 0;( c  @8 |0 F2 o- b8 Y3 F; w* E# b
        rec_data = SBUF;  //从串口缓冲区取得数据. l+ J! S, g& S2 d6 M+ h
        if(point<=5)
' v& y4 |/ M( p$ w) |- ]$ p, B$ ]  f        str[point++] = rec_data;  L/ y0 Q! @7 e* T$ n$ j0 e# X
- h9 H0 T' t8 T4 `( O
    }
: S! G8 L/ w. z3 b* _
' i( f9 J( n0 J9 x) `0 {    if(TI)
8 e# y7 Y- o+ O! h0 l& T4 Y    {
$ {# ~8 t/ c( h% t        TI=0;
' D: ?! {& ~! E  X6 m    }# {+ d$ W; {9 A
}
! M9 @: _. o3 |void COM_SEND(void)9 ?& t, Q3 F+ k7 K& ]' A
{9 N* g: }3 d6 S! M% `3 U: B! `
for(point=0;point<=5,TI=1;point++)             //连续发送数据5 s/ [" {0 B2 d1 Y" j) N$ {- h9 a+ T
                                      
3 ^6 G2 L3 T) h5 u  q   {
. |6 |/ ?( _+ j+ k9 n   SBUF=str[point]; //把缓存区的数据都发送到串口5 ~! _0 D% b# I' ?. V' w$ X
   TI=0;7 p9 Y7 a: i' N! y+ F
   delay1ms(2);
- `9 C, G" K0 H( M* F   }; Q+ z$ T! y0 b' C2 Q3 m6 z
   SBUF=Read_OneByte(str[3],str[5],str[2]);, Q' V# K1 _  ~% R/ J
   delay1ms(2);# J2 m1 c% K- h) G/ D+ N
}
* x1 @3 g0 ^: o2 u7 E2 N
! Z2 T5 Y7 S* c8 z: M+ a& n
! i3 A  Y5 Y( ?void main()) _4 C0 L6 E$ \. W3 n6 G- [7 m
{
: `5 e' X4 ?/ [8 L$ R2 b    while(1)
: F( G" Z" Y& C8 [        {
, E7 A  ^. G$ a        UART_Initial();
& [4 ]  I& g6 |- D% G7 l2 {                delay1ms(4);
+ y, I' P$ v+ K, ^7 u! v. F                COM_SEND();$ j: h/ M& S& Y5 C1 M
                //point=0;4 J6 |. H# Y. v; w
                }8 A+ A9 T$ w3 w5 D/ I# Y8 g3 |
}
' A" T0 c6 H" r5 R( A* w- z
! E. h" F  v1 b0 u6 O5 w 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊

该用户从未签到

2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的 0 [$ b2 U. G6 Y/ L! i/ |! j  L" R
外围供电 把RXD TXD短一下

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45   s0 ~1 J" Q+ K; v) l
你可以先试试看  那个串口板是不是好的
5 k0 H2 ^" D/ {# U外围供电 把RXD TXD短一下
) y4 P* H% @$ n- w3 J7 h) M1 q# X
板子没问题

该用户从未签到

4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"
' q' x# N4 \6 m( s3 q1 g! N
3 I7 ~8 q  N3 N/ [9 i9 c" X9 F0 |unsigned char xdata uart_rx_buf[128];
  G$ }$ {* Q" m% Nunsigned char xdata uart_tx_buf[128];
5 c! v- Z5 _( t6 r, z/ X, V& avolatile UART_T xdata uart;
2 Y: U3 B& }: {( b2 ounsigned char xdata uartGetBuf[8];
  M7 v- M+ n# w6 N: l" dunsigned char RxCmdPt,RxCmdTimeOut;+ a( ?6 t, h( f& a$ ]# K

! e: g: p; P( {& z, U) Ustatic void Serial0(void)interrupt 4 using 1
' `7 p$ V5 T5 O7 r, V6 I) S{! ?0 i5 A* |; g+ R
    unsigned char temp,head;. B3 n& [  }2 \- |' Y
3 x& G2 S8 Y- X$ N
    if(_testbit_(RI))
% S3 F# [: n+ L& c1 {$ v    {
7 x7 y+ m8 w( ?        temp = SBUF;: Y) U) V2 R1 D2 ~* Q! m
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
: ]+ k! k+ E+ F# I        if(head != uart.rx.tail)* R$ K% h5 h6 I( T: D0 G. M: X! |# b" m
        {
6 [7 l, L" X2 b7 }; }3 }            uart_rx_buf[uart.rx.head] = temp;
) u& U7 j3 ]* o# n& a8 i            uart.rx.head = head;( V! N3 K1 y* ^/ B# C5 C' `
        }else+ h" T5 R; v4 C! B) s5 g5 k1 W- Y
        {% ^9 s2 U% U% T1 R: E9 t, d( Q! N
            uart.rx.error = 1;3 F, [9 S$ i3 H0 c
        }4 U2 u& Q) i1 H& |- t2 m
    }
% o4 X  f. `5 X1 H4 E% x- D. |( R    if(_testbit_(TI))' p: T% D- E! _& \: [/ V+ l
    {. v& Y. D) j: Z% N' n+ U( v& y. V# m
        if(uart.tx.head == uart.tx.tail)
0 W0 e/ f& b9 l/ T# P- i        {. I  x% F& r/ p; e& t5 w
            uart.tx.busy = 0;
' p4 V. p% `4 w" \        }else" V& R: K9 q7 A% e1 d  U: Z% K& t3 c
        {) U- y- g. |& p$ H
            SBUF = uart_tx_buf[uart.tx.tail];( |0 d  P3 |& b1 d# A9 v
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
4 v) u+ H, C9 P: R# ?, x7 I        }5 z: X( n8 _" d8 S7 e- U. s/ u3 [1 \
    }
7 x6 c1 {  v1 f}& R2 h1 h+ d& I
//函数  串口中断初始化* r& ~+ {3 B& e! h; i2 u
extern void UartInit(void)
9 O& G9 e. n3 V- O$ ~- k{3 I0 W. H4 _5 k( q
    RCAP2L = -(XTAL/32/BaudRate_9600);, Q8 B5 A0 q0 w$ `+ Q* K. r
    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
2 Y3 U, o1 M/ `4 o" T: R( |) G8 _% ~, B' D8 C/ R- z; ?# J: P
    T2CON = 0x34;( O# B: h; G& Q. X, I
    SCON  = 0x50;5 i/ }- \3 C2 J% P

6 X3 |4 w# X0 U- L+ i    IP |= 0x10;     //serial 0 high priority
4 o! J7 p! E* Q    IE |= 0x10;     //enable serial 0- P- C3 \1 ?( e0 }

, f1 A" x* t) g( U# f0 l( b1 w& s    memset(&uart,0,sizeof(uart));
* B0 R+ _- f  C}
( s' U; o, J9 t& J; X, j+ X7 f// put char
& v5 c/ X8 }/ c1 Kextern char Putchar(uchar c)* k2 f9 C5 V. m0 E" i+ f
{
: V% |+ r( W/ c& u) r3 o! y* Q& |    unsigned char head;, S0 @: ]2 i- |
! B; V% C2 k8 y, z
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
1 b7 B6 e0 n2 m8 b! g9 t' t$ S    uart_tx_buf[uart.tx.head] = c;2 d0 K% m+ q5 s. M- U; S5 Q$ p% l3 ?
    uart.tx.head = head;& I; |6 J. Y& H# B- |2 G
- y7 u1 B! I( K! W; u' {0 j* |* e# X
    if(uart.tx.busy != 0x5a)+ X, J/ G" c! y6 s
    {
& b( Z' J- Y5 X! o1 [2 [        uart.tx.busy = 0x5a;
% |1 x9 }& U( o: G2 j  {0 T        TI = 1;
( S5 t0 ^) C2 F& Q. B2 Q- R6 Y    }
" z' c8 _, E8 ]- V* p, T    return c;
! f9 w- O2 K, v: d/ H}0 D1 x" l2 [0 D
//函数 判断串口是否有数据传进来
0 X% ~. C, h" G" e9 M% V) R" q//     如果有,进行接收数据- T- P% a1 `8 y9 J
extern uchar GetRxBufSize(void)
7 n+ {  w* e% r1 ~  P" T2 |{5 ?4 c7 X: E& L: l# a. d
    unsigned char head;+ F, m0 g! K0 Y

- a5 B5 F1 r* G+ o: \    head = uart.rx.head;
0 m6 n/ G& W( W% }" L" r) P2 X    if(head < uart.rx.tail)
" k3 d& K5 G9 ^% u; D2 _    {# E3 Z9 ?& D# F5 ~2 g- J8 Y2 q1 [9 c
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
' @- H% i' w) P( Z5 Y    }else3 l5 v9 W5 {" u# f3 K4 F2 q4 ]
    {
; p$ p% [/ ^3 j$ L        return (head - uart.rx.tail);
0 ^% U. A% K3 l    }
1 r. G1 D- h& p) @4 [+ e% Z9 A1 N}
4 I) v- I! }8 _//函数 从串口缓冲区取数据,只取前8个字节的数据
: q" Q7 W% J% `* \static void EnterRxCmdModeByPc(unsigned char c)( K4 `8 b; H; e" |/ M
{
) o' m3 d" u% c- H    if(RxCmdPt < 8)
# U/ K; h( g  ]( D9 O0 H; D9 S) B7 @    {
; k- Q9 ~8 J) Z4 _0 R) F* w+ p. z5 w        RxCmdTimeOut = 10;
% z4 p% |8 a" G3 T# w        uartGetBuf[RxCmdPt] = c;2 K( o% l9 T* d; S5 G+ }" m+ L8 c
        if(memcmp(uartGetBuf,Updat,3)==0)5 \  o- M% f( Z" s0 a: W
        {, U; F: H7 c9 d8 {/ v( x
            EnterIspMode();
) X* a* `  E% K2 }        }
8 r+ Q2 d  i0 D8 d9 f/ d3 k        RxCmdPt ++;
7 Y5 m1 K' M- h$ w    }
( X! I+ C% S) T" M}) `5 R5 A! t1 L. D! k
//函数 取缓冲区中的数据
; Z% _: r2 `! z9 f//返回; q- w8 S4 n$ h$ t
extern uchar Getchar(void)% x; K5 h& a# z
{
5 v0 n  m: [/ Y4 b5 ?' y$ B, V    unsigned char c;7 b/ k2 m% i4 f% t% p
1 _1 s1 ~, r- @5 U: `! ^% G6 l
    c = uart_rx_buf[uart.rx.tail];
& |8 D! c* s  n0 U: A8 E    EnterRxCmdModeByPc(c);& ?6 O, W% N# j" X- p/ s  f
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));# |% y* O/ d5 K# ~1 I. z* f6 f, p7 B
    uart.rx.timeout = 100;+ e; v# |& K3 \3 v4 p
    return c;
: l2 I* g$ G# m& \+ E9 Y}
: ?4 z- X8 ~% i- j//, l: |* c6 |9 Q, g
extern void UartTimer(void)using 1
7 J& Q9 A; ]$ T# L/ k{4 v& C7 I7 M# o
    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))* B+ w/ ?+ d; E% c: u" v
    {# S- d- u& k+ g1 Z6 v' P" h! T; u
              uart.rx.error = 1;
2 d  \5 ], L( @8 Z" f- L& g8 q    }. S+ l2 \, Q. _9 _# g5 ]
}
) R8 _/ \; ~0 I& R8 g' {- [% u//
$ m8 E& M' U- G( m$ nextern void ClearRxCmdPt(void)1 n; n5 b5 z" L. r6 h6 W, Z' _
{
' D/ @5 \# M7 M- N7 p    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
6 }" P0 ]+ z7 a* }  V1 g7 b    {
( n* ^! C* O5 O  r              RxCmdPt = 0;/ }1 t7 _; ?- O& q7 K
    }
! `) X. ~+ ~& N/ }! `. [}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-3 09:03 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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