找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 1184|回复: 3
打印 上一主题 下一主题

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

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

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

EDA365欢迎您!

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

x
#include "REG51.h"   0 B) c) r% b$ l
#include "intrins.h"
( T2 K, ]) B0 I0 o( F) G+ x#include <string.h>
% m* c3 k0 d+ N' G; ]: e# n#include <stdio.h>0 j. p1 v$ ^9 ?" c
#include "i2c.c"& [% v+ m  a6 M2 G1 @$ H
#define uchar unsigned char
# b/ e+ n, P: F: X6 iuchar  port;
$ b" N* B! t' |* S, Suchar  rec_data;
/ o* k# v- F( p! s0 H5 F6 i$ q# m/ yuchar  str[6];: F6 D5 ]- n) g0 p* o
uchar  point=0;
0 i+ d4 S  P- D0 b- X2 C' R//串口初始化
3 C7 j* T& Z6 N; h  D" _) M( pvoid UART_Initial()       
1 w; N* u* E2 D* z/ ]{ - J7 A, A& t, @! }/ Z1 l
    SCON = 0x50; //串口方式1,允许接收
# G4 }8 T& T. R: U        TMOD = 0x20; //定时计数器1方式28 J+ I9 K$ s; g. \  v
        TH1 = 0xFD;        //9600 波特率 FD  M$ R; ^4 {" S; p% F; \+ q
        TL1 = 0xFD;3 g9 |( q' h3 L  g6 |, ~3 {+ [
        EA=1;       ) i# q4 d% l: I# g" r0 `
        ES=1;      
