找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
#include "REG51.h"   ' A8 K. Y/ G: C1 a5 p. u- W/ s
#include "intrins.h"+ m1 y! M6 h, N
#include <string.h>, d' C" |+ v+ ]& o9 b8 I
#include <stdio.h>
7 c) R; l$ G# D3 o$ N' S#include "i2c.c"
8 B' B; \/ h4 @/ s#define uchar unsigned char
# C% b* ^" F( `& t- f8 s, xuchar  port;
( e5 S6 `; U* c/ Q1 B4 Uuchar  rec_data;3 U& e; a# V/ Z3 a3 U& I& B1 M
uchar  str[6];
- @3 T+ R  U/ _  V* kuchar  point=0;
) @+ V4 N+ X2 Q7 M: @( e9 Z5 U( w//串口初始化 ) H. L1 t' d' K' X
void UART_Initial()        ! c( w2 P- D3 [6 ]; K- h$ a8 ^/ s! ^
{
8 A* ?; F$ w$ v8 T! d$ ]0 K7 k; z7 g    SCON = 0x50; //串口方式1,允许接收
8 ^; u1 K# g2 ^* L; B; l% i        TMOD = 0x20; //定时计数器1方式2
2 E  X6 G% ?& p% H) H        TH1 = 0xFD;        //9600 波特率 FD
2 _% r( r: Q8 ~! b1 Q% D        TL1 = 0xFD;& }& l( V& q4 u; j7 y; V0 b
        EA=1;       7 ^3 S& ^4 Z. i. D: @# U, S6 J' \
        ES=1;       ! U/ _+ E' A$ m
        TR1 = 1;    + k: y; \& K3 N" S
}
+ W7 c! q. B" t
% d6 c; C1 i- g4 e9 v; ivoid waitsend(), ?% X- v* z2 T; O. R
{
8 s$ Z) K; W- Y2 }/ K* X# ?    TI = 0;
  H; P7 x4 c2 X' `9 R- G4 b% P+ D$ U9 A        ES = 0;8 C6 v# j6 ?2 j5 j9 g' E" n
    while(!TI)
2 l8 Y& E' `8 O' S    {
& O0 M$ s' a+ i/ P* ]    };
+ a: T( N8 B$ @/ W  P0 i8 C    TI = 0;/ @) O: p! u- d
        ES = 1;
* e+ Q0 f( u& I/ W! `* _}
) H# t* g, P6 F) d+ z  o: {0 i' vvoid delay(long i)
3 z2 ^( k+ G- X{( W; B9 Z. }" d5 U4 A5 v
    long  j;, C* I2 @8 Q; x$ j% h" m
    for(j=0;j<i;j++)
  b5 u% I0 y" X    {/ ?+ T. b5 g# L' K
        SomeNOP();
1 D# L- I* w8 J6 g( ^9 f9 K! v  E        SomeNOP();5 ]9 y0 z+ x3 ]& z4 o! \
        }6 N. o' i; f, E7 T& Z+ l
}
6 R  W+ N* D9 T# z5 T* ?. p  ?* n6 u# R' u& P  f' T
void delay1ms(long  i)$ [! T: ?* Z% q) [% F+ H
{
# Y* `+ o, m% C/ M. D    long  j;# I# m  `) a7 I5 S4 m, y
    for(j=0;j<i;j++)1 k! L6 r, Y, }
    {* y( g2 P+ _) ]
            delay(70);
. L' K+ [* f& N+ _        }% e4 u, j+ e9 W6 G) c! D
}
5 O7 Z2 H" Y- O8 ]9 V" R; ivoid COM_REC(void) interrupt 4
$ r' h& r' b% v) B{
* \) S+ `' I8 W     2 V4 S) a$ \# W: ^& \; i
    if(RI)
+ S. ]0 J) K$ C1 r/ G  M    {    //清除串行接受标志位
' x& Q% q1 _0 u: ?        RI = 0;
  u& B3 E0 L2 _2 p  G1 S- Y/ E0 A        rec_data = SBUF;  //从串口缓冲区取得数据. O3 P: [+ p( D4 X+ Q' ^$ u# N
        if(point<=5)
2 H* F  p# \, E8 C        str[point++] = rec_data;# @9 i7 x& Q0 d) _1 ?8 o
+ |, H6 ~& Y) K  `) O: M7 Y+ ]
    }; k+ v9 }- E8 q- m/ l1 O
