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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "REG51.h"   
! i* \: ?9 J/ }7 A9 Y4 C#include "intrins.h"
3 E& Q$ N7 A) A) S" H0 \# u: j3 |#include <string.h>
$ y" g' ^5 s9 I8 [/ k' [#include <stdio.h>. @. ~& S! c& n1 Q- L1 @4 P
#include "i2c.c"
7 n9 {  j4 f& W0 t* A, _#define uchar unsigned char2 G+ C8 u6 E/ n" r
uchar  port;
$ p, @4 A) Y0 ~7 F8 A7 Nuchar  rec_data;
9 Z: ]. o6 h3 S" \uchar  str[6];  M* x$ T* t/ Z3 p( }* V
uchar  point=0;4 j- g) ~; T6 a& [/ S! i0 d
//串口初始化
% r+ p; F  q% t5 D7 u1 `5 _" w& pvoid UART_Initial()        9 l+ f* R% J2 J
{ % `! E% d! v, k, {* `) d: x
    SCON = 0x50; //串口方式1,允许接收: ?8 A( @" z5 c0 [. ~9 S5 ]$ t
        TMOD = 0x20; //定时计数器1方式2. G+ M) A) K: S: ~  }  {
        TH1 = 0xFD;        //9600 波特率 FD
! f, y% O# [5 y        TL1 = 0xFD;. t2 @6 Y. `1 ^* R# ?
        EA=1;      
7 O* d5 q6 P5 F6 e% W" @        ES=1;      
% j9 _9 W4 x$ u- U4 r# O* A        TR1 = 1;    , [0 y# m  C. C0 [. T5 X+ h" t8 S9 C
}
) @. B5 E# p, H4 ~" X8 L; S+ G& ?
0 P- G! w) K/ \9 t  E( I# P3 C( j1 gvoid waitsend(). L# l/ |2 B6 Y3 w5 G1 a
{
2 ?: f3 l% V& G3 S3 Z  H( d2 s    TI = 0; 0 v/ _; i  H7 ?5 _: K4 v
        ES = 0;
6 b; \, e0 i  f9 }& D    while(!TI)+ m+ @3 c4 L3 Q8 \) b; T
    {) T0 E7 x% g( J! R. d7 f8 x
    };
# T* X, k2 L  C. u/ }    TI = 0;# ?; W- {: K- y9 \, p
        ES = 1;' w2 ]. l6 X* U- u: G& `# }1 Q
}
% p6 t8 b1 v( a% @void delay(long i)
0 z% v8 y: Y; N9 ^2 x{# n2 q3 x! j1 k6 y. W" j. P
    long  j;' q6 S1 Z* e- d5 K0 u# a; k
    for(j=0;j<i;j++)/ J. G* F4 Y& C+ C9 D9 R) |
    {
1 p+ v% I& S2 D5 E5 p        SomeNOP();
" `) h) E1 W8 t+ Q2 k% e2 z/ A' |        SomeNOP();
8 x  J5 g; G9 P& Q: G# t" o) t        }& E! }" @# M1 N; O+ V. y1 R0 X  Y
}
: q9 e1 N& L3 e# x6 |+ M
- V4 Z* F( j' l$ S! wvoid delay1ms(long  i)
2 f' n" E; B/ v' V+ d& v{3 |" h7 I! @4 z3 P
    long  j;6 m* K" R; g% s+ G4 U# S
    for(j=0;j<i;j++)
. K) J( i: [$ F, k3 v0 r    {% k+ v! z1 q) t+ r
            delay(70);- v- j2 o! Z- h
        }
' w* A, q0 l( @$ L8 ^}5 L  J. U& I# E2 c; o. g
void COM_REC(void) interrupt 4
/ \! f. a& @- F" S{/ O) q3 T% V2 P) ~
     
: c6 C' Z1 t& T5 [" r    if(RI)
- M4 u* o! X5 C6 r3 A) s& B& G4 h/ u    {    //清除串行接受标志位5 u0 n7 n0 D7 M* V% m( [- Q
        RI = 0;+ H1 t2 Z. ?  F$ m/ ]
        rec_data = SBUF;  //从串口缓冲区取得数据
* D/ \$ H9 W/ `8 V( t1 X* {        if(point<=5)5 b" W  T2 B8 b
        str[point++] = rec_data;( c; U0 N0 G  M

* E/ k+ @- \) S) c    }
) }0 L$ \# ~, w9 u/ q" A8 M/ R4 S
    if(TI)
) |8 P5 E1 d' M% g8 ~& C1 j    {
( O/ q' o" B8 `* d/ `3 l: o        TI=0;
* z! ]0 l6 t! r8 J5 ~, C  H    }; Y1 V* o9 P7 o4 D9 k6 k0 n
}, m. h& T+ }# s" l
void COM_SEND(void)" X2 K% O4 a. g! j3 J. r" p. `
{# F4 Q  K: ~0 D$ ?) d" J
for(point=0;point<=5,TI=1;point++)             //连续发送数据7 {% z! {- X1 g5 L
                                      
) E6 [( ~+ }# _' \; v   {8 o5 z' F; ?) ?$ y3 N  Y
   SBUF=str[point]; //把缓存区的数据都发送到串口
! B4 D4 Z! b3 e   TI=0;7 o- q2 Z/ G& T. l8 z6 e8 B6 O
   delay1ms(2);# t) g( f7 v0 A0 h- h' I, F
   }
* ^% W# ]- S% J/ s% N   SBUF=Read_OneByte(str[3],str[5],str[2]);
& O5 `: R( z0 u: k! G* @   delay1ms(2);8 O6 W; e! a. O) g/ V! D& n/ Z
}
& f- F! B6 [0 r5 n0 }4 m
/ d) O$ t! v8 `' m1 l2 n. Z7 I. h: i+ q1 r4 j6 H5 f! e7 }
void main()
  x0 B: S, V" o& p! @" y3 @" k{
2 G* u+ X0 P( k+ O. w) q; B* E    while(1); r9 s. E( Q1 e' [7 A& A
        {
* G/ F% k/ E. E! x$ d) C2 {1 F) j        UART_Initial();
/ f7 V; M5 X6 h$ Z9 Q7 R                delay1ms(4);4 L- \5 C* b# @6 W% `
                COM_SEND();, I3 `0 r- z8 n) l1 B
                //point=0;& l) }  O0 X* c; Q
                }% R0 E& {6 e2 `4 u5 ], [
}0 W, f" ]6 _* o* U2 ^8 X

$ O& a7 K9 e: N1 b3 u2 y  j 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊

该用户从未签到

2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的
- E4 Y0 o% P9 E9 k; P& I5 o2 ]外围供电 把RXD TXD短一下

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45
2 p! ^/ J, U* v, ?* {, |你可以先试试看  那个串口板是不是好的
# h0 I5 J# S& N1 u# J4 g9 `, K外围供电 把RXD TXD短一下
" K4 E( y' y" R' ?7 A- J
板子没问题

该用户从未签到

4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h": V5 W' x( S: s3 p
7 o6 Z8 S. d( Q0 N. ?
unsigned char xdata uart_rx_buf[128];
  P5 O: s, o$ x/ uunsigned char xdata uart_tx_buf[128];. n0 L5 Q1 y: A; m) x3 J
volatile UART_T xdata uart;! t6 s" z' G) M& D. k
unsigned char xdata uartGetBuf[8];
- y4 T8 E+ o9 A8 zunsigned char RxCmdPt,RxCmdTimeOut;8 w, E4 \( w; w& R
# c/ m+ B6 P  K
static void Serial0(void)interrupt 4 using 1) O( k& @1 M" f4 u
{' Q8 l: ~* R* P. y6 Q' c, r
    unsigned char temp,head;
- l/ I: [' w* s
6 n, z/ h( H) i3 D& M    if(_testbit_(RI))
' n; h! _9 v  P0 V, p    {& B6 V& T! K9 u% k: q- M8 M6 P0 ]9 B. W% N
        temp = SBUF;" w7 Q' K' Z3 Y7 b9 V2 a) ^. T
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
& y* b) k% A+ i+ g! T        if(head != uart.rx.tail)" j/ C; U- X- G% y' t; K
        {
" C7 e1 C4 S7 X* h            uart_rx_buf[uart.rx.head] = temp;
; A: E, ]! o+ t. P% z2 J            uart.rx.head = head;
3 D; `" d1 B8 A# O- M: l0 |+ y        }else( z* B8 P% H4 R5 @5 _% o% o
        {
0 t( N+ D) M8 K            uart.rx.error = 1;
7 ?, L' H9 T* L/ R  F3 V        }4 ]* m# e  }0 ?- G7 ]2 t5 v
    }
. q; [. @/ e7 S1 l4 B: c    if(_testbit_(TI))
7 w( Z% G" ~+ l) I/ {    {# ~" ~1 k$ g( j  q" c' @1 G
        if(uart.tx.head == uart.tx.tail)
4 v3 ^2 }3 U" e9 [7 ]/ R        {2 j1 U9 p8 Q) U
            uart.tx.busy = 0;2 V" N1 s  b) L& `
        }else; s, o8 d0 Y& ~- ^
        {$ T  w. \% L8 [2 Z' W
            SBUF = uart_tx_buf[uart.tx.tail];
! S- `& H. w9 ~; z/ l7 _# y# c/ c            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));9 u! }: `' m* E$ x; _7 O/ x* y
        }3 h, c2 ]9 J" P6 @: [
    }
. E* Z: A% Z; F}
- n% Z/ W- U2 V9 O& \" r4 E8 B$ k8 n//函数  串口中断初始化
6 p& ]( L$ {; |: X0 Xextern void UartInit(void)2 d& Z/ X6 [7 U* R
{6 ]3 y0 {' T3 p  O
    RCAP2L = -(XTAL/32/BaudRate_9600);' U, w. @. v1 j
    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;* d0 Q0 p" l5 |, \; j# V0 A2 V+ n
" @- k9 L( A, j; z
    T2CON = 0x34;
0 e( g& G% i! L% O6 Y! n    SCON  = 0x50;2 O! e' \/ c" k4 z% g' \& _
. S& y. M4 h: a
    IP |= 0x10;     //serial 0 high priority
  u& ~$ M3 ~, y( C( {( n    IE |= 0x10;     //enable serial 0& M# A/ a3 R7 T
8 E) p+ b! Y; H& v3 I; |4 G
    memset(&uart,0,sizeof(uart));/ E; t! H4 R: O
}/ n+ E8 y/ `- v* g
// put char8 ^0 {1 l, S1 H, U- z1 K
extern char Putchar(uchar c)7 D; W+ d* h6 w% F
{# r6 {3 h. O! G6 |$ S3 E0 K
    unsigned char head;
: I. _) A' R# a- x+ i  `) L/ H) y+ m. _4 D: z
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
2 a( @* C0 d2 P/ D8 l    uart_tx_buf[uart.tx.head] = c;9 ~. Y% U6 k9 X: ?: u% J2 G
    uart.tx.head = head;
! N% s' o+ S, s; a6 l% }6 ?
3 w: O. c- d$ z1 U; p& o) Q0 N& F9 ]    if(uart.tx.busy != 0x5a)
" h5 v' ?: {' G( w. P3 [) M    {# j$ N' [  b; t3 n( |) C
        uart.tx.busy = 0x5a;2 I6 `/ [  P  {  ^3 s5 B1 S5 p
        TI = 1;
4 b7 L, v; Y; K8 ?    }9 l# H! C' h+ ~7 u
    return c;( R& \# W* Q: S5 I( `3 ]
}2 Z" \; z- j: g
//函数 判断串口是否有数据传进来& g8 S% _7 o- G! v1 v# F/ X1 W" r
//     如果有,进行接收数据
, }% }. H- z0 E) k$ P( B% Bextern uchar GetRxBufSize(void)
, e' p, ?- J# v9 c, {{
! M2 x) S' w+ P; U8 u    unsigned char head;
' j2 }8 e  h3 v+ ?0 D0 A$ T7 e. H3 S8 j0 l
    head = uart.rx.head;
