EDA365电子工程师网

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

作者: zcl2012    时间: 2013-7-22 09:43
标题: c51单片机串口调试多字符发送接收问题
#include "REG51.h"   0 J; [# J" n0 H! D! l
#include "intrins.h"
$ [/ [. E7 y$ `; s& J#include <string.h>
! j7 @3 v" D* w: Q5 G$ T#include <stdio.h>9 X$ s! k% j, T2 c
#include "i2c.c"
. e, o9 O5 k, r1 e5 Y#define uchar unsigned char
3 {& K1 A5 A& i/ F2 S" |1 z& Luchar  port;$ Y' ?! x1 |, ?. z4 O
uchar  rec_data;0 h+ k5 i2 f- J
uchar  str[6];
. l9 f6 K" ]+ \# k3 b: {' wuchar  point=0;% S" }) d8 I) s3 b* P7 G5 M& o
//串口初始化 . f3 H4 f5 U* \7 U
void UART_Initial()        2 R- q8 q2 \2 T" g
{
& K1 f: O* u  f2 l    SCON = 0x50; //串口方式1,允许接收
& V! M8 ~( U0 G" O6 Q$ p. H: ~$ F        TMOD = 0x20; //定时计数器1方式2( v) V! y; f  \
        TH1 = 0xFD;        //9600 波特率 FD
& G- h4 U6 P! b6 D/ J        TL1 = 0xFD;
4 z4 H" Q& m, v  t& \7 R, _        EA=1;       , a, o8 q; J' B1 P9 }2 {7 O# {
        ES=1;       ( H" D  J% T0 ^- c
        TR1 = 1;    - m* Z& V* M( ?  d, X1 b. P% N9 A
}3 H* o, _1 S5 T* B! L% L$ P
: P! B8 ]/ x; T# I  J& N, z: @
void waitsend()
1 z" S' b' X; n7 |# z1 l( {{
1 V8 u8 P3 C: u, @) M: J    TI = 0;
2 K8 Q; K3 w9 I$ I- z8 q5 Y5 z& W4 T        ES = 0;
; [. K8 H4 M& V0 u' Q: t& C    while(!TI)
. s: p( f3 E/ \7 r: b9 G! `    {, p/ ?+ n& e1 Q5 A
    };
. R8 Z& [% ]7 Q) p+ e    TI = 0;" N6 A/ ]: m+ Q- C# F0 Q( e, t! c
        ES = 1;
$ }6 o2 H: \: L% b# U}
' W( _' e$ z, x; Gvoid delay(long i)+ B: ~. g7 W! z7 L8 |& O/ p, i
{
- r2 k2 Q" s3 `6 r; B    long  j;2 ~4 I) C4 E7 W  x6 O  {
    for(j=0;j<i;j++)% v! g+ J. J3 l  p
    {4 S! k8 A% O, Z% E
        SomeNOP();
, c# E$ \+ I9 }8 k, i2 W$ [/ b        SomeNOP();# ~4 D, \' c* J/ d: a
        }
8 c" S, b& [. {. ]+ \; I}4 a+ P0 f* d  D) V. x, e  a

" C& ~2 X) Q9 i' q' |void delay1ms(long  i)5 J( O$ B6 M/ |
{
* S- \6 z- Q, F$ T( X    long  j;
3 s3 `  H0 W/ X5 i    for(j=0;j<i;j++); R$ C5 `+ O* @6 j
    {
1 q! ?, _+ }3 V1 |, K0 C            delay(70);# [' N  h4 q# j7 n' @
        }
: x8 \7 J$ Y+ j9 B. x9 d- F2 \$ G}) w9 i! a& a& k& N
void COM_REC(void) interrupt 4 5 H$ q! l) Y- }
{
# X6 J% M. l* h# r% w1 q     
" q/ s9 f$ Y" ]0 u+ H" U    if(RI)  O. `5 g* T' @& Z; u* I3 C
    {    //清除串行接受标志位
) J) S: X7 T; R, n7 \7 d/ d; R        RI = 0;
+ B7 y- f6 I+ A" ]% {! S: O4 L6 ]        rec_data = SBUF;  //从串口缓冲区取得数据
; B! U1 n3 H5 }4 j$ z7 k        if(point<=5)! T! ^, b+ }- `% R8 M
        str[point++] = rec_data;
% E/ \& P9 O5 z# X2 U% e8 Y
4 F9 I2 z# T: S1 ~7 |, L    }
( ~4 h1 n* }+ J# L/ N- t- x$ S+ o
    if(TI)
# d8 p, ^5 H7 E5 ?1 B3 B    { 7 d" U+ g8 z% r% X
        TI=0;
" p' d. N# G, ]7 Z: S" g    }
0 {0 d& U, n/ I( x6 Y% t" U}
- f: b, j1 e1 Y" n4 dvoid COM_SEND(void)7 G1 w! B9 N) c+ s& A! ?8 _6 d4 i
{: _8 u! M+ T. @
for(point=0;point<=5,TI=1;point++)             //连续发送数据- W( q/ j: B' S1 C6 X& y4 c6 z' f
                                      
# h9 ]( Y5 ~* e  _# T   {
: |/ F  f# ^/ `! E6 {. ?# R2 k   SBUF=str[point]; //把缓存区的数据都发送到串口
& D( k7 a5 \$ @. P   TI=0;/ l/ s8 R. q7 c; W4 X
   delay1ms(2);" [+ [4 C  {6 P% `- U% Y
   }
0 E4 W% M! j) d# F1 ^   SBUF=Read_OneByte(str[3],str[5],str[2]);
" L! e; R" {0 r4 f: f; [( r- k   delay1ms(2);
* k$ S+ Y$ M; j2 ?/ l6 \% \3 M% g}
5 a/ Y! x- O$ e% R* l
5 m0 f- T9 u0 v/ B& n$ Y5 L/ p+ U. N
void main()4 B- W, E1 q# [% L
{
: m! ]+ A  V1 w( ]+ |    while(1)
; m$ P1 N# x1 K+ U        {  O; G- V9 @% M
        UART_Initial();
/ V! |0 f# V5 A" t                delay1ms(4);4 Y! D8 W$ k9 ^" N) G3 r
                COM_SEND();
! ^0 r0 u3 @5 P. L# h3 Y/ N                //point=0;
, c" e9 ~1 j1 F" }, M6 V                }8 S$ }7 P# K, z1 j& D# c- Q! R
}
9 Y, `1 K, R& G- l
& E- ]3 y, T0 U 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊
作者: 幸福万岁    时间: 2013-7-22 15:45
你可以先试试看  那个串口板是不是好的 + ]2 g4 c3 Q7 b8 L7 G7 G
外围供电 把RXD TXD短一下
作者: zcl2012    时间: 2013-7-23 08:48
幸福万岁 发表于 2013-7-22 15:45 5 j4 B. v, q0 `& I
你可以先试试看  那个串口板是不是好的 + n0 P% G& G1 G' H$ h" l
外围供电 把RXD TXD短一下
8 x; t  d* q' m; ^. [% a
板子没问题
作者: 天才小痴    时间: 2013-11-15 01:46
#include "Include.h"& j' j: p; A; P% _  r