( C# U0 B5 I* a0 o  T1 O
    if(TI)
' z) y1 Z! D* w  b. b: D    { 0 l3 K& I, q/ Y* V- P# c
        TI=0;
& `" Z/ S! y% L% s) H$ f    }
" |1 l2 S6 i* k7 I! g& u  M}/ v; c3 E1 S4 ^9 d, @7 ~8 n/ [
void COM_SEND(void)
& w4 V5 s% C2 F{
& P0 X/ e+ ?# V: I3 g+ Ffor(point=0;point<=5,TI=1;point++)             //连续发送数据0 o4 K! g- s& y2 R' B1 o- H
                                      ! g+ Q- ]4 ~( `- B) Y
   {
( ]/ X5 m3 I, }   SBUF=str[point]; //把缓存区的数据都发送到串口
7 X' B8 P- A% S3 }; a2 v/ I, u   TI=0;
9 J! d; s& y- w6 F9 ^: y  J5 G5 ~   delay1ms(2);) C* N6 S9 p. }2 L: n# X
   }
: `, F; @) j2 j. _& \   SBUF=Read_OneByte(str[3],str[5],str[2]);
7 f, P0 i6 [4 P9 A   delay1ms(2);
6 C5 x! D: j5 x$ s. I}5 X- ^" s+ ]7 @+ D/ v

% C% P2 P+ y7 n, j* V# ?
  r% o" P0 f* {' X/ c, Nvoid main(); _1 m. n+ y/ X( I
{
0 J- j# n1 U$ s2 _' y- J# j    while(1)
% y* x8 Y% }# Z# B        {
  K; J# k3 p) q' u        UART_Initial();
5 H, k. }( K( y- P$ S                delay1ms(4);% Y% @5 y6 ]0 O! u
                COM_SEND();
* g+ l7 K0 i. {9 t4 u                //point=0;
1 i9 L. o4 [( l) M                }
$ S( J' k! V8 o7 d3 U( P2 [* `$ U3 `}5 D- h. N  }2 E, K% d

9 f) m) M& s# g 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的
( z- G- C, a0 O+ M. R4 X& I) h外围供电 把RXD TXD短一下

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45
: Y' @/ A9 R0 t2 A/ _, d你可以先试试看  那个串口板是不是好的
& E$ @  J- n: y2 N外围供电 把RXD TXD短一下
! L3 f9 ^8 H3 m- O$ f
板子没问题

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"& i) L% \* {: ?1 H
4 W* ]+ q0 N, v
unsigned char xdata uart_rx_buf[128];+ w5 W4 B) i0 }' y
unsigned char xdata uart_tx_buf[128];
: Z/ K2 J, _# Z, Cvolatile UART_T xdata uart;. P# R$ n; }: ~, r7 {
unsigned char xdata uartGetBuf[8];# M1 D6 o2 u0 e7 e& h
unsigned char RxCmdPt,RxCmdTimeOut;" y" n: S. Z# x9 t& T3 @
, l$ B. E( ?0 S" h; K
static void Serial0(void)interrupt 4 using 1
- q  G" ?" j# o{2 d& J% m9 g8 e$ x$ V; `% N% B
    unsigned char temp,head;
2 j3 D. K$ m0 }. S- k  o, r$ j! H3 ^/ f2 |- ]; p" U. d: l
    if(_testbit_(RI)); p& d- P" k4 B" G, h  b
    {
8 P4 W2 |9 ^, u" Q; s        temp = SBUF;" l* W- Y2 Z. r$ w3 V9 ^
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));8 e* N& g- z6 N% O8 @; d
        if(head != uart.rx.tail)
