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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "REG51.h"   
# Y3 k1 C- ]7 i8 t- j; d#include "intrins.h"
. W" k; i: }( A9 b7 [#include <string.h>
6 N. a# T& K+ `8 {, I+ @#include <stdio.h>" r3 ^1 V  q" n, z+ y8 R
#include "i2c.c"& K  c  \( @6 y! j5 c
#define uchar unsigned char; a, [* c; o- B- g) R
uchar  port;/ R  s2 Z$ j) d- e/ R! O0 K
uchar  rec_data;2 ~8 F$ {; I! Y/ ?: E
uchar  str[6];3 ]) t# X" L  `
uchar  point=0;
. u0 m4 s' E! O7 R8 Y//串口初始化
; f% W/ d9 a! h4 q! |void UART_Initial()       
* M. ?1 \- ]' w$ @- w1 }{
" m- Y/ W3 V2 f, u6 K  P0 e    SCON = 0x50; //串口方式1,允许接收
, z/ u8 Y' ^' P$ v$ q! y- `5 M- h0 `        TMOD = 0x20; //定时计数器1方式2
0 W& F! {$ E5 O        TH1 = 0xFD;        //9600 波特率 FD- w( f/ K6 U: ^/ w! c  J$ ?
        TL1 = 0xFD;. x( h; k2 A( S$ k4 Z: c
        EA=1;      
8 g* u& p5 G+ F& I        ES=1;      
+ n+ P: }) r" f8 j( q9 H        TR1 = 1;   
2 I+ Y- W  c: d0 }5 c9 n}
9 P& I& a: I/ O4 F   w1 D: S5 o# L  O& _, R
void waitsend()
) s' t4 \, E9 o  v, a{# j  w- ~  {- m6 ?4 d
    TI = 0; 5 s5 E, o( U$ B8 Q
        ES = 0;
8 D3 J" M( O( ?: v1 q3 c    while(!TI)% W2 @3 {, G  d6 V* Z; X
    {/ U6 ?5 {. G. G* b
    };8 F/ _* D# B, Y, S
    TI = 0;1 o8 C' Z, W- E5 U6 H/ G
        ES = 1;+ M% i/ |; Y; c2 h  y
}4 Q6 {: |3 ~, U, {/ u4 r( u
void delay(long i)8 N. j( }( y) r: F
{
: i2 `( K% l4 `3 B' A    long  j;
  K. U1 @! L" P3 z8 W    for(j=0;j<i;j++)
+ b+ M3 A6 E7 b    {% R8 [( [1 Y$ a9 Z
        SomeNOP();. f, J: G. {4 F
        SomeNOP();& f. A7 F; H7 t7 L4 t" T1 X' y
        }* c$ U( I4 Y4 s1 J2 z3 u. Q
}
" \% b' `; m9 B6 W  {
& O6 v7 i9 B6 c0 [) b' Z- fvoid delay1ms(long  i)
6 n7 o8 R8 P: B( j' F" X{' p) ~6 P, E) h  B) e9 o0 J
    long  j;
: J( D1 {# `5 r1 ~  V" h4 F    for(j=0;j<i;j++)# P+ T- K8 o! G& O
    {
; L" m: c/ c' l            delay(70);
7 I, b* f0 {* ^/ k( A3 _3 e* Q        }) u# ]/ D+ F1 a6 M" c: Q' V
}
9 s  y. D) e  w% R3 ~. W* xvoid COM_REC(void) interrupt 4
* c  h$ q! G9 D% B, W2 W  H{+ e* J6 ]4 T6 W! C5 N2 C
     
. H* S. C3 H: u    if(RI)
( H, |8 T% Y; E- ]- A! L    {    //清除串行接受标志位
) m. _: A+ r. Z        RI = 0;
; `" b8 x9 r; ?8 e        rec_data = SBUF;  //从串口缓冲区取得数据6 t% w+ g  E$ Y/ L7 q+ T
        if(point<=5)6 ~* y. U4 |: y2 q
        str[point++] = rec_data;+ a9 \3 U+ k' F3 n" P9 H

/ l; @4 b" l% C$ V# L    }
" F+ l3 U; K# l5 y9 R; W& d
2 n7 H1 o! x$ f% d4 a: t    if(TI)
/ B$ j" |" Z4 C6 f    { 2 C9 [! K  B, }7 B; y3 W
        TI=0;2 g7 g; }+ P5 v/ z& A6 Y5 V
    }- M  `- K# q" D8 U2 H- |
}2 B0 T& r4 U# e6 f
void COM_SEND(void)) g5 ]+ r2 h' {" z
{, N: T( B3 X6 V7 A( s' J4 p
for(point=0;point<=5,TI=1;point++)             //连续发送数据
/ `8 ]9 U4 F. I/ w+ A. z                                      
0 j% S0 [) N# ~5 C! M! K/ Z* V   {0 {' ^0 I1 w$ U% f! Y- A7 t
   SBUF=str[point]; //把缓存区的数据都发送到串口
6 R( m) u" S, n) \* @1 _1 Z   TI=0;  l( T8 O$ i0 D, T* _% N
   delay1ms(2);! b7 d; d; z/ f1 m, h8 ?: f
   }
, Z5 N! g: t# ?$ y$ I. [   SBUF=Read_OneByte(str[3],str[5],str[2]);
* o: ]3 q4 G* y7 S$ [" T: q) q/ s   delay1ms(2);$ w9 h9 h1 [1 T) K6 V: r1 ~6 D' N
}$ ~6 \) k" A8 ^9 v4 `
! u3 }; X! P) Q+ q  t& K
6 D5 R$ V( c) r
void main()
3 E4 G" ~: P  N% B& ~8 A* W. {3 D{
, o* w( J( w0 D* R( ~  t    while(1)1 D# T) k9 O- o5 _% V& j( B
        {
" l4 P! Y: M; d% M6 B' N        UART_Initial();
) f( a* f/ e  X" ?/ q7 K; B4 m                delay1ms(4);
+ K( B" K  o( T1 r                COM_SEND();
7 u, I* K- M8 D0 |8 {/ _* G( o( {& L                //point=0;
: R6 d1 y& r+ V0 f" A7 {                }( C* f1 Y3 A2 Y; Z
}: ~. i# D" g6 \9 d/ L
4 d: V3 K- c8 F
这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊

该用户从未签到

2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的 ' L8 `" U( R, Z8 Y! w
外围供电 把RXD TXD短一下

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45
; V& I# G' @  f/ G0 i; n你可以先试试看  那个串口板是不是好的 ) B$ z5 L6 n) _1 k7 P6 i+ D; Y3 H) V
外围供电 把RXD TXD短一下
7 m) R. n0 T2 K, P+ D! ~5 @7 g; [
板子没问题

该用户从未签到

4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"1 D  V! M5 h2 v3 F; O6 n- \5 }% F
+ I6 b! q" |5 y' \9 k4 h" U
unsigned char xdata uart_rx_buf[128];
4 P) f. r3 k. {. C% t4 E! |unsigned char xdata uart_tx_buf[128];
' t* z! s1 T; {0 f/ Jvolatile UART_T xdata uart;
5 e$ _1 Y1 G9 W* v: Kunsigned char xdata uartGetBuf[8];5 J8 f, }/ A0 q& @" X: u
unsigned char RxCmdPt,RxCmdTimeOut;
/ z, h$ J8 C8 s& p( C0 t2 L' f/ _) s$ c+ f; g
static void Serial0(void)interrupt 4 using 15 K: g2 n# I$ u% v) a
{) x2 o' ]0 _, a% I0 J  W% r( J
    unsigned char temp,head;! \! S4 q& @3 n6 b1 G% N
6 F: v( z- Q8 l7 S2 Q% ?
    if(_testbit_(RI))  g) S+ C1 ~% j+ U
    {1 L7 k* C+ T  d3 `1 U  k
        temp = SBUF;
% L: \4 P0 g6 R( W0 M6 o, q( J        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
) `5 `  k, y( w$ t$ i( F        if(head != uart.rx.tail)
7 u; e# f. H0 c" B4 J        {
  K7 G% C1 Q9 ]: K: v3 t9 x% _            uart_rx_buf[uart.rx.head] = temp;
6 q$ Z* K# V1 i6 O; C: H# A, d            uart.rx.head = head;; f+ a& [7 C, w( H$ ?! `3 L
        }else& y: c2 T, y% [  s& _5 ]
        {
- E3 E  J2 S. K5 M8 ]& @            uart.rx.error = 1;7 [* Q+ O6 O# h0 f: r/ `0 T
        }
, n. m- \; `8 i1 Q7 y+ {" D* P4 ~    }, ~9 I$ G' Q  h! b2 p3 E) J
    if(_testbit_(TI))+ {! r) y2 R4 j' g% ?7 x2 f9 v
    {
/ r6 U! E2 ]$ \0 c7 |  E        if(uart.tx.head == uart.tx.tail)
# v% z/ r7 a  J# h0 o- A        {! ~5 }6 Z2 N5 ~  ^; r; ]
            uart.tx.busy = 0;
: y) s% F; ?2 v, B! r( i        }else( s8 S$ o# i3 X7 M7 H+ M
        {
" j" B( I5 L( ]5 T8 e% e' f4 R0 W            SBUF = uart_tx_buf[uart.tx.tail];' c7 y3 h4 [7 p
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
6 o: w5 |3 m. ^2 c/ i4 P$ f        }
- ]$ ^4 v/ Q, `    }
5 a; P! f5 g3 [, B4 Q9 o  T}9 x; \+ z# j4 @7 N
//函数  串口中断初始化
" F; @# A1 @" H( g' }extern void UartInit(void)0 m* R" e( i& D
{
. A* ?' P* i( o" t' P    RCAP2L = -(XTAL/32/BaudRate_9600);
) a" T. g5 E4 k' r    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;5 f( Q: f) a7 b) l# Q. }" v8 g

* i) N, ^* ~$ `/ K% Q    T2CON = 0x34;
) _/ }+ [0 N  `8 ?/ V+ G8 f    SCON  = 0x50;
& t' ^- \/ E" \( [' ]- b  o. p3 f2 T( c0 e) l3 n6 b4 y
    IP |= 0x10;     //serial 0 high priority0 }0 E" _) u. Y* ]7 v3 s
    IE |= 0x10;     //enable serial 0
! ?3 ?5 {+ C8 `9 }& Z8 P: c* `3 X- C+ M' v3 K
    memset(&uart,0,sizeof(uart));, @9 o! f& H' J
}
" R9 d4 y2 t7 U// put char: W: D# h) b/ Z: u9 b
extern char Putchar(uchar c)1 A8 S2 K8 E, e+ l; ^$ h2 z4 a
{
1 m6 Z- S2 o7 q# p3 Q    unsigned char head;
# J7 J) i1 J/ w- V7 s3 e2 C: v6 o: f' X+ I
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));0 c3 T6 @5 H: x2 H& d
    uart_tx_buf[uart.tx.head] = c;
+ r( q1 m( L  F; `    uart.tx.head = head;3 x! P: L1 k5 w; T) ?( a

( J% m4 a  e! P2 T/ |    if(uart.tx.busy != 0x5a)% P! B1 g. n7 G. X# d* j  q1 l2 s
    {$ P4 ~# ~' |8 p
        uart.tx.busy = 0x5a;
" n; a# Y9 U: O! P( l2 c1 H        TI = 1;
7 |& L5 O$ w/ a    }: Z- G: W$ Y/ m5 s0 P
    return c;/ A( f! w9 X8 H9 y/ X! k8 D
}0 [- R/ }4 e( C  Y
//函数 判断串口是否有数据传进来
% O% X: m. P$ ^+ _//     如果有,进行接收数据
# k- C* ]8 A, A) W; k+ `0 p% `4 i% fextern uchar GetRxBufSize(void)
) ^5 D# _) u2 V# v& Q& t7 i% \{
: Z# L7 r3 y& y$ i9 L* U* n& w    unsigned char head;7 i5 J( g; m9 T; x; s4 l# X) {

, Z) \" [: F8 l( k( m" ]# I* e    head = uart.rx.head;/ P5 [# o5 `2 y$ |6 V9 }6 g: l
    if(head < uart.rx.tail)
$ a! V% T' P4 G3 W" T    {
1 B) P$ l. |, }0 |7 F( a" t- ^, X        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));9 P" T' _, E7 f1 R
    }else
7 I/ E: p8 ^- h9 ~- Y! z. [    {
! H. N; ~/ I$ l2 c8 l        return (head - uart.rx.tail);
% \% z; b# _+ t8 a: j( @    }
* k! H& h8 [0 ~( a$ f& ?}0 r1 V  [5 E* K# I8 L
//函数 从串口缓冲区取数据,只取前8个字节的数据% s0 X7 D6 X8 b; N8 U
static void EnterRxCmdModeByPc(unsigned char c)
: S4 A1 l3 y, y+ M. R{
* n+ H! }2 ?% s  M) |' m% v* @    if(RxCmdPt < 8)
- K+ ]/ X% J$ P; H& J: y% u9 o    {
& {5 z' b  n0 y3 M& h' [        RxCmdTimeOut = 10;
8 x* y  G8 s. R, K9 W. R% T        uartGetBuf[RxCmdPt] = c;
7 u+ `4 q7 ?' E2 q        if(memcmp(uartGetBuf,Updat,3)==0)4 h  @) k3 i& s/ w
        {9 o0 C- P; \2 r
            EnterIspMode();
) a# ?5 O0 q' q$ [; ^' _        }
  `' Z- d0 M3 \# b# b" Y8 g        RxCmdPt ++;' X0 V4 ~2 u1 v% t
    }
8 |- h2 Y" d! |- ?- i7 d}, v$ b+ W1 z0 g
//函数 取缓冲区中的数据  D2 g% P8 z% W+ e8 h
//返回2 q4 s7 k" v( j( [- s( k8 c( n
extern uchar Getchar(void)
6 E& ?% W5 j+ i4 |{
. {5 l6 d% h, g8 r- j% D( G# @    unsigned char c;
' h3 l' M( R7 `3 g' I: U9 P1 P) ^5 j  p- h
    c = uart_rx_buf[uart.rx.tail];
8 ]9 x! |9 I# \' m) q6 A1 S    EnterRxCmdModeByPc(c);
' C; G" ?9 |& K( u/ U  r1 R+ f. W$ t8 V    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));0 b0 R5 I8 R4 Q# d
    uart.rx.timeout = 100;" y7 }0 h  \* s1 z
    return c;
$ u# T" C+ m8 K, A% ^) C$ R. S% z6 c}, f6 q3 c4 ?6 p/ U: ?
//0 U: E. c8 C* `3 F0 @
extern void UartTimer(void)using 15 `9 R! K% A: Z1 l
{
3 r4 w" I" x5 |' k8 h% D    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
& R1 w" s! K4 ]! s- F: b3 @    {
6 H* ~( q/ B+ T              uart.rx.error = 1;% t& W1 Y* {7 t6 @! T% s
    }
" |: {# Q2 k7 ]/ n  Y$ o% E/ C}, p9 v6 N! s- K: V/ D
//
( F% O0 P9 W. {8 Jextern void ClearRxCmdPt(void)# u. O4 A" {" I+ b6 M* V
{
# I5 r6 h  S) k4 `  u" [    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
* i6 A) U$ W* W* u% t1 s    {
) J$ f  q' R$ c9 i4 o              RxCmdPt = 0;  \8 R4 f9 S% [& x7 P- G
    }1 F( e0 e/ f- C; f/ a& M, P1 [
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-6-18 01:15 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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