/ i5 U" P8 k: R' b7 X& [, `' Iunsigned char xdata uart_rx_buf[128];" O+ t1 \- M* h3 P1 l1 }
unsigned char xdata uart_tx_buf[128];
% h, ?, {7 s/ bvolatile UART_T xdata uart;
6 P7 V0 o5 w) F1 wunsigned char xdata uartGetBuf[8];
9 }9 _3 R+ U: f& ~unsigned char RxCmdPt,RxCmdTimeOut;
; g6 E- I5 R( M: W! f) R4 u; X3 X% t# C& y3 a
static void Serial0(void)interrupt 4 using 1; {/ z( v+ z- o2 R
{
9 U2 Y" o! a4 }5 w) P! g    unsigned char temp,head;, w4 \( Q" r; Y! w) x) q0 E( O

. R! h7 S; d' n; n$ @+ J, m& i    if(_testbit_(RI))5 K/ t* N( F. U0 a8 s
    {
/ t' z6 p( V9 }0 T; s        temp = SBUF;
# s0 M+ W1 q1 V! n' j( C1 |        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
% `* `0 x# v4 B% J6 \) a( A        if(head != uart.rx.tail)
. X  j$ M# `# G* w* w        {
3 o! Z& y- O$ p5 a            uart_rx_buf[uart.rx.head] = temp;3 G4 S3 J$ Y8 W% Z$ G
            uart.rx.head = head;* F; V5 V+ {( t
        }else
0 V0 b+ O4 |3 @" f' _  P  g& A        {
" G/ R. l' k6 B            uart.rx.error = 1;. g/ K* Z  N1 \2 ~# @, w' T' i1 T7 f
        }. d, M9 R: B% Y
    }
# q, m* z: ]7 J$ R; ^3 [! P! M    if(_testbit_(TI))
0 G( t/ h9 b2 l) z/ b" r    {
9 Q8 B: X5 \% O* Q0 Q        if(uart.tx.head == uart.tx.tail)5 N5 ^- ~7 f# k, @) \
        {
' _0 G+ r8 }  ?+ ]% v            uart.tx.busy = 0;4 d: z8 _+ F0 l: J7 }2 w+ k, L
        }else$ ~( Q/ @3 D7 s8 D0 D
        {: ^6 Q6 O) J, x- j$ l: j- Q
            SBUF = uart_tx_buf[uart.tx.tail];
# `9 }! m4 |; i* X) J9 r% k; a            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));2 R0 a- R" O. E; {9 f
        }
  y) w6 G$ @: F9 Q) H    }  m5 k! h: G& G" \. f
}
4 ^  M& W2 _# f. v//函数  串口中断初始化
) p+ G/ U$ L; E; M) `! d/ cextern void UartInit(void)
  Z+ ]9 {/ p  q1 ]{
+ s7 @# Y4 y0 X5 t  n    RCAP2L = -(XTAL/32/BaudRate_9600);
9 g# t; n' x: C6 @7 e2 k    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;. v( t/ ?) N/ N. U1 f8 T

. N/ x4 W. ]- x    T2CON = 0x34;6 O0 Z5 ?, i! N1 {* O
    SCON  = 0x50;
6 a. v7 E8 O4 `( V3 ^4 ~
+ n) ~' C2 w6 ?  [; O5 ~    IP |= 0x10;     //serial 0 high priority' s" F7 R- `, H2 |
    IE |= 0x10;     //enable serial 0' [& J5 x6 E% J/ O. w/ n