2 `% r2 B2 Y) Y: i  x- }6 X        {7 e4 N; o0 I( p& K' h7 O  i
            uart_rx_buf[uart.rx.head] = temp;
) o& Z* `0 _" }% a% ~9 N            uart.rx.head = head;
; x1 }4 K: u# h. e        }else
: h& T5 J0 L9 }2 M        {2 {# Z8 s& |+ h+ k* c0 U& L
            uart.rx.error = 1;
# g$ j/ T6 m. W        }5 V" e) r- ]+ f( I% U2 {
    }9 x! _" J: m/ H
    if(_testbit_(TI))5 D& a6 G) h3 y- C# C
    {& Q9 [4 n' Z4 O' ~1 k
        if(uart.tx.head == uart.tx.tail)
9 L4 a& G  V7 u% N0 r8 a: |+ [2 v        {8 n2 T6 M% l2 ~# h; B* c
            uart.tx.busy = 0;
! r- ^+ ]) \  [! E( N7 A. C        }else
. P2 S" q  B# Z7 f        {
: A  I, ~% P$ `/ y; E            SBUF = uart_tx_buf[uart.tx.tail];, @. c$ J% S1 y) I" U; |1 N) y
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));# R3 H5 [5 @$ _% H
        }# d* W5 [( X: V. w5 m
    }
$ m) Q6 P; b3 K6 K; j" ]6 s}4 |) M$ B& I+ K
//函数  串口中断初始化, X4 X3 V3 Z3 ]
extern void UartInit(void)
2 H$ H( T' p+ a8 a. h' G  q{% F9 O6 _! I' v  }( L: U; g, n
    RCAP2L = -(XTAL/32/BaudRate_9600);
9 s) K  c) s+ G9 ?$ p6 h0 e    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
/ l/ @3 b6 g0 q
7 A/ T+ C; ^1 P+ u& y    T2CON = 0x34;$ J. K) _7 C, d
    SCON  = 0x50;
" I; U1 n# z7 [3 n" |- a; [2 {  N& b. L) {
    IP |= 0x10;     //serial 0 high priority
! W( G3 Z( b0 b  I) f9 y3 f/ f    IE |= 0x10;     //enable serial 0
+ B8 y" y  q) Y3 Y( {: Q1 ?* p3 ^7 ?" ?5 p2 o. `& }
    memset(&uart,0,sizeof(uart));# j# o6 Y, ^6 n5 ~7 {
}
. L( j7 D( {% z* u// put char
- ~5 I( q5 m- N1 T4 W, c& Fextern char Putchar(uchar c)
  X8 `+ ], m0 o{
% e/ C" t" O2 w    unsigned char head;
/ I  ?; h, s3 ]/ c, N, c6 F( Z2 d, z% o
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));* z1 q* S6 N5 n6 B8 Z7 k$ s
    uart_tx_buf[uart.tx.head] = c;2 t5 ^# o$ h' z# Q
    uart.tx.head = head;; G4 O$ F) m$ ~8 L$ L, G
! Y5 T7 t6 o2 h6 W. L: b
    if(uart.tx.busy != 0x5a)" O5 q2 L2 g6 n" @: q- R! I
    {
# e" Z# m; t( i5 x. n        uart.tx.busy = 0x5a;
* f! e; u, d- E( K* @1 b        TI = 1;
% ?( ~) r% i. g1 T6 `    }
8 r7 G* D" W& Y' l( b' M% V+ |5 L) S    return c;9 m0 p) T0 L6 l. n1 i* s: o
}
* d7 ?4 q8 J0 L) {+ \, I7 z1 h//函数 判断串口是否有数据传进来
1 _" y5 t) S2 x0 ]//     如果有,进行接收数据
  K1 I* B/ ]4 N+ N8 I% Dextern uchar GetRxBufSize(void)
% |/ x- k% @/ y) c+ b. X: c; C{3 H: O, q$ P9 Z8 U
    unsigned char head;) u  M% m) m' L' V
