找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
#include "REG51.h"   3 m4 E# |8 I6 J6 g7 o1 C
#include "intrins.h"' z/ E( e1 J0 P8 f! C3 v
#include <string.h>3 y  E( s" Q( \  V& `) }
#include <stdio.h>" S7 b3 {1 j( }+ y
#include "i2c.c"
, f. ?3 t6 {$ o% N" e#define uchar unsigned char
; Z) {8 g( E$ Q: L2 J: u' Fuchar  port;$ _, G9 T# v" q* Y+ o7 r; Q, k- a
uchar  rec_data;1 z9 W$ Z2 u8 ?
uchar  str[6];% K: q& ~. ?% m$ k+ C# h
uchar  point=0;
6 U; L& x1 e' m5 q' @//串口初始化
- H& o4 t( j# G: ivoid UART_Initial()        2 N/ n6 ]0 X! C3 p+ Z  ?0 E
{
( w( G7 }/ W0 k) A! |8 V& e    SCON = 0x50; //串口方式1,允许接收* y2 ^) o6 y- z) w+ i
        TMOD = 0x20; //定时计数器1方式2; s6 [: G, B) U: C" p/ ~; t
        TH1 = 0xFD;        //9600 波特率 FD
2 v6 s1 o+ `: z# C        TL1 = 0xFD;" o  t) u. c2 g% q% v
        EA=1;       4 _& y( X2 [# N
        ES=1;      
; f) ^, R- X# B9 X) Y( v        TR1 = 1;   
( q; G" s- _/ M" ]7 p}- h1 t3 ^+ L9 }  q, R* d" y; u9 B

1 N9 ?& A% u2 Q  [: B! B, P  o$ n+ Svoid waitsend()' V' o' S# p- {& g3 U! Y$ C; a
{3 \) U5 w/ l4 Q
    TI = 0; 0 u8 p. _4 a) X, I
        ES = 0;
! t+ U+ }0 P3 @- r3 S    while(!TI)
# J- `6 v$ t$ k$ `    {
, K0 {1 S- |. r. R: N; t    };
, ?- \$ x3 v2 s4 d6 s    TI = 0;  W1 p9 \& [- M5 j! `  |% o
        ES = 1;
6 o$ ~7 w& x  r1 k, L}
1 V% d3 A. B/ J( Jvoid delay(long i)7 t6 Z. g+ j& w4 U- n1 H
{( U3 D% z% Y' l, |8 T
    long  j;4 h. j( Z1 a1 ?1 _
    for(j=0;j<i;j++)
$ L8 E' e4 `) a: g0 y    {. _# G* T, B) ~0 c
        SomeNOP();- Z; g9 L/ s9 ?* O' G* ^
        SomeNOP();7 \2 e4 g% W5 |4 n3 P# T
        }
) @- w3 ?5 ^3 o; w, A: H}
2 w; ]! W+ ~4 W5 k9 m: v! I1 i* C) @+ i' c
void delay1ms(long  i)  q1 m+ Z- e. P# X6 A* V& B! p
{% a) x9 |" f* m0 \
    long  j;
  S* p! s. e0 Q# t; D% x    for(j=0;j<i;j++)
  `6 T5 J4 H6 P$ @: k    {
) n, J7 J$ D$ X            delay(70);" e$ J; i& s6 j+ B4 k
        }
" b& n2 |$ D& o! e2 s/ r}, B  M3 X+ Q' e
void COM_REC(void) interrupt 4
2 K* c3 t4 x) A6 \2 [: ], V{
+ q4 P8 E6 u# q4 o     - t% r  W2 m9 r, H* F
    if(RI)+ B8 X8 h. F5 C+ e- X' l2 p5 u6 I( O
    {    //清除串行接受标志位4 N# R5 [1 F  J0 e3 J1 j) I
        RI = 0;
" g# q# p2 ]& y        rec_data = SBUF;  //从串口缓冲区取得数据
. \) \! n" E8 d9 i1 U6 W; L- d- o        if(point<=5)5 `" I. p/ o0 _
        str[point++] = rec_data;4 u1 S: F0 N7 A

9 b/ c4 ?! `- {$ S    }9 a. I+ Z2 `9 q8 R. e! s0 Y8 ^

9 @5 K$ ?* Y4 U! f: W3 f! o6 ?# ]    if(TI)
$ m7 [' ~$ U- k: I$ v    { . |- y2 a4 ~. k. Q( Z2 W$ ^, P
        TI=0;* q; E+ J  H" D1 ^
    }/ K8 @: o1 j4 b8 y6 d' d
}) ^5 A" D, F% k% E
void COM_SEND(void)$ q6 b# c" U- c( t8 U1 A5 b5 ~/ c
{8 G$ h. `9 |, N6 ^, Z
for(point=0;point<=5,TI=1;point++)             //连续发送数据9 b, Q, E& ^9 h# V1 g5 @7 Y2 f
                                      7 v  R) \! Y1 g5 S: G- J
   {
9 e# f, e2 L6 \  [, w7 o# o   SBUF=str[point]; //把缓存区的数据都发送到串口
) ?; o4 `, c1 M! F3 \' U   TI=0;+ W# G, z* s5 U. J
   delay1ms(2);
# @) K3 L9 E! \* V2 Z9 r   }$ q' W& R' K2 r0 Q" t4 D6 N
   SBUF=Read_OneByte(str[3],str[5],str[2]);
% i& n: L" ?7 d" C6 v   delay1ms(2);
2 ^* C& k8 G# W: n) I, R+ [0 q% Y}
1 s6 a+ @: `+ ?+ X: T" g
# b5 ~$ t0 e8 t' h/ W
' r+ T: u' U: i8 Y! y* Y; D& vvoid main()
$ g5 U7 k$ K, d% p( s{
& L  Q4 A5 y) d6 e    while(1)! [' a& h; d/ J* s/ j5 [' i- s
        {
$ H9 y2 Q! i6 i$ @        UART_Initial();
; q, _2 C3 f! X3 l5 d" _6 T                delay1ms(4);' B6 V! {1 s" h# ^! ]) N* Q
                COM_SEND();
& r4 l4 F0 u6 I) X, X7 D                //point=0;" [! f. {, {( q) D
                }0 }( B* F1 [2 L# N4 P
}
2 `5 P" L4 K0 h4 Y
& c8 o% u0 ?& `& k* ^# x- v1 @1 n 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"5 J1 e3 R* l& w2 ~
: |* m, [7 e6 {0 B) `5 z
unsigned char xdata uart_rx_buf[128];
% e9 S" N1 ^) B3 C# q9 Y2 Y7 yunsigned char xdata uart_tx_buf[128];3 A/ u6 I) i& ~- u
volatile UART_T xdata uart;
1 Z9 v; T! h6 k' D' M5 t; ~: S& bunsigned char xdata uartGetBuf[8];! o3 T: _9 }1 G1 d* l$ x
unsigned char RxCmdPt,RxCmdTimeOut;# g& E3 B  v- S" X