% w9 D. J- h0 X7 Y$ {4 S- _% Z( C7 e        TR1 = 1;   
4 p/ u1 }2 N& A1 {% c* L}$ _, ~9 }* x: J
/ v, |0 |/ x4 G
void waitsend()% X0 F9 n2 [8 S3 q: f8 ~
{' S: V/ L; v' ~- x6 j
    TI = 0;
  u! B/ m8 t" O. J        ES = 0;2 e5 y6 `* y0 b. v' p8 b* ]0 x
    while(!TI)
& l+ r3 G2 m( t& j0 ]7 r    {
& A' Q3 Q% ^4 U: n( o, L/ ~6 f    };
% ^' U  B$ g2 k& c( P    TI = 0;
# d6 x9 h8 u; c' c        ES = 1;9 J1 O! h6 u- n
}' j6 s# y3 {6 [$ d
void delay(long i)+ w5 q' j; f9 d: a7 g0 O( \2 `. r
{3 ]  q1 E0 A. z2 W0 F9 D) Q( J# u
    long  j;
- Q1 k* }% _# q6 t9 }/ b. }    for(j=0;j<i;j++)1 Y8 T. x& d9 |+ F0 m# d
    {1 l' v' g8 T2 [1 a5 e
        SomeNOP();5 P2 ]( r6 w" c5 Z8 G4 b2 `
        SomeNOP();
* K* o( Y+ {  s7 Q  s        }9 Z2 c, F) v, _+ Q. D, M
}
% B: N0 P1 W' g: _3 j  l% _$ a5 c* ]+ H+ O! G2 P0 \  ~
void delay1ms(long  i)
" A1 {1 A& ]& `' U$ t{- E8 Z' r- Z) `/ ]
    long  j;
! o7 O' N$ |2 B" A7 [    for(j=0;j<i;j++)% t( ?0 E- U. Y& ^1 `9 l
    {* e% [- I  M5 }8 S. x9 }
            delay(70);5 n+ [7 _' M3 E- ^' F9 _1 Q" m
        }4 m/ }$ x% W7 U9 ^8 a5 p
}
& }5 X/ c  v# |# d; h' G* _& Mvoid COM_REC(void) interrupt 4 8 x2 J+ s8 z3 t3 c  E3 f) Y
{
, Y" X  B9 m# [' `     * o* g. o$ j- o0 {+ y
    if(RI)% B/ t' t, K! k* W) T6 u8 U
    {    //清除串行接受标志位8 N$ D) e" p: o6 Y- i/ O. s* q
        RI = 0;* u; q# r( J/ e
        rec_data = SBUF;  //从串口缓冲区取得数据( s$ P3 z& x8 ?' U9 B
        if(point<=5)
4 A1 u. J* t9 J% ^0 n' E% n        str[point++] = rec_data;2 _2 n- q. s0 @! I# f1 Z: ^

( {5 B/ K' V6 j' h+ S3 w    }
* |, ^  u1 j0 l# d4 u
, }4 {. ]3 O2 N7 X$ J    if(TI)8 C2 W: [* S% r: N7 O0 ?
    {
* N+ J* y+ Q$ E+ k        TI=0;
) V5 Y7 Q' G: i: \- `0 b6 W    }
) u/ p8 ~' a! y* [" H2 S6 f}
, H2 g1 @' ?0 V. G* Y' @void COM_SEND(void)  P0 }: v* R1 [( J( U
{* s8 G2 v: g( c$ L8 h% P4 [% L* f
for(point=0;point<=5,TI=1;point++)             //连续发送数据6 L7 i% s2 G2 x9 b/ W9 n
                                      5 d  a1 X# O. m; B2 Z0 Y" {  C: Z
   {4 D" J' c/ V  \6 b! z+ W8 p) K
   SBUF=str[point]; //把缓存区的数据都发送到串口0 N5 B9 P( W& }% ]/ G% Z) x% q
   TI=0;
& U- e& |5 k; E7 [* g6 O, t% ~( ]   delay1ms(2);
% d/ X( j+ L  i4 G. V1 u4 m# L   }
5 A9 o: A. u% @" B; ?   SBUF=Read_OneByte(str[3],str[5],str[2]);6 B& M+ A& w4 S8 R2 h5 Z
   delay1ms(2);
, T$ T; n. g' W" n6 W2 z% Q}
2 _1 X9 K1 z5 |) }* R- k
' A  U' B! h5 B5 g- }
/ Q/ g" _7 C2 u5 Rvoid main()
8 U% ~3 k0 C1 W1 ^{: e# Z6 n8 m  u4 H
    while(1)' `& N! r3 A; y: W& o
        {
0 J5 B9 F8 |8 [, }5 n9 I        UART_Initial();  d/ l7 p9 u8 ~! K3 B& F( e
                delay1ms(4);
7 m6 {6 `( F0 I  L+ `3 `                COM_SEND();$ C% ?6 q1 ~7 h7 F
                //point=0;( f3 O1 }/ H: }) S: D, F; {
                }9 b5 @5 u. h6 v5 e7 i& Z
}
% l' _9 }# }3 T1 Y/ U, b+ g5 }" X
这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的 - s' r  }: J% G) v- O
外围供电 把RXD TXD短一下

108

主题

498

帖子

2289

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
2289
3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45 ( H( L) b# j) E: P
你可以先试试看  那个串口板是不是好的 % `  t) d4 I+ O# h) |5 X8 F" [5 v
外围供电 把RXD TXD短一下
2 p9 ^- f7 x- y  Y# L
板子没问题

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"
4 q5 D/ V  L! w/ Q, F' @, K& J) U6 `
unsigned char xdata uart_rx_buf[128];
3 f$ g# H: X- J, _0 w2 dunsigned char xdata uart_tx_buf[128];# u( t) b2 `% {
volatile UART_T xdata uart;6 ^1 d/ i6 ~$ w
unsigned char xdata uartGetBuf[8];( \) o) c+ V$ v2 W& K% f
unsigned char RxCmdPt,RxCmdTimeOut;# Q- _2 Y9 h8 n, w- ?  x

8 ]0 l- ]( \, |" T6 ?  V. vstatic void Serial0(void)interrupt 4 using 1& N, P6 Z* ~- M. ?" B7 g
{+ g6 K, }+ m$ f* l; V
    unsigned char temp,head;
' |5 G7 {4 N6 M. |5 b! v
4 U. @: s( P7 O    if(_testbit_(RI))
7 X! {' g5 X% ^% n6 }  a7 `    {2 q9 }1 `) N; l- `; `9 ^
        temp = SBUF;
2 }& D. _; ?* r& N        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));2 v( F& W" N/ ], x
        if(head != uart.rx.tail)" H! U; ]0 v. U5 b# y0 j' }5 ^, Y+ u  ^
        {
4 G3 J. ~# V6 s, e2 x2 _            uart_rx_buf[uart.rx.head] = temp;
' d( T% I4 Y9 {+ }5 }            uart.rx.head = head;
: _6 o# h) I, G& H3 k        }else
! T7 q: Y2 X2 ]2 O/ e  g- s/ _/ }        {
# n+ ~4 ~1 \& f' p' O            uart.rx.error = 1;6 X6 O  j! q* I7 P1 \8 W* `- T
        }) W2 G0 ]; M! b7 ?5 ]. a9 h
    }) ?) N" p& g* x& i
    if(_testbit_(TI))
! I( ]; Z/ Y; P    {: u1 S! W6 p* F
        if(uart.tx.head == uart.tx.tail)
: `1 r0 [. i3 d5 Z4 j        {
6 O% S+ c/ H; w4 O7 m0 Y            uart.tx.busy = 0;
3 {3 D* K( s, z& u, D% S. G        }else
) h+ a$ k+ Z0 X, }% o, Q        {
5 m! }* }2 K  A# L& J            SBUF = uart_tx_buf[uart.tx.tail];7 c! Q2 R' N$ o# x: j/ \
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
  u: A/ f+ i  t& I5 K        }
- R! h- @( `& u* O# W  Q0 @, D! R    }0 A: @) R: g' @. A! Q5 m
}
9 K( A/ w# c) u//函数  串口中断初始化
! A9 O; }3 c# K  Q5 G1 iextern void UartInit(void)
) O6 X% a, l' T* B/ C+ z4 y{" G3 T" R8 ]- Q& f, u4 w$ ~
    RCAP2L = -(XTAL/32/BaudRate_9600);' m) h: o: Y+ n; S$ n+ C
    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;$ R+ n7 J  z' k7 O2 H9 a

