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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "REG51.h"   6 }' D5 [- f: l7 E1 w# k
#include "intrins.h"* d* e5 s' @- r( r
#include <string.h>
' [3 {# U; \. I# B; T( W#include <stdio.h>! }! [9 y. H# Y4 B: A
#include "i2c.c"
& F! f! ?) u  Z. ^* ?! \#define uchar unsigned char" t; A, p* w6 ]/ F& z3 z+ u+ Q
uchar  port;
7 }" f/ C; R8 s) O/ juchar  rec_data;
; \+ p& i! ^9 Q" C, P' I* luchar  str[6];& C5 g! v7 y( |' d
uchar  point=0;
7 p4 [0 ~& K( V& Z7 y& C//串口初始化
7 S# m+ y( J- h. t# }3 i% Kvoid UART_Initial()       
/ A; _& [& v9 p4 l9 K5 {{ 6 k8 c+ L, X* w% C
    SCON = 0x50; //串口方式1,允许接收; b8 L4 A. r- v3 J( }) J
        TMOD = 0x20; //定时计数器1方式2
! E9 ]4 J/ a- J; }9 E        TH1 = 0xFD;        //9600 波特率 FD6 _% |; R; V$ x6 t& ]$ Z' Y1 `3 T
        TL1 = 0xFD;8 w5 @8 N8 z4 l. V, S
        EA=1;      
7 O. K% K4 Q. Z: J' m) E* V4 k        ES=1;      
! ~) H' T9 F  r# r) {0 J. q        TR1 = 1;   
, N$ G4 @1 t0 O( g! L}
6 q) }2 E( F/ G4 p1 q: W
3 v( c4 P& K3 t* e& ivoid waitsend()) a9 i* \' ]  z2 A
{
% s4 z& G: ?: \, L6 D& @; U) K    TI = 0;
/ ?) @0 {2 O* ]+ f# {* v+ b& i        ES = 0;
  i& S. v, p. Z. Q, A    while(!TI)
# c. {7 X* r7 M1 m- z# O    {/ [/ c6 R4 P2 g- e
    };; p" Z+ I9 K) D# Y1 I$ l
    TI = 0;
2 ]$ _5 E+ m: L/ v/ S% w5 V8 G        ES = 1;
$ h9 V! ^/ Y4 u: I) N$ V4 [}
0 x* @  \6 G9 @; R1 N, o. rvoid delay(long i)& B7 d& J* }) G1 l4 u1 p9 g0 u- l$ P
{2 h5 R5 z+ J6 R; V1 }  ?
    long  j;5 t/ m  D" U2 K
    for(j=0;j<i;j++)* ?4 b  E6 e! n! k8 ?
    {0 s3 c- F, l6 v5 g, ~9 p7 \( e. B
        SomeNOP();( K7 U. p1 @& R! k" f- i
        SomeNOP();- q7 @! [! Y# t2 X
        }7 e! x" K0 e5 R$ z
}. @  i9 H% b+ o7 {2 v8 F9 x0 V- z
  m! v: F) B, a0 _( ~* J- Y$ i
void delay1ms(long  i)) p# u" H$ s4 l# i7 b
{. y# U6 F( C# `8 u: U9 R
    long  j;$ c$ j5 X. u. b+ U3 k1 a# q
    for(j=0;j<i;j++)
, ~0 ^% c6 ?5 A+ I# @$ o# Z( p1 ]    {
- B8 u% r8 Y# T. Y% S5 w+ v0 D            delay(70);0 d; P) f( a, a8 G' s1 I4 w- p
        }) @; G: u( L6 t
}3 ]& Y/ j6 |0 d& B, }
void COM_REC(void) interrupt 4
1 q: V# f* ]1 `; f# }! G{* ]1 T* \& s; L/ ~
     