8 I$ s& z5 H/ g; o- X    if(head < uart.rx.tail)
+ k4 d; a7 X( ?' Y8 |2 Z5 @    {$ l7 c1 P1 _. @! ]" |
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
9 c# U, W# @9 F( h* }9 L    }else1 |( W& E9 J* x& E
    {
# q  n3 ^1 a0 ?" o        return (head - uart.rx.tail);( [2 T' Y& q( \5 y8 d8 m
    }, N( B! V8 a9 l
}
$ N1 R- u; v: [//函数 从串口缓冲区取数据,只取前8个字节的数据
- {* O7 A$ R" S4 Dstatic void EnterRxCmdModeByPc(unsigned char c)
) E5 m6 k# x8 X) F2 b{( d' v* @1 J) P3 p/ j& T( ]
    if(RxCmdPt < 8)$ [0 f5 C; e2 L0 b; i
    {4 a: d' `( Z& q( u; P% Z
        RxCmdTimeOut = 10;, ~2 ]0 q6 ]( ~; M  W1 L4 Z2 Y* n3 c
        uartGetBuf[RxCmdPt] = c;
7 F7 M! d# X/ a        if(memcmp(uartGetBuf,Updat,3)==0)! x4 G) M' ^6 E% ?/ w" j
        {
, o2 n! \+ \% u, o            EnterIspMode();
8 J0 z9 a# B5 N5 ]* S2 Y9 B        }% S( D6 j; S# s) ?0 y3 ~$ w6 d
        RxCmdPt ++;6 c2 F  T9 W6 C# T! B
    }. Z* P) _- [- z+ a# X  h4 i
}
  A# @1 [; k& h7 ^! I- A//函数 取缓冲区中的数据
1 {: O9 q. v! O& S//返回
3 P9 p8 [" v2 }. R' ~, K8 Bextern uchar Getchar(void)- h: d3 h( A% n. \/ n
{7 L4 Z/ U& K. Q
    unsigned char c;
; V) }( g2 c1 J% H1 r% R1 x+ l- R% l7 T0 J& N
    c = uart_rx_buf[uart.rx.tail];1 Z2 O- y& O. v' b( Z2 W& j, `. ^
    EnterRxCmdModeByPc(c);$ O7 g0 T+ O3 e- a1 C* g$ S; ]. x
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
! F; |" P1 J3 R    uart.rx.timeout = 100;
7 ?) V6 r( w" i6 |7 @. c    return c;
- p' N1 E4 j3 q$ g}3 S. m, ^6 ^, Y4 r
//
5 Z9 }# M& Q2 r% T7 o( y+ Jextern void UartTimer(void)using 1: e$ |: B2 D, h+ T& j, ?
{0 M3 N8 \$ t( w: F
    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
* Q, c3 E' a4 ^    {
0 `1 e/ ^' s( W' _8 ^              uart.rx.error = 1;0 ~1 s' I5 L( C
    }- k9 @4 }/ E) Q
}
% `6 U3 O- u* v+ |7 ?# C//
2 F- a* C1 Y' ], i8 ]) Xextern void ClearRxCmdPt(void)
: T& e5 b( d+ H0 b3 d7 C{
3 V$ c" a: e2 u6 d    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
6 H" T$ d) e2 L3 I    {
: X/ q0 c2 I2 A7 ]$ j( F9 x4 C! @              RxCmdPt = 0;
2 \9 T, G& e" D    }/ M8 v$ M& a: r" d1 d$ G
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-20 14:07 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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