6 H3 H" N7 A5 I( |- _7 e" v/ G2 gstatic void Serial0(void)interrupt 4 using 1
) M- O0 }3 P  o{: N5 s' j+ u: r5 a$ b
    unsigned char temp,head;+ Y1 G& r1 ^  l- Y! a+ w* y

* ^' ]( a/ @- I) W8 s) w# n( F    if(_testbit_(RI))
# t7 G6 q! E- K7 I5 Q    {
+ Y% Z! s1 t( R7 F( R        temp = SBUF;
, p3 T2 G9 J  _: N        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
* L1 S+ w$ k- d        if(head != uart.rx.tail)
. Q0 A) T- b: a7 U        {3 ^+ z8 x5 e$ M  C
            uart_rx_buf[uart.rx.head] = temp;
+ R5 S7 V/ H' Q6 L5 G% ^            uart.rx.head = head;
+ w* D- @; c+ j2 U8 G        }else
4 o9 n& x# Z% s0 l; R: @5 r" m2 A        {0 l  ~- `3 L' C/ L0 u
            uart.rx.error = 1;
6 D' b1 u4 y$ Y+ I6 ]        }3 u, S4 p0 b# D& Y5 S
    }, B7 Z$ Z( |# S: k, }* Z5 @
    if(_testbit_(TI))
) U% j' s0 c6 Y% n    {/ j2 k" f+ |. g+ D% X& O6 N
        if(uart.tx.head == uart.tx.tail)4 m9 _# W# h9 F2 ]6 Q
        {
) Q3 N& D- F. n6 ~$ F            uart.tx.busy = 0;
( m" y& k) S- Y7 F) {        }else
. T4 W" i% v* N5 K$ F+ J% q        {& L; U$ Z  z2 a3 p( U5 [# T
            SBUF = uart_tx_buf[uart.tx.tail];+ H! N% J! c5 }
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));1 k7 F5 G  k1 V, a4 O
        }