6 g( W+ D/ T+ A$ Q9 m2 V    if(RI)1 j9 P/ a. I! ?0 |
    {    //清除串行接受标志位8 @& _) R3 T: `) F4 g6 o
        RI = 0;
# y0 [2 |1 w9 P4 Z: H. N        rec_data = SBUF;  //从串口缓冲区取得数据  ^, e2 m7 y! R
        if(point<=5)
: w8 ^0 C8 X" y/ `. G, W- o9 g        str[point++] = rec_data;
; K6 h/ Y8 D3 g* r) m' Q& k  u/ J, _' Z2 Y! T: l3 S
    }9 E: k- f" a2 y4 v8 ~

2 ^  |. _7 L6 e: X5 D0 R) ?    if(TI)# g) e+ L( o! B) C* k
    {
# }& C) Q! @1 |  {        TI=0;
* ?+ v1 `! A8 q: E( K4 j    }
/ B% b9 t  W  ^( J$ A8 {}" f9 H/ ~2 V9 P
void COM_SEND(void)& _+ l1 I( a- S& ]8 E3 Q5 ^- g
{
! y2 F1 G  Z+ h0 x5 }" Y; o8 s5 Qfor(point=0;point<=5,TI=1;point++)             //连续发送数据
' z% p- Z" k% [8 M3 u                                      
2 {4 ^9 U: ?& }% `2 @2 B9 C, B& c9 p   {
% C/ w  B2 k( b1 h# u. ?4 o   SBUF=str[point]; //把缓存区的数据都发送到串口
9 {0 ~+ a3 e8 e  \* o3 o' I   TI=0;3 @7 N  O5 {5 N% X( |
   delay1ms(2);5 A& d2 d1 v+ s" K
   }
, ]8 x: i3 \" t) T$ D( |   SBUF=Read_OneByte(str[3],str[5],str[2]);* H# Z; X, ^7 C$ }
   delay1ms(2);
0 U& }" K7 E( P9 W9 _; I}
6 l) ?! W7 |3 ~, H
3 p) K: o. r  e" l3 A' p
! E4 c3 Z0 [$ X6 qvoid main()
9 n( m  p# ~+ d' A' {3 H{& r& n4 L8 ?' M( _- U& C
    while(1)
# w; a  P: ]5 `4 F+ `1 Q+ J3 D        {; i* X/ \) G. L/ a6 \
        UART_Initial();, H" E# C6 K7 T5 P5 D6 {# p# ?
                delay1ms(4);
" d9 D. J* @" W! o5 d                COM_SEND();
) o4 ?) ]. G9 N. Z. y* g6 H# D                //point=0;) n! M( B/ u# ?! i$ W5 C
                }
5 e; `' y" J* p( Q, L}
( j% k8 D' t; ?' e$ i7 ]& K& ?2 G7 \' I) G: i) i- ^& l/ L3 c* |: L
这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊

该用户从未签到

2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的
+ V; P, r) e9 @" j9 N+ i# L外围供电 把RXD TXD短一下

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45
* p- x% ~7 Y; q* b! A/ }你可以先试试看  那个串口板是不是好的
5 O4 b+ k# W9 j2 p- R% [5 W; h外围供电 把RXD TXD短一下
- S- E) Z; J$ R
板子没问题

该用户从未签到

4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"
, g7 L6 f* \& C: \6 f* r( r! @2 b& ?  n4 @' a& A
unsigned char xdata uart_rx_buf[128];
9 L+ p7 A, _# w; ~unsigned char xdata uart_tx_buf[128];. c* T( c- Z  a) `; F- R
volatile UART_T xdata uart;" u) g, n% S1 A4 ~7 q3 D) z' r
unsigned char xdata uartGetBuf[8];6 V# S; P1 x* i
unsigned char RxCmdPt,RxCmdTimeOut;
3 \8 n, W/ O9 G4 l. ^$ I: Y1 F- o( p5 l& Y2 Z3 E
static void Serial0(void)interrupt 4 using 1
* w( L8 z5 r3 ^8 O/ y" K{3 Y8 |% l) W5 r
    unsigned char temp,head;" v5 T; D" c) p0 }, n7 k. M
