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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "REG51.h"   
- l! {* a9 p+ a; y' ]#include "intrins.h"$ z; T, u3 S* s! F  T) y- g
#include <string.h>2 K* o* Y( e" `/ E9 \) g
#include <stdio.h>$ C2 p# S+ m) R, A# S, T9 v
#include "i2c.c"' _/ A* q$ @6 f$ J. y
#define uchar unsigned char
; n* o( z3 S( J( Xuchar  port;
- L& f% n" ^) r7 r  Buchar  rec_data;
! R/ n% Q# u; R( s3 y2 muchar  str[6];1 g* ~7 `, R+ {1 E3 y, y3 T, K
uchar  point=0;
- E1 t; a; E- k//串口初始化
& f& _/ \: \  D# m9 N0 E& R3 Evoid UART_Initial()       
: \9 p; u5 |* [: }" u6 C0 \{ & b8 q0 S0 Z/ c  C* Z* C* G
    SCON = 0x50; //串口方式1,允许接收2 N; C. L* a5 a
        TMOD = 0x20; //定时计数器1方式25 c8 Q' p& G: M. o3 @& |
        TH1 = 0xFD;        //9600 波特率 FD( |% d$ }+ ^) b0 v+ U; i
        TL1 = 0xFD;
2 l3 @. I$ V. n) |' g0 k        EA=1;       : h! J8 L4 n: c! s  k9 J% c- C" x
        ES=1;       7 p& v( R- w: a" N
        TR1 = 1;    4 `) o8 i- P+ H. H7 T
}
1 w2 w1 {) z2 ?, s( X- _
! K2 T& A' B# X/ }0 ~1 X) ]void waitsend(): t" h  P) R- p# n0 c/ q
{& y0 G, B" [/ j5 }7 B' Z
    TI = 0; 6 y$ S& v+ w: ?# F: U9 g! \
        ES = 0;2 p. q  B; }0 {0 L1 ]9 A9 P4 z
    while(!TI)$ S* V9 H0 j, K/ l1 N4 _
    {
  N7 X. P" D& l# ~8 f) q# o    };
3 x" h) x( H# k$ @5 A, P( e    TI = 0;& ]! _3 _' v. J, _' @7 c6 m8 z
        ES = 1;
  r8 D1 v0 {7 i! z}
4 h3 G- x" a5 j) avoid delay(long i)- V4 j" t% Y, U7 ~" ^$ u+ g% d; A
{
' T, b0 y: x/ C    long  j;5 T. X0 b8 g" v. Y2 Z4 t' ?
    for(j=0;j<i;j++)" C- n- m" T4 z
    {7 @, B7 f, U* ?
        SomeNOP();' n* x: t" |( ?, Z$ m
        SomeNOP();
, e: v- i! _$ [2 |        }
1 j; H8 w+ y# q* J" Z" `( r& o5 S}
4 ?" E* H1 G! ~
& c/ s7 F) }0 Hvoid delay1ms(long  i)
/ L6 ?% Z6 Q& h% w& s2 e; {{
& b) D) Q$ J% ~    long  j;0 j/ f  d8 X6 U% H' b
    for(j=0;j<i;j++). {7 r) E0 j) Y. l  {
    {
4 ~8 p" Q3 q- k            delay(70);6 E2 f% L9 L& V
        }; T' N* U( a( ^/ n% t
}8 z. l& A# {& r, G1 d- m8 R9 ]7 D
void COM_REC(void) interrupt 4
5 ^* S! D$ B! w9 n* M' }: R{7 P$ t, h' \8 r" d
     $ j: r- s+ ^* d2 s1 h2 ^
    if(RI)" Y' h5 ?! g7 n/ S# ?3 Y+ c
    {    //清除串行接受标志位9 c+ l  q1 E  @, C6 u
        RI = 0;+ Q6 K( n  H* t+ s; i$ _0 Z
        rec_data = SBUF;  //从串口缓冲区取得数据, r+ I  q8 t' ]/ e# P5 f
        if(point<=5)
$ ?+ d- H) K% _% A2 t; ~8 E        str[point++] = rec_data;
% ?' i  Y, K4 ?% M9 @8 Z$ r# ]5 Q& N9 {5 U, t3 ]# y) D- \  [; D' h
    }$ K6 i) C7 w$ Y' x