! d( o! e: [/ i- _$ N    }
3 Z, s# e9 h5 l2 G7 m; t}. C" M2 h5 H$ ?. `- }
//函数  串口中断初始化( |$ g' }6 Q  g. C8 p! k
extern void UartInit(void)7 b" z# `" U) I3 O" [: u: s1 E, D( M
{
% m$ y' m0 N0 ^2 M    RCAP2L = -(XTAL/32/BaudRate_9600);& F3 I  m% W+ X
    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;& Z7 n# k8 L5 K4 T0 t9 K

# o2 K. W* ^9 u- w3 ~* P0 T    T2CON = 0x34;
% {6 S7 C' T5 s& G7 w( Z) e+ s    SCON  = 0x50;; Q, u: L4 z( d5 D5 `
$ A/ j# @' F' ^2 f2 W
    IP |= 0x10;     //serial 0 high priority
, @  C2 K& D, N2 f% @( y8 Y    IE |= 0x10;     //enable serial 0, T; l& ]5 j+ D$ z6 `+ u, o

& U: q5 s+ p, z7 o( v    memset(&uart,0,sizeof(uart));
3 B$ R  i4 B  p) ?5 a# R}
+ S+ A  W: s8 m4 t8 q- N; I* V// put char/ C6 f' w+ `& W! G5 B; ~
extern char Putchar(uchar c)9 y0 d( f2 c8 L5 y7 K3 Q: ^
{
" j1 X+ e) m$ f2 w/ B    unsigned char head;
& ?- m; j4 q7 f6 ?% }- V+ w$ e) P9 J0 U+ r6 ^8 q/ k
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));% l4 I7 \; `! U
    uart_tx_buf[uart.tx.head] = c;
$ n6 _/ L* I% K, ~: ^  b# b    uart.tx.head = head;
0 V) K" W: _4 ?" E8 D+ n% t1 ]+ i* J5 M
    if(uart.tx.busy != 0x5a)
; U9 h% v7 @1 s    {
+ d. w# F$ \' o, G0 _        uart.tx.busy = 0x5a;
, g$ Z+ b' ]" @5 |; ?        TI = 1;
3 d4 ?' c' t$ V. x# O    }
2 c' f, \6 H, A% `    return c;
1 Z1 _: @6 D1 V6 L}
' \$ c; N' D& v# \, O//函数 判断串口是否有数据传进来
5 |2 [, }4 V/ C  u+ X//     如果有,进行接收数据
+ {6 {% Z" A, ]) U; b- J) Cextern uchar GetRxBufSize(void)
5 _# l+ b* s) ^/ b{
$ e+ |& }& U  T9 S0 U    unsigned char head;7 V. |, N: D! r- C( V5 M3 t

- n# L1 h$ Q5 `$ f( r$ e3 I; D    head = uart.rx.head;
3 B" {6 }# s- u& l/ l  O    if(head < uart.rx.tail)/ D( ]! W: ?4 y3 I& @  F6 o' u
    {9 R) `4 U  w( ^& q
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));6 [  m3 T  ^# s: H! ~+ Z+ S
    }else+ M" e9 `& v( ]' Z3 H. n
    {
1 L- V8 E% x8 X3 u* Z4 t( O$ M        return (head - uart.rx.tail);; b$ z6 g! Q; U5 H. @; l, }! U
    }' s0 [) v4 L7 B1 N3 J: X' J
}
! C: V, f3 ?: K& O1 c//函数 从串口缓冲区取数据,只取前8个字节的数据" F+ B2 C2 j1 H6 a0 |# e
static void EnterRxCmdModeByPc(unsigned char c)2 m* D3 t9 e+ }8 G+ s1 q  [9 b
{# i  X( K0 O' ~* k0 H+ R
    if(RxCmdPt < 8)
: d2 O- ~7 M8 V& v    {, ]- z/ H* }' G1 A4 V% c+ x* K
        RxCmdTimeOut = 10;; h; L" k4 {) y1 L) y4 {9 O
        uartGetBuf[RxCmdPt] = c;9 H* d. [3 [  q5 x( A
        if(memcmp(uartGetBuf,Updat,3)==0)
% I* G. |$ ?+ s3 a* g        {3 f7 N9 o+ H# q8 s. G0 m
            EnterIspMode();
2 p! o3 d9 u( [3 a; I3 r$ C; W        }
2 ]- N  M; U' g! d4 N$ |  G* b2 m/ n        RxCmdPt ++;4 Y3 @9 C. d6 a6 D- f
    }
  K" c$ D- B1 L3 O. `# [}: I8 u6 u7 u9 d+ a# v$ C0 d
//函数 取缓冲区中的数据
3 A% \& U3 N  q7 @4 i- a$ W" `" N//返回4 O* [5 @" T& g* c" n* I
extern uchar Getchar(void)
% m7 |( A- v8 s  [{0 [: R% t* G( I& |) i! H2 t& F  o5 U
    unsigned char c;
/ M7 Q  B( a& ^/ P) M% S8 I# b* [: M+ N. k! @# `) y! x, m$ k. F5 Z
    c = uart_rx_buf[uart.rx.tail];3 }0 j: O0 T8 K0 l; u) i! D' D# T
    EnterRxCmdModeByPc(c);% ^1 W( w) N6 _3 \% a5 |! ?
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));
$ [$ u6 ~9 |% B7 {2 a+ V1 E; T4 a    uart.rx.timeout = 100;7 ^, c3 G6 E. z& p  V0 U
    return c;
7 M: `% N. E; _) T/ \}4 B8 b5 n. d5 d
//
% h( `; h) C+ @4 H* K& jextern void UartTimer(void)using 1  F+ s: E6 W! x3 c
{
# W! R) y( u! Y; G" v  M    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))# e+ F$ {, M: S) ~# S# t3 N4 Y& D
    {
- {+ y9 E! h' A3 ?9 F% ^              uart.rx.error = 1;
! C& Y& ?7 r: L, h( ?    }1 `+ F/ ?4 ?- o. h5 X6 ?8 {: r7 \7 ]
}
& S8 C9 F2 p, H( U//, n: S1 K: c/ a4 f: I! `
extern void ClearRxCmdPt(void); r- r$ g$ t4 m' W
{# n1 I- Z  m' l  [- C1 p
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
; h( {9 i' ~4 j6 S* t    {
) O2 f2 c; \4 F& V% `              RxCmdPt = 0;
2 A1 `2 O0 K3 f( U& j& S4 I    }, P. G8 I0 ?$ s& i+ l3 m
}

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45 4 {8 H* G. a; z: |* o3 Q, ^4 _
你可以先试试看  那个串口板是不是好的
6 P( z7 P) ^7 U9 A. E外围供电 把RXD TXD短一下
1 @8 \, v7 d0 [* R; m3 x+ U1 s" d
板子没问题

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的
7 N5 a  h4 u+ ^9 y5 k+ _9 l8 a外围供电 把RXD TXD短一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-20 05:34 , Processed in 0.081567 second(s), 32 queries , Gzip On.

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

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

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