" j% e7 w8 y9 ]% w6 U3 k
    if(_testbit_(RI)), y2 ?" I6 D; b% D4 ~2 x+ @8 H
    {
! p  a) H) U# o3 v& m0 V* {- {        temp = SBUF;2 _' V/ @% q. K1 N% W5 e
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));( ?* N5 h" D$ ~% ?: T: a
        if(head != uart.rx.tail)
- d3 J1 X/ o5 }1 [        {
, E1 s' g: m& Q6 g            uart_rx_buf[uart.rx.head] = temp;! K% @- n/ ?# q3 n
            uart.rx.head = head;
6 A- N, e- a4 x        }else
+ U( T/ k2 n7 l8 a        {: C9 g/ S% b: O0 R  ~& J1 \
            uart.rx.error = 1;, p+ f- j. b  y" n4 H
        }) b4 P8 h2 c# _  S. X- u3 ~- O' |
    }
* C  f! p/ Y* T- l4 J    if(_testbit_(TI))
( K( T3 w0 S. @# Z- f6 f  u3 o    {- J( z) J* M2 c& T0 G6 ?. l
        if(uart.tx.head == uart.tx.tail)' j" l% o+ A2 X9 x( c7 V9 I
        {
0 l4 P, `% b2 F3 a            uart.tx.busy = 0;+ k+ G0 z1 e& j6 Z+ T/ h
        }else
& B% j4 r9 ^! w1 p        {
. }* p8 j" r/ G- F# z2 u            SBUF = uart_tx_buf[uart.tx.tail];* w+ I0 M( }' w' _4 `* ^( B
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));* e0 X# `6 F3 J5 F/ f  W' ~
        }* F3 |" B8 }! W: e; w
    }
8 ?0 l5 Y0 [" i  i- {! G0 V+ l: F}' m5 @9 e' @9 J
//函数  串口中断初始化
6 U9 @  {; l. Z  zextern void UartInit(void)2 l* W! d3 [& d7 [: I
{0 S; a  Z% g3 z) x6 t9 O5 Y
    RCAP2L = -(XTAL/32/BaudRate_9600);
: X' C3 Q& [( j7 K: x    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;& u! d& Y) Y5 d. _- a2 t

5 i, E7 l% ]' f$ e6 s    T2CON = 0x34;# J4 R5 U" R- B, Q) u% v6 _
    SCON  = 0x50;
9 |: T. ]/ Q5 J" \  t, M& ~9 _4 e/ _" k( }5 ^  x# J3 M
    IP |= 0x10;     //serial 0 high priority
. V) u, S3 M) U7 ^7 c' X- \+ e+ p: ]    IE |= 0x10;     //enable serial 0
/ W; t6 m. V8 d/ Z. ?% t8 K$ o# U( D" X3 r: o
    memset(&uart,0,sizeof(uart));
/ D! @( Z, O. ~8 U}
, i5 f9 v1 N9 `6 R2 y1 f// put char3 r6 T4 C' T6 V: s7 ^- X
extern char Putchar(uchar c)
; q7 F9 h! f+ k" [{3 ?; J4 _% _# q5 u
    unsigned char head;+ `2 h$ k: M5 u6 @4 _
