EDA365电子工程师网

标题: c51单片机串口调试多字符发送接收问题 [打印本页]

作者: zcl2012    时间: 2013-7-22 09:43
标题: c51单片机串口调试多字符发送接收问题
#include "REG51.h"   8 l/ a- h  s$ d4 B
#include "intrins.h"
3 A( ^. S/ a' S) A+ H1 \" ]7 m  ^#include <string.h>
: O" z! _7 R+ a0 R#include <stdio.h>
% H9 t. }/ N+ A) U8 h* H- G- Z#include "i2c.c"
7 }# e7 y: d* K#define uchar unsigned char
: X& }. v) K+ I2 O- ?* [uchar  port;* Q, Y: r: K: V( O4 A
uchar  rec_data;5 o2 S; D1 D9 F
uchar  str[6];
2 \3 b, [2 _) c+ Z& q# p1 E0 }uchar  point=0;* c1 z8 {$ {& o
//串口初始化 ; U7 R. c5 V+ }) M3 A6 j$ s$ U& i  ?% M% `
void UART_Initial()        ) i+ ?1 K4 W; l8 [6 @9 E" d6 A" }2 O
{ ; l1 R3 h0 U# ~* d" i1 }" q
    SCON = 0x50; //串口方式1,允许接收
0 x3 M$ f, m- V' M) V) \        TMOD = 0x20; //定时计数器1方式2
0 {! ]; l" V* C2 ]* k        TH1 = 0xFD;        //9600 波特率 FD0 E- q+ E* m/ d/ b0 t
        TL1 = 0xFD;. [& P+ r# z* C' _1 \
        EA=1;      
, S& C" c4 D* n  Z- _; p        ES=1;       9 F" ^( F) m! H/ ?( T* J* n
        TR1 = 1;    0 ?1 r$ h) x3 o
}8 c: z# n8 P* T6 g1 v- g
  Y) l$ i3 n# Z) _
void waitsend()$ W" {+ ]4 b  S, x$ f
{
' x7 j0 g) ]4 z2 K! L9 X    TI = 0;
, c5 q$ P0 X& x) a' \6 M        ES = 0;
$ C7 n; ~1 N& u    while(!TI)3 g! N9 H8 r5 V, ?* F  |* Y6 R
    {
% `' M0 K: [$ {7 _    };
4 ~* s6 Y/ x. ^) i    TI = 0;
4 A/ a0 Z. k% @        ES = 1;+ x$ h2 X8 e2 ~+ B( j' J" g) _: u$ F
}0 ]; Z6 n6 T0 [8 J  k* O3 V. ^
void delay(long i)
, c5 |0 c( D8 A8 ?. I{
, u' E- I' V' i' L3 {" M1 ?    long  j;% ]) i: n  b  ^) W& W: v) H
    for(j=0;j<i;j++)0 f5 m! |. ~7 ?0 s3 h
    {
+ q! J' B- M0 x3 r3 N, b- H9 [        SomeNOP();
* g. E/ G1 T% q' h. q        SomeNOP();
0 A4 c7 ]2 ~/ u' R1 T7 i        }$ y1 k) G! J( P8 B/ ?5 K; P3 c) w
}
  K* h1 Z3 {7 A" l8 f* K" v. h" [
' N' o& c0 u; rvoid delay1ms(long  i)
2 W% ~( P8 I  \+ l/ c+ n* P8 o{
. ?  U" G, J5 M! v0 S( f    long  j;0 E: a: e( M2 [7 X9 q5 O
    for(j=0;j<i;j++)
4 r+ q+ ~4 c) X* h( W3 P  c" A& l    {
" w8 t) F6 y5 D9 A  C8 k            delay(70);9 U  `4 M: ~7 \$ Q9 ]  a6 C
        }# t, V' R; s7 T* C4 k3 [
}4 g4 }% d. g6 Z
void COM_REC(void) interrupt 4
. S2 o' B. v7 ^$ W) W3 o* H9 B- r" b{
9 u. t  T1 F8 ?! C- s; f     
/ h: d( }- B9 z8 k2 ?0 P    if(RI)( L  {$ b( f  }5 C+ K( C
    {    //清除串行接受标志位; L4 {! s1 q' w: ^
        RI = 0;! \$ D+ J/ \, D5 a
        rec_data = SBUF;  //从串口缓冲区取得数据
2 A1 |/ F6 }$ ?+ ^4 e; U7 a' y        if(point<=5)
: L5 C: ~& J' e- Q) G        str[point++] = rec_data;
+ h, w  t. [9 p2 t5 T/ I. d; Y
+ k/ z6 m! x" S0 {    }
! F8 E& o2 ^' ]* X8 P7 P' K0 k7 B) y/ Q$ |9 H! F8 E6 ^2 [
    if(TI)+ q$ e! L* M# _5 ]* O
    {
2 j5 r6 R% M; m        TI=0;
1 ~. Y* K; {- `$ r% C" x7 L- ?( H2 V    }9 E8 W/ A. \- I- V9 r6 g0 G
}
$ S4 i, K; O' l6 `8 Q4 \/ \void COM_SEND(void)1 d. h1 G( r6 H
{# Q! O* c1 B" G9 W- i
for(point=0;point<=5,TI=1;point++)             //连续发送数据
" `5 D/ H; w% L0 P# L$ l# G                                      
4 o& R7 F3 w& d2 U1 m# e0 x   {
2 J: A: p1 |) f( c' c   SBUF=str[point]; //把缓存区的数据都发送到串口' l3 Q) R: f2 o2 F0 J
   TI=0;+ Q: T, K4 b% B4 h
   delay1ms(2);
8 _/ Z2 ~4 Z) b. j5 o5 w/ t   }
# F5 s' j0 v6 ^: ^4 d   SBUF=Read_OneByte(str[3],str[5],str[2]);& T- ~5 J8 c) ~5 ~% f) k" L
   delay1ms(2);
( M7 _+ M/ [3 K}0 b, D# b( o( T# d8 c- g
2 Y, f' y# P+ _& C7 i

7 t1 C: @0 Z: u) q/ d7 ^# r0 E( ivoid main()
) q  x7 V- N/ t9 I* _" g# Q{
3 d* f, N/ ^( @/ V) V    while(1)! @5 b" }2 D  X. M8 W) k
        {* p+ a5 _" O' z$ J% A  W; `
        UART_Initial();, x- F  q! W( o4 {( [1 R
                delay1ms(4);
" B  B& \& F1 y, W5 e                COM_SEND();
9 \* o) T) _1 Z                //point=0;
3 c. c& |2 m8 X2 L5 }$ D                }$ D: ?- O, {( f; A$ U
}
( u* j6 m7 ?5 h) ~
6 J* H. N% [9 \ 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊
作者: 幸福万岁    时间: 2013-7-22 15:45
你可以先试试看  那个串口板是不是好的 : V7 {& ^% p; W6 \* W& H+ a
外围供电 把RXD TXD短一下
作者: zcl2012    时间: 2013-7-23 08:48
幸福万岁 发表于 2013-7-22 15:45   Y$ i9 ~! I+ Q' ?) {
你可以先试试看  那个串口板是不是好的 5 [, X# \# m5 A$ e3 H  ^* w  @
外围供电 把RXD TXD短一下
! h; J; Z! h5 O0 b2 O" i
板子没问题
作者: 天才小痴    时间: 2013-11-15 01:46
#include "Include.h"
: j* U. ~3 h# v6 G, \4 ?) o8 b: N: @
* C6 T8 g0 s, \# M! G( Y0 m0 Munsigned char xdata uart_rx_buf[128];& t1 q) S3 Z5 h" I3 G+ ?' u
unsigned char xdata uart_tx_buf[128];
2 X2 K# Z' ]8 P0 v. Ovolatile UART_T xdata uart;
* u% M& O0 o2 k5 x) v% gunsigned char xdata uartGetBuf[8];
3 ?, z9 n/ a3 b4 ]/ B5 h7 lunsigned char RxCmdPt,RxCmdTimeOut;
# r! {+ u) S% u" [$ N. ~$ h* N5 ^2 B6 D7 d' i
static void Serial0(void)interrupt 4 using 1
+ o/ _9 [( k2 F  P" i3 o  K{
# X& G4 e1 |7 {; p) [    unsigned char temp,head;- b/ p* m% V" T6 L! N0 Q7 L
) _/ _9 a  n) g8 t$ U* F
    if(_testbit_(RI))
+ ?, a; j# q$ x6 ]2 P) ~    {7 u+ `& c7 M$ K9 q. C, F
        temp = SBUF;
9 r3 q" T& x/ f        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
1 {, Y! r6 ?9 f3 q        if(head != uart.rx.tail): e+ n7 T7 v4 u  g- s; Q: E
        {' T- u/ |' [! N3 o) M+ `% [
            uart_rx_buf[uart.rx.head] = temp;
. X& N" i: H# h6 Y% `2 m            uart.rx.head = head;
; P5 I; _6 u& C9 e" \! r        }else
: x& i8 a, d0 c3 G) E        {" b3 q( G9 C7 ^  C. E  N( q
            uart.rx.error = 1;
3 K+ c5 \' w/ s& f+ p        }
- s# V8 Z' D5 G" O    }
0 [4 r( ?3 D) ~; U    if(_testbit_(TI))
/ E6 Q! k. l2 ^  N    {
3 a4 H6 w, e7 Y* X8 L* S# G- d* `" u$ h        if(uart.tx.head == uart.tx.tail)% F9 \( b$ g+ p5 @( a3 H! K
        {
/ l" O  b9 S: Z; O2 E3 m/ H            uart.tx.busy = 0;8 @) o# ]+ h$ X9 J
        }else
! b& @5 J5 w9 [# R7 {! p2 F        {3 W, k( S6 }8 {! ^( P
            SBUF = uart_tx_buf[uart.tx.tail];9 J4 J5 J9 J+ h, R
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
3 j* Z( C/ v: k        }
2 {" C8 M# J9 f- k$ W/ [: n/ }4 ~    }6 F- S9 _6 M3 c+ c" d* W3 d
}
. d, j0 J' j" p" G- R9 w) t1 Y( y//函数  串口中断初始化
$ h3 x) {  c2 y  A8 K6 Z, q: b- Pextern void UartInit(void)
  W* Y* x) a' ~) t5 Y  H, \3 w{
5 q  y4 P- c# b; K+ r0 \+ O    RCAP2L = -(XTAL/32/BaudRate_9600);
% Z: Y) D! |7 m8 U+ D    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;$ U, S/ P4 ]: d# L6 n; J8 y
4 f* }8 K9 h1 P; H
    T2CON = 0x34;) k# [6 p2 O3 t, m4 B& l+ A, M3 T
    SCON  = 0x50;; p; m' k/ g1 d4 ~. h( l- P

& ?5 d2 u8 N$ `7 Y2 P0 b. w    IP |= 0x10;     //serial 0 high priority2 H9 m1 f  i$ u2 ?, @
    IE |= 0x10;     //enable serial 0
+ H5 s+ t1 e" V! _! e+ ]7 [  z5 ~3 v3 ^- W$ {' o  `. O% D
    memset(&uart,0,sizeof(uart));, }0 A5 h& b7 P1 h  E
}
3 I5 l; D6 Q* l) c1 C/ D// put char
, }# k. R' A& f) z1 I, m9 Jextern char Putchar(uchar c)
! R$ v$ ~6 y* h2 x3 Z! m{! k  S0 U( |3 x7 @7 {; ^" W
    unsigned char head;
6 c! W6 U. H! a; K2 O* b4 @& c5 i1 H; E0 h" y5 q6 S4 |- I' Q
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
* |$ M; h! C) x: ?! e    uart_tx_buf[uart.tx.head] = c;2 v! @+ [: v# L% s$ k
    uart.tx.head = head;
1 D- z( H7 ^8 Y) _
6 u) o6 Z# \4 {% P3 H" y    if(uart.tx.busy != 0x5a)
' r6 d# ^7 ]" F( X5 N    {4 X, R$ H. W! U0 J4 c; r( U2 D
        uart.tx.busy = 0x5a;
2 f0 I. J/ B, b' Z7 B  T+ R0 V6 `8 @        TI = 1;
4 q" S/ f1 A' `0 e; |3 j$ f" i    }9 k/ i. Y& K  F" G
    return c;
7 k  r: h! D- i3 }}$ i) z8 F8 ?. G8 j% H7 O0 i9 D) J
//函数 判断串口是否有数据传进来, ?% \2 g  I, W. G" V8 x* e
//     如果有,进行接收数据. c+ w' w" r5 l; I4 }, n$ I5 g
extern uchar GetRxBufSize(void)
1 W& O& L  s2 v2 ]. c{
8 a) _1 ?0 f% |) y. q. i* j# f0 g    unsigned char head;
+ s, l: E3 y$ A4 V) n1 d3 C9 T4 \" }1 [* U! j( @% S
    head = uart.rx.head;" K- v* R9 W; D9 k1 j' U9 P9 F& q
    if(head < uart.rx.tail)