& I" g- f  g. k, U
    if(TI)
% I6 z9 ~4 C; p& q) T8 v- C    { 3 C5 z* C( r3 [' P4 M6 n, j
        TI=0;: p# q( |7 H8 z$ r4 Q3 B3 k, m' W
    }
  }) x& g9 H1 D! H9 x& r$ H3 J# b}
! c* p# @0 a  o9 j& ^; `) bvoid COM_SEND(void)
1 ]' C+ }; @% {* M( }2 b7 _# r. o: u{
: N" a' ]: E3 ]: S# rfor(point=0;point<=5,TI=1;point++)             //连续发送数据
# R: z- F3 r8 d' Z% G& T                                      
+ f( ~" V& z. C2 O' S   {
, C% f  _+ ?; B2 T3 n5 ^   SBUF=str[point]; //把缓存区的数据都发送到串口7 _" R; P( M3 b% K5 l, t. k
   TI=0;( E( W" }4 L& {: n& T  w2 I/ E- I
   delay1ms(2);% Z- f) y' l0 f' {2 V3 X4 ~: x9 L
   }. B' N+ C; W( p6 `
   SBUF=Read_OneByte(str[3],str[5],str[2]);
! R" F. Z* p# o+ l- X# _7 W: P   delay1ms(2);
7 u0 V: _4 D! H& K! C}
, c+ v1 C8 {, t. {3 i: [7 \: G
+ e! H5 e* Z8 |
- j- w, B2 L4 u7 z7 Pvoid main()
+ j/ x2 g' T2 @- `4 Q  P{
8 K: |0 M( h8 A5 D    while(1)
2 f, }9 m( P) w, s( ~5 Q        {3 }) Y) t3 o. ?% W" `% D0 H
        UART_Initial();; e- ]3 |% ^/ O6 {( \" U" r  g
                delay1ms(4);
8 f$ b  L5 E+ I/ w5 Y, ~                COM_SEND();& [. s5 K% W% P+ p$ l
                //point=0;' L# o7 @6 J0 `3 Y# t
                }
6 a% ~* Z0 G2 ^+ r$ e: U}
8 B7 l6 h3 O% @+ J2 B/ {9 X  }/ R- {! H
这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊

该用户从未签到

2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的 - S- I7 L. u& R5 ]" D4 q. O
外围供电 把RXD TXD短一下

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45 8 x' E5 [/ C4 S/ W$ Z# o
你可以先试试看  那个串口板是不是好的
2 E( {8 j# A- V; ~, Q/ P" h7 c外围供电 把RXD TXD短一下

# }, h- ^7 _. X* `板子没问题

该用户从未签到

4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"
4 Q$ Z, R' m0 A4 v" f( [% }$ U4 q$ P% `1 X: |0 [1 z
unsigned char xdata uart_rx_buf[128];
1 z; w' b  Q) @( [* F: l3 {' cunsigned char xdata uart_tx_buf[128];9 T/ u6 V+ i* w6 @, `; a
volatile UART_T xdata uart;
- w3 n' a% _$ {$ ^4 _unsigned char xdata uartGetBuf[8];
1 R% n. A$ Z7 x9 A/ u% Ounsigned char RxCmdPt,RxCmdTimeOut;  j" k1 N; `9 }* n# U- i

! x6 q+ n. W$ U& ~: V$ Pstatic void Serial0(void)interrupt 4 using 1/ P1 [) K5 X: K3 k3 x/ S+ x
{
/ f2 \: }0 \4 P    unsigned char temp,head;( V# s' S1 C8 X8 {* n/ G
0 ?; V+ u/ z* ~% v2 F
    if(_testbit_(RI))8 t7 \9 O" T( E0 r7 A6 q4 W6 x
    {
: t( h2 ~- |' j3 W, q        temp = SBUF;/ y, M! S9 z8 K/ Z7 z
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));& V& t% E9 G0 W
        if(head != uart.rx.tail)' c, G9 X/ S2 f1 f! o) b# E
        {5 w* v! k6 G, w5 o
            uart_rx_buf[uart.rx.head] = temp;6 x  v6 x8 ~) c
            uart.rx.head = head;7 M4 A3 p0 h) r( [1 T$ @. m
        }else
- A( U9 w) A$ k        {6 x1 N( _. @- c0 M6 x5 b/ b
            uart.rx.error = 1;/ K5 c4 a$ D: [
        }
0 ^. g  H; H, c8 n    }+ X( p! I8 i& W" U. o4 \
    if(_testbit_(TI))0 f% q5 X7 u' t8 U! V
    {
  }( U# j6 `9 `2 H5 f        if(uart.tx.head == uart.tx.tail)
; M( N& {. A: s1 q) z5 C# [        {
$ c+ Q% I* X! W6 r, @2 H0 q            uart.tx.busy = 0;
% }9 k* K) u/ ~5 t- S        }else5 }  O! C% z; x, y6 u
        {
( J- H5 U' o$ V/ m            SBUF = uart_tx_buf[uart.tx.tail];
) _0 t  ^7 i* {; _. }            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
. |) t5 |3 S7 F" ~& x+ R6 l        }9 O1 `1 E( S/ M  P# D) j6 F
    }/ |/ H) Y% r: d8 `4 Q5 I  h
}- g  _# x% |% L7 E& F# e( R
//函数  串口中断初始化
1 ]6 i- E( R) _extern void UartInit(void)
, ^: h7 Y. a& P. B! t$ ]% M7 F{6 U7 n5 U  v4 \; U* a$ ~
    RCAP2L = -(XTAL/32/BaudRate_9600);; B% t: n* W6 w: \' m$ J# p/ S
    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;, X. D/ J4 w9 M* a4 o2 S

! p: V9 U- ^; y, y; A) n    T2CON = 0x34;
# Q% |( ]+ x. C0 w' X* N' H    SCON  = 0x50;7 t* D& _0 ?# Z

( h! a# q% W  G" o5 i8 C0 {9 d    IP |= 0x10;     //serial 0 high priority
( B4 v! p3 J$ E2 Q- O. o9 x    IE |= 0x10;     //enable serial 0! |: ]# I8 |; ^5 x) q- C3 ~& k
; j3 x( r  b4 {) {8 k) A
    memset(&uart,0,sizeof(uart));
5 M/ r7 `% b: j' Z" n}
$ T( ?) `- Y: f! T* S, y// put char: V* x( @( d8 {
extern char Putchar(uchar c)
) y4 C9 i- D3 q1 D; q{
1 d8 g3 Q$ o, Z4 w1 v8 B6 S3 V0 v1 N    unsigned char head;4 @& a9 G; I2 g, i

! j. `; S% R& ]4 ^. b  Q1 A) _: E    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
: [9 G, E) a6 B1 v* |2 h    uart_tx_buf[uart.tx.head] = c;' B1 P- y4 D8 ]* I# N9 L3 [" {
    uart.tx.head = head;
; w( l: U! G- r) v; g+ k
8 u. G. q6 i0 K. t3 R    if(uart.tx.busy != 0x5a)
9 h1 K. s( S! V: v    {
. c! }2 K6 Q1 j" }9 Z" N        uart.tx.busy = 0x5a;
2 Z  N. \6 q1 \7 W: O/ V        TI = 1;1 `9 s8 y! S. {& ^5 ]' E1 g
    }
" ^+ n& z! X' i1 R/ x3 O    return c;
, D) |: G# C# z}! i# k/ h( J; k4 m3 ^
//函数 判断串口是否有数据传进来0 m! ]' L1 c& H7 E6 z) y
//     如果有,进行接收数据- Z  W1 O+ I0 x6 L3 [5 \1 G
extern uchar GetRxBufSize(void)
( s( Z8 z. t: ^2 i) @$ J9 h{
+ ?# g' R5 O$ R7 n    unsigned char head;
! f9 ?, d3 F$ S' m0 }; P
7 V* U6 ]# N9 Z1 W8 D% J    head = uart.rx.head;
3 O. V' }: u& {' o2 @7 ?    if(head < uart.rx.tail)( y' L1 _0 m" l
    {
& p: L% u7 b  |- f! |        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
1 h& ]3 I, b  ]+ K    }else
$ M5 b0 D( _/ N2 l( O8 X. R7 ?    {$ U& W: J4 q) {/ `) z2 b1 e
        return (head - uart.rx.tail);
2 o. j9 p" h+ n1 w    }* c8 E5 c' x: N6 k0 ~/ W
}9 C, z+ \+ d/ T, o- t+ C
//函数 从串口缓冲区取数据,只取前8个字节的数据
5 p0 O* F5 U$ G. F9 ~( X3 w2 p  Q+ }$ vstatic void EnterRxCmdModeByPc(unsigned char c): K6 F+ Q, {( p$ X
{+ A1 O8 ]1 b, ]4 h' d) K
    if(RxCmdPt < 8)
+ A9 G3 D4 }6 D0 O    {
3 ^% A, ?' T6 Y        RxCmdTimeOut = 10;
/ |. e2 L1 M7 T$ E/ d        uartGetBuf[RxCmdPt] = c;0 R/ q- y; V' L. E+ l& V$ r: l* m5 z
        if(memcmp(uartGetBuf,Updat,3)==0)+ ~" q, n* a; g6 j
        {) o9 D! D( b- E. w* @
            EnterIspMode();4 i+ ?( @* W% |7 s* |$ \% }$ }
        }: J' `: `3 ~7 _1 ~* h: [  m- D
        RxCmdPt ++;/ s5 L9 J1 i( z" T3 c* m
    }