# t, O$ k0 K# Y  Z8 `; ~' ?# k
    head = uart.rx.head;
/ W' I: w" T% n+ y" y! R3 j    if(head < uart.rx.tail)
- B) [, N+ B) \9 w5 [    {
+ F- d$ d  L5 H4 p        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));  r8 F' }' L6 M9 M9 \) A/ z3 v
    }else
2 M% u( `' z: J; H4 J    {1 T& O" _  r$ k3 p1 H
        return (head - uart.rx.tail);2 b3 F2 N- h! i% V
    }" e" [' A  O" B4 `9 H% x. \
}0 {/ d1 z. P, P
//函数 从串口缓冲区取数据,只取前8个字节的数据
( W5 o/ j* t9 ystatic void EnterRxCmdModeByPc(unsigned char c)
( P  x* [$ c4 ]2 ^* P4 @{
+ H+ v% p" x1 o: ]    if(RxCmdPt < 8), z; M( ~: j8 G+ \8 _
    {8 j) j2 i3 J( q' J9 ]
        RxCmdTimeOut = 10;
- f' }  M3 ~) @- _        uartGetBuf[RxCmdPt] = c;. l0 m) K3 `. {# @7 g5 Z5 C
        if(memcmp(uartGetBuf,Updat,3)==0)
  j: z6 A* R4 x& e' g( J7 Z3 H        {
0 Z# R& h) |3 G  ?' `5 S            EnterIspMode();( E% y& j- g5 x/ k
        }4 Y1 O- R/ C, a5 c& J9 {
        RxCmdPt ++;" `6 O- ?& `& P% A. L
    }6 y# p# ?1 n/ t& I$ [$ [4 A3 w4 P
}
) n+ F+ Q- k" j2 _1 d+ w//函数 取缓冲区中的数据
2 Q- i- k# H% q8 {//返回
1 U8 ^& p1 ~; c& M& Zextern uchar Getchar(void)
6 p# C; h( |8 Q- y{
. N7 M% B5 L% b+ G9 [! }" l: U    unsigned char c;
0 ]) Y! C" d3 j
0 T% Y# I5 e. r4 L8 |: t    c = uart_rx_buf[uart.rx.tail];
* J1 d3 N9 v- Y' _    EnterRxCmdModeByPc(c);
5 G* g$ Q7 p* S4 M$ q    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));  \; g8 W/ e. j! |; ~
    uart.rx.timeout = 100;  W( Y4 k9 Q: q6 j
    return c;
6 p$ o! ~! `1 m  {9 n. Q8 Q6 Q}
' e' [3 d. D7 V) S/ T//5 G6 V3 q5 Y* Y/ G  y3 U
extern void UartTimer(void)using 1
+ T' n7 @7 p  g. q7 T{
. s7 f! \/ E  j; z. z" ]2 k    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))* E: y5 Q6 M4 M) n8 K; z- Q
    {
8 P* b  @5 U5 M8 Z( K: T: S              uart.rx.error = 1;6 n5 U1 M$ j# i5 Y# x6 z$ x
    }
+ ?! J& p% S& j' q* S4 R  @}
% z5 ^* N3 [' I, x/ a//
- e' y" X( A0 O. m! sextern void ClearRxCmdPt(void)
4 n! a2 I8 B9 a{+ ^$ P# Z0 ?6 K1 \
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))3 L* g7 t; W8 l
    {
3 v, G: C9 f  n" ^0 L, |  b# N- _              RxCmdPt = 0;
. u( z) k% D  h0 x! f    }' i2 x8 u4 {! C, l7 _5 D: a
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-20 00:51 , Processed in 0.074477 second(s), 31 queries , Gzip On.

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

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

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