5 X) T6 i; S  V' g7 B2 u
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
$ i+ g: m" v1 O, W2 H    uart_tx_buf[uart.tx.head] = c;
) z' E3 g% n6 e0 t# \+ ]7 c( b    uart.tx.head = head;
6 s4 ]( H# M1 F& m% B
( H" M3 {5 D/ ^! G    if(uart.tx.busy != 0x5a)* x2 Q( n  h% v2 t- ?
    {. M  A) @  ~7 l( Y' y: Y
        uart.tx.busy = 0x5a;5 \2 m3 b. W& |3 X, g2 O, A
        TI = 1;' D. B- w+ H% V
    }/ _1 T1 ]8 f& q! |& O- W5 U7 K
    return c;: K* Y! ], S3 [4 Y' Z" c
}
. T9 H+ ]8 g7 F# D  z2 y//函数 判断串口是否有数据传进来
" g  U# I1 N6 C2 X) o  ^! U4 }% p//     如果有,进行接收数据; [: |5 G. E, E/ l- Y
extern uchar GetRxBufSize(void)
% f8 b& ~5 U( O" w5 O{
4 H7 v4 e  b5 x    unsigned char head;7 L. E: N# B  K( y0 p$ E9 V0 w

: ^$ J0 U. ]2 l7 I. E  B6 `/ Q/ N    head = uart.rx.head;
8 Q, d! M# l) S+ x    if(head < uart.rx.tail)! ~+ G, R9 I7 \  ]
    {0 E, B& N. U& s# ]7 N
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));2 k% N: k0 E! Y+ G( V# @5 C
    }else1 s% N& k3 C' S2 ?& d
    {
4 t/ X. c( }" p; A        return (head - uart.rx.tail);! Y- V% j5 o/ ~4 e5 z
    }3 e9 I( j/ d: e1 {- C
}
; @; R) I7 x* D" [& Q/ m  R//函数 从串口缓冲区取数据,只取前8个字节的数据
- h7 T4 W- D4 g7 v- bstatic void EnterRxCmdModeByPc(unsigned char c)" w# o, _' [. j2 T. H! U& z. w
{
0 h7 n- f! l1 G: g    if(RxCmdPt < 8)* d2 S& I; [& X% S) Z! t2 T
    {& x6 b' _. ^* D
        RxCmdTimeOut = 10;4 |) x  v* b9 U% s* ]
        uartGetBuf[RxCmdPt] = c;
, X# j' A- C) w6 ~# h, g        if(memcmp(uartGetBuf,Updat,3)==0)
) F+ M- ~8 v) W1 X' _        {! b3 W. ^  j4 Q0 `% V
            EnterIspMode();
; L1 v  f& k- f# m. ?        }
7 V8 L) X  i( C# Q- G; J7 x4 {6 f! o        RxCmdPt ++;" u* _! d; t' l+ s! f$ j3 C
    }
" ]% I5 u$ d  C, R}4 ]$ r. d) @: F" [1 V& G
//函数 取缓冲区中的数据
$ m6 y: S0 r1 Q9 E. x8 N4 e//返回3 E2 Z3 G; r5 ^  w
extern uchar Getchar(void)
) ?0 [  d. U1 v9 r- Y3 ?8 e{
! f- Q6 e, R: E7 \0 r7 o    unsigned char c;
4 F% L7 W9 v1 S) M7 A! k, F! @6 q2 s2 r8 u  q( R- u* j6 r) S
    c = uart_rx_buf[uart.rx.tail];. K+ |( b. b& G9 `1 v
    EnterRxCmdModeByPc(c);7 @- y& H9 w' N( r3 g! u5 K
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));" V. j/ M% z' h# u8 F; T2 B" b
    uart.rx.timeout = 100;
9 {; \$ K$ H! r7 U# ?; s    return c;. x  @! F; x. ]; y* ^
}
2 n. }. B( P- `& j1 C5 U6 b//3 h/ }. {) Q8 `5 [1 k% B0 e- L5 Y
extern void UartTimer(void)using 1: [: U6 r, N& U, ~  P
{
9 e& i% q1 x5 K% Z    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))3 u$ e* b, h2 ?) x8 O8 P
    {
. G2 K! {7 ]& y7 I0 ^1 W              uart.rx.error = 1;4 J! U- j5 N& h! [0 V
    }
- u9 {* h  s, m3 `0 ?& B% x}: s0 C8 a8 j" l' r( Y8 u$ j( X7 Q
//
, j) g- [. J: z/ m; F) i1 @8 dextern void ClearRxCmdPt(void)- j% y# T! ?/ W( b' ?" Y2 E7 z% G- V5 s
{7 N2 Q8 \& t* ?2 f- }+ `6 N- B
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))2 p" Z5 }$ w( Y; x( D# n
    {- o- j, b; I( s9 I9 i
              RxCmdPt = 0;
0 K  \$ O" G, p    }$ T$ e6 Y5 d8 ], `; t6 x( b8 o5 H! H
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

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

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

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

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