+ `8 h! v2 @5 R}) C2 p6 m9 n. V
//函数 取缓冲区中的数据% g8 y- T3 _# p( w& L( X* e
//返回! G9 B( {! n# G
extern uchar Getchar(void)6 v) \- X' ]3 h! K
{
4 i$ t, I8 p1 S0 |6 l7 B9 @( Q* u    unsigned char c;, a* Z5 W# b! ~5 P0 y

+ Y. B' \* O7 _+ ?* }  D    c = uart_rx_buf[uart.rx.tail];9 A2 M# H2 z) K/ k; z: y" ^
    EnterRxCmdModeByPc(c);
6 G: O1 ?4 c& I( `, i( _. [0 Y$ N    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));& r4 M- k& B7 B- c$ c+ S4 S% _
    uart.rx.timeout = 100;' b  t* G8 \- h! F$ }( l
    return c;! U6 U! [1 m! z) h
}0 F( h# k$ z; Z$ W
//# R6 P6 Y# y! ~/ f  [4 y4 I. f9 o
extern void UartTimer(void)using 1
8 R7 B! z9 h- r: I5 w: Y' O{
+ w, g, Q3 t& q( g1 W) c    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))8 W2 N3 o5 H2 I1 |9 d
    {
, F3 i7 q" r6 O+ z" u              uart.rx.error = 1;
4 B* Y4 g) c8 G+ K5 Z/ T: a: q    }
; m* ?7 c6 s, O# e8 x5 J% P}, T2 n& A$ O9 F! Q! _! j
//
9 ~! N* J! o5 ~* vextern void ClearRxCmdPt(void)# j& S6 \7 X0 w2 k+ J  i  _) O
{
- n( g. Q, C* {8 Y3 Y' ^    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
% F  T/ s1 C' W4 b9 ^% m+ K" g& c$ H    {
+ b. l. M2 `. y              RxCmdPt = 0;
1 [. I" L3 Y: m& v    }/ }: j0 S! m6 h. z
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-4 11:45 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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