# h! }0 w  j5 E- A2 I& c    T2CON = 0x34;
* u" c4 N$ m7 s* i    SCON  = 0x50;
" `, T: }. R1 E! T- D0 q& w
: y4 X8 ^, E* F    IP |= 0x10;     //serial 0 high priority: M$ }6 T1 L6 [: I& |( v% U: e
    IE |= 0x10;     //enable serial 0
: @) }, `" s9 {. @7 j; ?. e) N8 f; F7 K% }4 l
    memset(&uart,0,sizeof(uart));4 O1 y7 e. O$ P9 U
}+ h4 F  M& W% E4 ~% f* H
// put char3 m2 m* Q+ C8 a* v6 P: ]% n
extern char Putchar(uchar c)
+ c9 J" _1 ^0 A. T{
$ O) r* B, J* k* o" r$ e0 A# i    unsigned char head;
$ l) x3 r. n& i
" q; F8 o  G+ E' X  T& C3 X    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));/ G8 Z' F* p$ V* S
    uart_tx_buf[uart.tx.head] = c;
1 `0 o  C! G: ~/ S7 K! U  y    uart.tx.head = head;( F: M5 U3 ~5 O* [5 B

; P1 ^) x# J/ h6 i4 i' o5 Q' I    if(uart.tx.busy != 0x5a)
) h! O/ O$ s7 h' c! x2 U4 e    {. }# Q7 H$ ?/ L+ V2 f: ]. s5 H
        uart.tx.busy = 0x5a;
, n; o, j( q6 }$ }& _$ U  D        TI = 1;* |, j" L2 G0 q) N9 _
    }9 S' H4 h2 Y! D7 u: v. F
    return c;