! N2 j  X. `( m; U9 f* \9 T    memset(&uart,0,sizeof(uart));
% A* H( U$ y. N+ c% ?& n0 e}8 L0 Z7 l% O/ W0 R
// put char
+ t- R2 W6 u$ T/ u# hextern char Putchar(uchar c)
1 k/ o+ C3 O& G4 C{
* {! F& l  A2 u; G    unsigned char head;  ^: A9 s" ~( i
: v# m. l& d- J0 Q5 J$ Z
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
* k- f' D) q6 L2 Z8 U# S( u7 X    uart_tx_buf[uart.tx.head] = c;% b- c' |3 t  x5 W
    uart.tx.head = head;9 Y5 \4 l3 n! A: l6 }
) ^) X9 p( e1 M9 W( ?
    if(uart.tx.busy != 0x5a)3 m8 |* Y/ b" |; E+ n
    {
2 `$ g5 ~1 X/ ]0 `* O+ L        uart.tx.busy = 0x5a;: w2 Q8 J. K2 D7 X2 I
        TI = 1;
, x0 d6 Q8 V9 C' P  }% d1 X    }5 R( w+ @8 M; L6 H6 B( R: r+ P, R
    return c;
4 C4 W4 v4 V1 k& Q* P4 t}
: q1 e) j7 X1 D3 g4 {//函数 判断串口是否有数据传进来/ `( e3 n5 l) k* r" s5 ?! r2 M
//     如果有,进行接收数据
# L; R0 n" V, [( |) q/ M/ aextern uchar GetRxBufSize(void)% d- k" x0 ^8 Q2 T1 J  F+ S
{3 r5 }9 N0 x3 e1 m8 {) R
    unsigned char head;0 S# D1 e- j& Y
