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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "REG51.h"   
4 R" n1 F- [  C3 a! l- F/ B; |$ g, [#include "intrins.h"
* o4 M' o  H# {* D$ Q#include <string.h>0 E6 \) u3 A: W
#include <stdio.h>+ }3 f. w: @" s8 y
#include "i2c.c"4 e6 ^2 E6 Z& f4 z9 ]/ X
#define uchar unsigned char
' J9 f# i6 P6 F8 euchar  port;. |- x: m! e; u4 z+ m3 |
uchar  rec_data;& [3 U; [3 x" T+ U8 L, C: A2 j
uchar  str[6];; V8 f- n; @5 Q; \9 |, E, U( Z
uchar  point=0;+ G! g- u% \2 y3 \5 r$ F
//串口初始化 9 M% n- ?- V5 _& P  u
void UART_Initial()        1 h& t- i. x/ H) v
{
' a$ S, Q) z: P    SCON = 0x50; //串口方式1,允许接收
: l6 e0 b; \- {( @        TMOD = 0x20; //定时计数器1方式2
; ~: q0 w( \8 \# {; v        TH1 = 0xFD;        //9600 波特率 FD4 K9 u; v) ?) i+ A( S3 j7 z' f6 g$ M
        TL1 = 0xFD;
* w/ ~! Y7 N- v) V3 A# q; t' _+ V        EA=1;      
6 O( ^4 [" {4 S3 [        ES=1;       * }1 T7 f1 f1 m7 E* X: ]0 d
        TR1 = 1;   
7 V: q) r& U* |- {9 B. m0 W' B}
% |0 I- W  R# Y  ~- o : h! W0 p/ U( L4 i( X3 \* K* @, T* T
void waitsend()
+ Z4 x$ [7 e" K8 S2 @{
: f" s) r' q9 d! ~    TI = 0; ! T; f6 s" \' g, O8 X9 j6 [
        ES = 0;* J  o% o! C! q. X! G* F" s
    while(!TI)
+ Y. e% t/ A! Y0 m, w; q5 X6 {    {" c" d' ?+ N5 h% h
    };
/ g  `$ I. M' z; b1 O    TI = 0;
& C. z  `+ E  v( ]* M        ES = 1;7 b' J# M( @: ?
}
4 c" P" V- G# Nvoid delay(long i)
( C) _9 N4 S; V, ^" j5 \{
- n, ~- `0 |/ k    long  j;' U4 R# t! w/ |$ ~
    for(j=0;j<i;j++)4 c. h2 I: N7 H  g  r; p% i1 X$ I
    {
5 y; l/ h# u# |+ V        SomeNOP();& V9 H: d0 ]) {4 Z1 n
        SomeNOP();9 a& z6 e6 ~* O
        }
7 x( Y" h$ y/ ]9 m}
# V; o0 W! Q: k! H7 `
2 B2 f9 p) w* E# s/ z( zvoid delay1ms(long  i)4 ?7 t& D3 z6 u* e2 V. r/ R$ p
{$ m+ V. f( m4 q6 Y
    long  j;
( d: h0 \0 c, I$ I    for(j=0;j<i;j++)
( {  |4 [% d) z; r, g! T    {; _5 r6 A1 ]: u/ N2 d
            delay(70);( F" R/ i7 y6 W$ {
        }( N% i1 N8 z+ ]
}
$ F6 e9 o- A# z+ \9 Rvoid COM_REC(void) interrupt 4 ' I& p0 H4 z, g0 |0 W
{
, Y+ g2 F# n7 h. n     
! Q- S6 {# _  {    if(RI)
- ]* n. y# b5 A    {    //清除串行接受标志位+ s7 ^3 u* j. M6 i
        RI = 0;
6 j# u: L- y( S        rec_data = SBUF;  //从串口缓冲区取得数据/ D% b# a" |, U" E% c9 p0 P% v  B% d
        if(point<=5). ?4 I! z" O, o2 ]2 X8 S5 O( }
        str[point++] = rec_data;( [8 G" m! X  }! h0 ]. M6 b
3 I% b5 B" ^, o8 J7 O
    }; O$ r8 f9 I4 M. }- W  c7 |: p
# p  K% z1 c7 q. ]$ S4 l4 I
    if(TI)
3 ?1 x2 E; a' v8 }6 j9 }    {
" Y' a4 r0 f4 X& d, t        TI=0;
" @3 L; X8 I' H2 I    }! y5 @  w  b9 a+ E5 J* E
}
  I+ n5 Z0 f4 k- y8 K% Cvoid COM_SEND(void)
' O& ~! e1 Q# \+ T2 q{/ a7 u+ i3 ]5 y6 t
for(point=0;point<=5,TI=1;point++)             //连续发送数据( ]# S! N, Y: s/ ]% K  C4 S# f2 p
                                      ( C: ?+ o# L7 l" }7 Y! W1 x
   {8 p, v! T& [) N+ \
   SBUF=str[point]; //把缓存区的数据都发送到串口
4 v+ @# v# _$ P/ u2 J  Q   TI=0;9 p3 O: c2 A5 G  \) l
   delay1ms(2);; a. B2 c2 A  g; `
   }
. D- ?( _, M# J   SBUF=Read_OneByte(str[3],str[5],str[2]);; M/ M; F: Z0 P& W3 N
   delay1ms(2);. ~' g' X/ O& K
}4 M* F- S2 N( b! t! l; A; m
( t8 n9 ~  X6 W2 I# Z8 H0 k

: A9 I) p" J/ o) T2 D3 D; ~void main()
  f9 Q$ U. K% d+ z{- x4 _' D# L4 a+ A. Y
    while(1)
. l3 x7 c0 {0 r& n9 p        {+ S5 M; r2 h# O4 Z& M
        UART_Initial();
4 U9 o1 U1 D9 t1 p1 n: h; l+ a                delay1ms(4);
- q* A7 E2 n! a3 v( h7 a1 j                COM_SEND();
2 a7 Y8 e" @: }+ Y5 G                //point=0;
+ k" ]) N) @: h+ J; ^. t/ R                }
4 R/ y; ~! e( O. u& e9 e}
" ]) Q  ?; I1 f- f4 ~; I$ F5 H6 h& h3 |+ P8 z& K
这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊

该用户从未签到

2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的
: I9 n3 R* a" g" e( G外围供电 把RXD TXD短一下

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45 ! \4 A' b( J# o8 w
你可以先试试看  那个串口板是不是好的 2 c: A4 X6 _* z
外围供电 把RXD TXD短一下

4 y( e! R4 \$ z; f/ w板子没问题

该用户从未签到

4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"
* y( c6 @' M3 l: j  i! f& c! N& b
  s+ I& L" t2 p) Dunsigned char xdata uart_rx_buf[128];' ~* z! L. t- k* ~$ w
unsigned char xdata uart_tx_buf[128];9 g# @) p0 l2 V& j
volatile UART_T xdata uart;
: @, o( |/ Z8 D/ U6 F  M# Junsigned char xdata uartGetBuf[8];
( T3 E% D' L4 m% c( qunsigned char RxCmdPt,RxCmdTimeOut;: d3 z6 C4 k+ B0 p" T
7 |% d/ D/ @! Z! I4 `% E
static void Serial0(void)interrupt 4 using 10 Y# _, [: V) J% w: i7 ~* k% p
{
1 B' \! p9 ]# k4 e. ~5 k    unsigned char temp,head;5 `: ^. V% ]+ t1 {" {
2 E) f% i% @4 y2 [8 K8 P. S( y
    if(_testbit_(RI))! m% q( i1 e0 F! k4 V' E
    {
- b0 T' F& s/ V; U        temp = SBUF;
! m  b) ?- ?4 k. U        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));9 R3 x! }9 f) L& a) x
        if(head != uart.rx.tail)& c* a7 m1 b: V; [
        {
2 n# [! X" ]$ f5 l4 e7 c6 m            uart_rx_buf[uart.rx.head] = temp;# j! a2 V" X1 E' o
            uart.rx.head = head;5 U7 f7 E- k5 b) t
        }else
( r" H  q' j) C" U9 O8 d        {
! A$ M8 u" ?# Q& z6 F3 |            uart.rx.error = 1;
" W! g+ p: j! Z- Q        }' l6 B3 ~1 V8 Y$ c8 N9 B
    }$ C% T( h, U  {
    if(_testbit_(TI))4 C7 G4 z. _9 j$ |& N' \
    {
* \! a2 t% q" E        if(uart.tx.head == uart.tx.tail)# d7 D( I) `' r7 W9 o
        {
/ A, K, |* W' o  |7 r9 v            uart.tx.busy = 0;
* O4 H2 W. q  S/ u1 r$ A! z        }else' f/ R) l# E9 j/ U1 v6 u: i
        {
* X( d, ]3 _  }1 @            SBUF = uart_tx_buf[uart.tx.tail];$ ]8 D/ U+ r/ d% W6 V6 H' E) `
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
6 Y9 Q( x* R" y+ h! Y        }( _  l0 Z. K) A! r( {- V
    }
; D3 I; O; e/ o" {: o3 l% a}9 @% _( u- \# n0 F+ _" r2 l
//函数  串口中断初始化1 Q* ?( O4 N: w+ e% {" V. W# g
extern void UartInit(void); W6 l' O  S: `$ I4 _. r, F# }- }% y
{6 R% X3 H& i+ V
    RCAP2L = -(XTAL/32/BaudRate_9600);9 m. G# p. H' j' i) ^, o
    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;8 z5 p4 `9 s: R  |( _5 j: J8 E

! m7 A' h) U6 G* K" U. a3 F) `    T2CON = 0x34;
9 c5 l9 E  M* N5 _5 [. K1 y" {    SCON  = 0x50;
3 \7 p8 E( z, o# J# J8 S( x. P4 C- `. H$ ~0 f8 B
    IP |= 0x10;     //serial 0 high priority
  Y# ]9 }2 M% U    IE |= 0x10;     //enable serial 07 o' o0 L" \! ?% T2 {0 d0 S

& c5 b, D2 U$ L# z% y    memset(&uart,0,sizeof(uart));- N2 H9 C1 k; A, p: @: e
}
' c  m% E" N/ t9 c- s! k// put char
% V# j7 t- Q6 t/ _& D9 P+ _+ E+ aextern char Putchar(uchar c)
1 j3 S" v" H6 [' T8 d2 G9 u/ i: ~{
' v) y2 t$ Y* Z    unsigned char head;
/ M9 z3 v& I( B: ^6 a
6 s  [2 }* Y# y% _1 g7 p  Z  Y- i    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
: r9 J/ F. G4 d8 M# q    uart_tx_buf[uart.tx.head] = c;! C1 G* e$ M! q4 x' K$ C' `
    uart.tx.head = head;
! a6 c$ Y- S; p: J4 C' l, E) G
3 s: p8 K) M( I: R. _, T1 Q7 f; k    if(uart.tx.busy != 0x5a)7 t6 {  `4 D. k, W
    {! l* ?! _0 ]- p$ a% \% r/ }" M
        uart.tx.busy = 0x5a;
5 R. B7 X9 q& v7 j& s8 J( h        TI = 1;8 i' c% w" W( [  F
    }
5 h. G0 a& m. m) Z# ?; a5 x- V3 {    return c;1 M* X! d" \/ ~: \+ X1 a! m
}
* C, l! \# ]: N  t//函数 判断串口是否有数据传进来
& A4 Z. A; g2 H+ `& G//     如果有,进行接收数据0 B: F$ Y, S4 ], T' M0 i
extern uchar GetRxBufSize(void)- n1 d/ u2 R$ q+ m: j
{6 X) k! }" ]  {& D/ ~
    unsigned char head;
  f/ j4 ^8 I) |- Q
9 J/ K# o( K0 ?4 L3 C- k    head = uart.rx.head;
! y: T5 i" p( q% X    if(head < uart.rx.tail)
" p: [  S8 s/ \- y$ Z    {5 i8 }3 d) Q7 X, _4 t
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));  v* X: q, C( J5 o7 l
    }else
5 g5 S; L) U7 ?" {    {
7 Q" Q4 ~5 j0 S- h- h' r        return (head - uart.rx.tail);/ `; W9 Q' M, A
    }. T2 c2 H2 b$ a. f) z
}
/ Q5 s1 r: Z3 G3 p//函数 从串口缓冲区取数据,只取前8个字节的数据
5 s  h1 N- h# g, O& \static void EnterRxCmdModeByPc(unsigned char c)
6 @! S0 \) F0 f5 g& B% M{+ s* S# {! C+ ~' \2 ^
    if(RxCmdPt < 8)
/ H- G$ H* F5 E$ |7 L    {
$ j+ `, ~, d  \6 f. r* i7 \        RxCmdTimeOut = 10;. g7 b. |: l. v* A
        uartGetBuf[RxCmdPt] = c;
4 @- n% _" W( u; }+ t: P6 ~        if(memcmp(uartGetBuf,Updat,3)==0)
4 O" p- \# u: R6 O' t; W, u1 t9 a        {/ f. L& q0 u" v+ }
            EnterIspMode();! i7 W* h; M5 F/ X% V* L
        }
( S: F9 s" b; y        RxCmdPt ++;% T( L& ~5 ~( t( H& S' @; e
    }
- \9 ~, O/ M0 `/ i0 K1 [}% B; l( S9 C& r( r+ x* S
//函数 取缓冲区中的数据
  y0 z+ j) t: A6 X0 [, J//返回- l1 P- j7 S, j1 o/ @+ X
extern uchar Getchar(void)
+ P8 d  z: j, s/ U{  Z- N7 h0 L: a9 [) u9 `) |" V% {
    unsigned char c;7 f0 ~; J& I$ D5 [0 }2 j; _, _

3 {$ W* O. c+ ~6 [# O    c = uart_rx_buf[uart.rx.tail];- @* m& t6 R5 x7 ]" _, B9 K
    EnterRxCmdModeByPc(c);2 A$ W+ L* s& ]
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
1 O2 w' k$ y8 e% B3 b6 O6 y. V    uart.rx.timeout = 100;
0 G; a' e- T0 Q    return c;2 H& f0 U) W/ T; H
}6 S* R6 I% @; T: w' g5 x& t
//
+ [; W4 I' `  g( T" E' ~# {1 Vextern void UartTimer(void)using 1
- z8 P6 I$ Z' u3 W( x{- U) E& T- A5 z( F2 q: a
    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))8 Z8 O! X. t; _- j. u$ o
    {0 w9 W! R. c8 f6 g3 C: o
              uart.rx.error = 1;- H5 V% P6 V$ X1 t2 m
    }8 x0 v, D6 Q$ T+ d  n5 d0 |5 F
}' K) m8 k$ a; O, T
//
; ]1 m+ G) [+ N* S; v9 U" lextern void ClearRxCmdPt(void)( e' i. y. Q% s) b) N
{" u- w1 R% {6 t  v" p" Q- R5 A1 Z
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
, C7 t- }, q+ R$ @    {
+ M4 Y: H& f! L3 Y& j* b              RxCmdPt = 0;
; ^- f- w* S: ^' |9 m0 `1 d    }
+ X% l7 u5 T% b) u7 ~5 J# H1 b}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-28 15:00 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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