; R1 R- ]* J$ e3 t$ L) z1 X}; W8 u' W/ K& b7 p. k: D) {
//函数 判断串口是否有数据传进来
0 f* e4 ]6 P  _9 U6 \2 i//     如果有,进行接收数据
  k9 N; N! q5 j7 p. D- Uextern uchar GetRxBufSize(void)/ l: z4 V9 w- r0 p- l
{. }2 K% A$ H# u' P* Z
    unsigned char head;( v) z5 l9 d' I# E( Y0 Q( T

$ Y5 Q$ N9 B) T5 X* p: N    head = uart.rx.head;
' X- M: ~# }: d- V9 Q    if(head < uart.rx.tail)* L& ?& x# @+ n
    {) I% q0 j3 E* ?( R: h2 h5 l
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));/ Q+ b) \8 B/ x2 k7 ]
    }else4 d- I" s8 ]2 f% P2 B
    {
  ^' G( H6 f$ [* O# _8 b. y+ X; v        return (head - uart.rx.tail);
  X3 ^# l% ~# x* k' ]+ A    }
9 F0 C4 [& O+ \5 b% u# D: T6 _}8 C" |0 \' t- C( Z" r
//函数 从串口缓冲区取数据,只取前8个字节的数据
, i2 R6 Z, s! k! W! Y+ |7 C' O% Estatic void EnterRxCmdModeByPc(unsigned char c)- E" y& Q1 @& }' O# U6 u9 P
{
$ b2 ^  j; \1 J    if(RxCmdPt < 8)' k% S- C0 L, J* Z! T
    {8 P7 q# b! c" e& Z1 ^
        RxCmdTimeOut = 10;
- n; \" @. W2 e/ h, Y6 r4 X% C1 C! x        uartGetBuf[RxCmdPt] = c;8 H6 I! r1 S$ }+ O
        if(memcmp(uartGetBuf,Updat,3)==0)8 G; c1 T; a" s! G
        {
$ i4 f. b& Y* {  ?3 R0 W            EnterIspMode();% P5 O5 X8 g7 v" }! L3 z% F+ {
        }
  K. S  x; o! J" M5 V        RxCmdPt ++;. n* G4 R9 S$ E& g: k  Q$ S6 i; L
    }2 u3 R! n: B; B/ [
}
$ W, F/ }5 M& {$ S" `//函数 取缓冲区中的数据
3 a$ T( u0 S* X* D  J+ a% _//返回
: ]3 ?% t. @7 I. @3 V/ Vextern uchar Getchar(void)
* K9 L8 H) X- W  y. n{9 E7 }3 T8 M$ b9 u" u0 p) A
    unsigned char c;# `( ~: F0 `' ]8 I
# P0 F' S+ ?: y8 d
    c = uart_rx_buf[uart.rx.tail];
8 ?" B, X" p5 u6 \  M    EnterRxCmdModeByPc(c);: l5 J# W: }/ V. B+ z* A2 N5 A
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
5 Q. D/ j) i3 d    uart.rx.timeout = 100;6 r. x' G( i% ^  B" C) G4 k
    return c;
, I( I+ y: |/ G5 \: k}' m  @6 `# ~( c' h
//
- r' B4 k- _5 aextern void UartTimer(void)using 1: B8 \3 T2 }, o! r3 J+ T
{
0 n7 P4 W7 ^. ]. O: T9 {7 R0 y8 R    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
! n( w" s$ n4 b4 F* P4 t; e: |    {
. N" q6 y8 X5 ^3 m! V1 S* V              uart.rx.error = 1;
! c1 R) [4 x# m6 b    }
' I6 s! Z4 S7 K3 R}
; `7 E* [9 Y6 f$ s0 y//
: c  {; H0 J1 rextern void ClearRxCmdPt(void)0 ]. l- j/ s& d( h
{$ y- w5 a5 r! |3 Z
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0)). k( l  M1 q6 |1 `
    {/ R+ _. h& E  n
              RxCmdPt = 0;, D" D# w; J3 _# n0 Y. V$ i
    }; `2 g2 [8 \. z6 H
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-9-20 06:28 , Processed in 0.059343 second(s), 31 queries , Gzip On.

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

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

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