7 r# f1 C/ `9 f7 i
    head = uart.rx.head;
! `8 t3 L& |  ~" i    if(head < uart.rx.tail)5 K0 e  o$ r, O
    {- L! n, g( I9 X" C8 O" h5 W
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
" v: D: n" s6 E, Z. F3 K    }else( b- r0 c( x' T7 h* e
    {, `$ Y$ u0 ^3 n0 x$ r
        return (head - uart.rx.tail);
* r$ t6 _: T7 o: {/ ~: M    }
# X4 ^9 X% Z: J. h/ K( O}
5 d  H+ _  w" E3 X6 O9 H* T) _//函数 从串口缓冲区取数据,只取前8个字节的数据4 A% I5 i, F) E) K4 D" }
static void EnterRxCmdModeByPc(unsigned char c)
: Q+ P1 Y6 @* J" T" C+ p1 @{
7 w  ?# W* D$ Y  o    if(RxCmdPt < 8)
' [" k$ U4 z1 u    {# T' a4 m) A. Q* i2 C, ^& D3 Q3 E, _( l
        RxCmdTimeOut = 10;; }- H( c) t) a; F3 J5 k$ x
        uartGetBuf[RxCmdPt] = c;
- A/ l6 W% J. Q9 R0 Y/ E        if(memcmp(uartGetBuf,Updat,3)==0)% q' d; V9 S9 o; x% n
        {
% Z, {! c" n, H; F6 m            EnterIspMode();
; V! W/ u2 ?) w3 ~5 B& }5 n        }
" W4 q+ K2 E& K( E        RxCmdPt ++;
* v* D, g+ u& f% y    }5 Y! X! M9 K2 @/ r
}
! z5 G# ~& }1 A, v1 e9 r//函数 取缓冲区中的数据1 g& P1 w- A, C
//返回1 E6 f  H* w& D% c; ]
extern uchar Getchar(void)& p3 n- o% Z" K; J* L2 E
{
+ Q* M7 E. K4 b5 p* g    unsigned char c;
* O% h8 r+ _; R3 H) L- E, `( Z9 C* v% W0 `; l7 D
    c = uart_rx_buf[uart.rx.tail];
5 u4 _* w1 H1 |5 f9 m. L" }    EnterRxCmdModeByPc(c);& B/ a) M/ |9 M6 _
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
' n9 N/ }/ J8 X5 F# X# ?    uart.rx.timeout = 100;$ K$ g, n  @5 L$ }, v0 }$ s' S
    return c;
8 z, T7 _3 N8 i0 L' o7 a/ V}# v6 @4 K+ M) @! P# G
//) }8 d8 P5 q& ~. `# O' s
extern void UartTimer(void)using 14 o+ c: V3 l8 X
{  v8 k/ L7 I& [2 |- z
    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
! t, D" H/ L: R; T" f    {
, V. z0 [" k, r' \; r              uart.rx.error = 1;
! k8 _! J2 a9 I  I  m8 s    }
! D4 L! y  G! m; M/ ^1 Q8 O+ K6 }}
, h% J9 z* G) o  u//: F3 |3 x6 g6 {, P7 ~
extern void ClearRxCmdPt(void)3 k9 p" b( e7 H. P
{
0 @- k0 \" M, j    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
; `: |( N% b: r: Y    {% o$ C+ K, k( j5 X
              RxCmdPt = 0;
1 y# X9 O: Q$ q2 V) `: u- r' `    }
( P( G' F; O% X}




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