/ [, G1 R  O0 B1 P    {
+ \9 b# c* d+ B9 B$ r4 u7 @* \' X) @7 G        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));! |7 {3 V5 U( Y
    }else
& i8 Z7 p' K4 N1 k. P4 V, _    {" @" t; g. K' Y$ g
        return (head - uart.rx.tail);
/ m9 d$ A3 @& `" p5 s' L; ~    }0 {3 r9 \  w* E* }8 U( D
}
' T8 @) p8 L) n% c! D//函数 从串口缓冲区取数据,只取前8个字节的数据
! N; \, r" ]+ E( h1 q: Istatic void EnterRxCmdModeByPc(unsigned char c)5 p& R9 B$ m. W) m" Q
{
: }" t0 i' o+ y( |    if(RxCmdPt < 8)
. L) v8 m3 ]% T6 [% f; k( O1 o. c    {
9 T" }! C9 I" I. T! k        RxCmdTimeOut = 10;
3 e# M1 K" d: n1 f* p  s        uartGetBuf[RxCmdPt] = c;
2 B' a: W& y+ [3 K' V' }# \/ ]        if(memcmp(uartGetBuf,Updat,3)==0)
$ U; P9 u+ H- \& B" W' C        {
3 m6 n8 O, M5 A* N4 p            EnterIspMode();0 S/ m4 O* N5 f3 C" Z5 L0 i
        }! ^" W$ Z" x: z3 C
        RxCmdPt ++;
3 `( N9 K" D9 S    }
" M, n' B4 Y" m! J}# w4 s; ?6 R0 x* {4 y% q
//函数 取缓冲区中的数据
- R5 m2 k8 w2 e2 M; ~& B//返回
: R2 O  S& [. m0 T9 V/ S0 N( M7 {+ _extern uchar Getchar(void)
( w# c$ Q; q5 A" f& @5 V{% e& w; Q. p  @! P
    unsigned char c;9 j: c: U, J) I8 N4 n

7 r- p# V% C, F+ @0 f, F8 ?( b    c = uart_rx_buf[uart.rx.tail];( s; K4 }7 }" E  }3 m& r8 I
    EnterRxCmdModeByPc(c);8 C$ C  F, N  {6 ?# R' A* ^4 w( ]
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
" ]' u3 L5 S, v8 I4 g* }9 o$ @    uart.rx.timeout = 100;
  B" c) q) S! X4 `0 ]+ L) H, O    return c;
, G* A5 _' t. W2 n* J& l}
. R' Z; z& x% P/ ~1 b//
4 i  |3 E) R0 P  i$ G9 Pextern void UartTimer(void)using 1* d" H" P7 H) }1 V* t
{
- T/ H3 _' r/ [: d1 r    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))/ T5 B6 F7 Z4 v
    {
6 B+ a- J1 C; `5 [2 Q              uart.rx.error = 1;
. {0 b+ l* q# M: Y6 t    }8 {) \, D' u' d! u
}
, f4 A  g* a' ~0 ~9 g//
( b' M7 A$ {+ f: G' ~+ \! lextern void ClearRxCmdPt(void)2 i4 T8 c5 C3 e( W) Z3 [8 h
{8 S' D1 Y' f# I6 _5 u. E6 @
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0)); w: o3 {1 l* d; q
    {
8 J0 y+ A& [$ V" ~1 U8 t' `              RxCmdPt = 0;  b9 B- `8 M8 E9 Q9 p# j8 g" W% |" h  X
    }" g, |3 O$ [" M1 _2 C6 f
}




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