找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
#include "REG51.h"     S) r' b: r: X% ]9 _
#include "intrins.h"9 Z1 n8 L3 K4 w: h2 a! ~1 j
#include <string.h>
3 M0 D2 y  ~8 g  _3 _) h3 a#include <stdio.h>6 ~0 j+ y: N! O" ]+ H* t
#include "i2c.c": n7 L. b, v$ a
#define uchar unsigned char4 C1 v1 J/ k) O1 o) p
uchar  port;5 G, M- f; P) B( g
uchar  rec_data;8 B: k3 B; n7 B) ^& w' d6 C+ C
uchar  str[6];
' D5 ^  n" h" l1 K% Z6 B: t  Ouchar  point=0;. d( A$ f6 q/ u
//串口初始化 & L, z3 _3 X; Z7 U* j
void UART_Initial()        2 t2 C/ z4 J1 ~6 |/ \; n
{
% J7 H( @% g- Y% f    SCON = 0x50; //串口方式1,允许接收
$ u, e$ F7 l6 n, L7 P        TMOD = 0x20; //定时计数器1方式2$ A8 [& d4 l7 e, e2 Z9 K/ K
        TH1 = 0xFD;        //9600 波特率 FD9 ^" e& Y. E  J$ K1 r% o. b
        TL1 = 0xFD;
  p# E% f1 J/ }, j" f% S        EA=1;       , W# @; {0 w) w1 {, T9 U- i5 v
        ES=1;      
$ A4 t  c, n* C        TR1 = 1;   
4 }; b$ ^3 [' E! y8 p* }}: P% O: ?- c/ p/ ~2 h6 l/ f
6 |* |# z( i- N  B7 J0 t" Z6 H
void waitsend()
& {/ [* o0 T, _- s{
3 ^* v& l+ E6 W5 j7 q  l' p    TI = 0;
5 A2 c0 E" P: z& j# X2 d        ES = 0;/ ]0 K8 v+ y9 o$ [+ V0 q* p
    while(!TI)
% f$ X% r  D* u& S" L    {
2 W" [+ p  [& n3 Y0 a3 O    };
4 Z% V( W# F4 v( c& i( C    TI = 0;' w& z* I% v4 f' z( _
        ES = 1;( W9 T/ @4 b3 S% l  p: `
}& C6 z% ?# N+ {( I
void delay(long i), V7 R5 }% P7 T1 B3 c* @( p5 m
{
! }* ~$ |1 A. _/ ^) _- P; F    long  j;
$ J; a( p* ~* Y) N% H) B    for(j=0;j<i;j++)
* s* r/ r$ l3 t; |% n9 n7 k    {
3 s2 E3 K% e- m        SomeNOP();+ i0 m' E. C, _! W; ]
        SomeNOP();0 S! b0 d0 x# |  W
        }& e! A3 \( a5 z2 m- [) {2 k
}
( W$ R/ M- M# o+ Q7 [0 N0 S: I7 t& m. ~0 K0 o
void delay1ms(long  i)
& o1 ?7 |6 ^; F; y8 O{
+ j0 L5 \8 m0 h! d4 P% L5 U& @    long  j;
2 \. H$ ~' i; J0 i    for(j=0;j<i;j++)
2 g6 M  r* L+ H+ D' G    {
$ a( B9 a3 b& p# k% f            delay(70);
# P$ ~1 i7 E5 T+ s+ D: {' }( n        }6 f& t  Q7 X0 e4 k$ _) e5 e
}4 k' k6 J, i* J7 G$ u
void COM_REC(void) interrupt 4 # D- c( L$ h0 E# |
{
+ h3 ?( E8 q6 c" Z# _1 \     $ T% U, c  z: U; y6 g5 d# D
    if(RI)& L6 b$ Z, v% ?/ `
    {    //清除串行接受标志位7 y' T0 k9 Q6 z8 N; P
        RI = 0;0 A1 l  r5 Q1 w" c
        rec_data = SBUF;  //从串口缓冲区取得数据/ F, k2 P+ U" |4 f' z
        if(point<=5)3 \1 u. d5 y" S; s  g2 x1 L: C3 v. g
        str[point++] = rec_data;
6 }- g0 M3 m8 J- ^) g. F; d. ~2 ]  [# m# N3 p: K/ B0 [& ]% v
    }
& ^5 y. X1 `# I5 y! T8 {# S$ z7 c! l1 M. c5 n
    if(TI)% e- }6 l( s/ s: }  M
    { : |, M% [1 v  a4 E/ w
        TI=0;4 f1 C3 [( r( ~& V* M7 G. Q5 V
    }
5 i6 ^% n: Q8 M/ b}! Z( d) g3 E( Y5 g( i8 _) c) o
void COM_SEND(void)
7 n: Q: K5 b/ {3 F4 j9 m1 f: C{
' l' O3 K# W) v" j" jfor(point=0;point<=5,TI=1;point++)             //连续发送数据
( I8 `6 q+ H( [- `0 N                                      
) R4 y) y  s4 T. e4 M   {
- m5 B# [' R7 h' R% H   SBUF=str[point]; //把缓存区的数据都发送到串口$ L0 ~4 C8 @- w) B2 @6 D# z5 h
   TI=0;
  s) g# X8 V8 q2 G  v  e2 \/ o   delay1ms(2);  I/ i' _  s. D! c
   }) X4 L0 |6 t  F
   SBUF=Read_OneByte(str[3],str[5],str[2]);, g! l) o, m" z/ w4 ]: T& L; ]4 b
   delay1ms(2);3 L' ]' d8 d( V
}& o) H1 L5 O9 H1 R2 d: I, D

( m4 i4 @, p9 A! b0 n& Y# N4 n! e6 d  A. \1 l' ]% L
void main()
5 M( O, i  o' s6 \6 y' i- n6 C+ c{( b6 C0 ~, c2 g2 C& ]* t$ |5 c
    while(1)7 e0 ?0 U' R5 M
        {% Y8 A  V8 i$ v( V
        UART_Initial();) _0 Y2 H, `% ^3 ?( T
                delay1ms(4);
  a2 A3 s7 ~3 ^! t3 M# }3 n                COM_SEND();
: j4 n  z. A, |* c7 _5 l                //point=0;- f2 E- R  O1 O4 f# I; l
                }
3 F- Z6 J6 p% q2 m}
- {) X7 _0 v5 i: a6 d$ y+ H
: m/ u" D6 N# @" e- b9 `& O8 U# B 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的 * G) h+ N$ e5 z
外围供电 把RXD TXD短一下

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45 / T* [& p- H3 |% T3 U6 l
你可以先试试看  那个串口板是不是好的
, |! `, {' B. ~; Z外围供电 把RXD TXD短一下

8 N: r; p$ c% k6 @2 N" f. W/ m板子没问题

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"
" }" x0 O; f8 @: L7 }! t& ^( T' n1 m4 a' Z* f- b& y1 F9 m, j6 j/ Q
unsigned char xdata uart_rx_buf[128];* i0 u. H: Y+ ^, [/ M) P, E
unsigned char xdata uart_tx_buf[128];
8 r, t- T$ {! T9 R; W; Lvolatile UART_T xdata uart;
/ ?, t* z; x0 ^: l7 aunsigned char xdata uartGetBuf[8];
# P3 L% W8 S! V- T2 Bunsigned char RxCmdPt,RxCmdTimeOut;
3 E4 I8 i' G6 Q
4 m, F6 C) w$ Wstatic void Serial0(void)interrupt 4 using 1( L) F4 r9 M0 B) P) i* e
{
* e6 C+ J3 K( @1 T0 x, I( k    unsigned char temp,head;
% ]& }' k9 t% t: n/ o& P4 V% t% q) R1 ^# k6 J* f2 O* N* c
    if(_testbit_(RI))
( o4 s; d/ m( D' r/ C/ c    {
) [* I; y8 W  y9 _: n( m6 U; X        temp = SBUF;
: G" m( _9 h8 u7 i% E        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
3 [" x4 U" V. S" z2 ~2 O        if(head != uart.rx.tail)1 g1 F3 l/ w: H& k  z3 k3 f# V
        {* D. c& C, m1 i$ l, w) L
            uart_rx_buf[uart.rx.head] = temp;2 j# O8 p/ Q6 ^2 z1 R: ^2 |( A% C5 o
            uart.rx.head = head;# A% M$ F. q( z/ e
        }else9 J- O3 `- A/ t' Y/ F' e' _2 }4 n
        {0 v( g3 D7 n+ m2 x% z& a
            uart.rx.error = 1;
) x- H9 q9 S! k. e        }8 S( b, |! X) a* g, @
    }
( I& F. n9 S1 m    if(_testbit_(TI))& M2 I6 b  l* G9 k  l
    {; A; H4 o' D% K8 u
        if(uart.tx.head == uart.tx.tail)& c/ H0 V& b# o+ m! U
        {
+ b3 M" I5 r. c            uart.tx.busy = 0;
! Y0 U- l/ o2 u8 H+ S        }else
. _$ ?4 P5 Z3 o/ x5 c        {) ?, z3 h5 {  G: H
            SBUF = uart_tx_buf[uart.tx.tail];9 Z; ^: W! u8 q+ Q0 u8 d
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
( V3 u4 d, Y; w7 T/ V2 f- p        }8 v& D; \$ ^- D* B; K/ @
    }: V/ X  W: U' x
}6 Q- ]8 M! `4 C, Y" ~7 D! ^" c, l
//函数  串口中断初始化
# Z( `% S/ |: v3 t  ~) I  q3 wextern void UartInit(void)
; R# m" u8 {# E4 ^& `( G1 [1 z{
9 B5 u$ m2 c. o    RCAP2L = -(XTAL/32/BaudRate_9600);# M3 b6 I2 @- r
    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
) b9 }. S6 g/ B- o% O  [' G, F; n5 Z3 z. T. Y9 |! \/ w
    T2CON = 0x34;
4 L# L. p' z% K" Q    SCON  = 0x50;; b2 |  }' y6 Z' h7 F+ D1 g* i- b
6 T5 ^* D7 y+ B' X
    IP |= 0x10;     //serial 0 high priority
9 e. X8 |$ s' C. k( D' x2 S8 ?    IE |= 0x10;     //enable serial 05 l" P2 \0 x  }' `  [
( m; F$ r- K2 n
    memset(&uart,0,sizeof(uart));
# @$ k3 s6 l5 q}, @! T) L, m6 K& ^
// put char; |+ Z' B0 f* u" m) q
extern char Putchar(uchar c)
) E- E+ U/ }0 W5 n9 A! ^3 q* Y{7 y1 o; T4 a, o5 @. T
    unsigned char head;
  I! \; P( _  o" \
" E" s8 ^- [# N$ }- f. g    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
+ k. G* \8 T- S. v! `# F, N1 H    uart_tx_buf[uart.tx.head] = c;
5 i# h  k) U  u    uart.tx.head = head;
9 R8 x3 }. Q7 y0 H6 i4 M/ C" r/ `, r! C0 |" z
    if(uart.tx.busy != 0x5a)
& \0 T* x' o4 q    {
$ l6 e; W5 o& v" n; y9 Y2 z, q        uart.tx.busy = 0x5a;, ~7 \  Q, E7 I1 m' t: k
        TI = 1;2 k2 b3 r& v& Z% z; g5 l
    }
. Z7 e8 Q% @' `8 j$ w! Q9 s    return c;
' ?; c& {; |0 H9 V) T) u/ _}
5 w7 }3 Z- z- q+ Y8 J0 u3 M! I& X//函数 判断串口是否有数据传进来
/ Z3 X1 d) v, A8 l9 Y//     如果有,进行接收数据2 o  B9 t7 B! z- t8 t3 n: j
extern uchar GetRxBufSize(void)  }7 @( F/ j; Z. z$ r# E4 a
{
! j. L- L7 n1 `" a+ W$ @) [    unsigned char head;+ _: S! N: V( [; V& j
  z! y  q  Z9 U+ ]. u
    head = uart.rx.head;
9 A6 K$ V0 c, x% n) P% `    if(head < uart.rx.tail)
; a& j. U6 c1 F    {
& W, x% d8 _$ l* e        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
0 X4 U$ H2 y1 n, L    }else
7 H) O0 a# e$ Q( P) B    {3 e) s4 ^. W( Q. [6 Y- ]: {
        return (head - uart.rx.tail);
# N8 O/ i" Q( O4 {8 V    }
5 |+ y9 ?; [: b, b2 }5 _* r6 f}3 k4 o5 [: n8 C$ L9 X0 X: D8 u: R+ {
//函数 从串口缓冲区取数据,只取前8个字节的数据
3 _9 k( c: m, {! B$ H: Astatic void EnterRxCmdModeByPc(unsigned char c)4 F# [- |7 F' j1 b7 l, [1 I7 A
{
% a8 C; l% a: C* h2 ?    if(RxCmdPt < 8)
! u8 X2 \1 T5 H, W4 q6 k    {% }7 ~/ g" y( E: x( i
        RxCmdTimeOut = 10;- O2 I1 K8 q0 d
        uartGetBuf[RxCmdPt] = c;
% y8 v* D3 }9 Y5 L        if(memcmp(uartGetBuf,Updat,3)==0)
/ ^2 h/ ^$ N+ }& Z5 l/ ^        {
% g  |- U- f# o$ A' K  G            EnterIspMode();
& c9 }5 S% t5 H) D' D        }
7 m. J/ o/ s1 D# a" {        RxCmdPt ++;/ a1 j6 ~1 \+ K/ |) b( F$ @
    }1 O7 R, b0 `+ i) k6 V! h( N: v
}
" C- P1 i: A  L4 Z- R% p6 D//函数 取缓冲区中的数据
& f5 A. y9 F/ E- Z//返回
' |2 L( ~- i7 @6 w3 n6 `extern uchar Getchar(void)- M/ o# I- i! L# r7 s" q6 [4 M) u/ A
{" K& ?* m' @7 t3 J+ R* S( d  m
    unsigned char c;
; g8 L5 q; o' N) E
( t5 h' h% d" u2 g( O6 z5 W/ ~    c = uart_rx_buf[uart.rx.tail];: O- s, @, C# x" P' ?
    EnterRxCmdModeByPc(c);
2 E2 {" Q+ y+ }! D5 Z1 i    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));2 l" z# A6 y+ Q# t! C
    uart.rx.timeout = 100;6 z4 n5 e0 S2 W9 b
    return c;# Y* h/ A) R7 L5 e) y+ o3 K
}: g8 R/ m! X' y5 m: O3 D% C0 T
//
, V; @  ~  z* F: vextern void UartTimer(void)using 1
( V% O4 |2 p- K2 c{
: g% Q4 v- y: A! A    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))! d. z# G" I1 O* ]0 X  J
    {% t. J& |0 c$ }- P7 q1 m
              uart.rx.error = 1;
; I# Z# Y% Q: k  n8 c! k. B& S    }
5 M% x4 F% ]6 z8 g}! d' q) i8 Y; C6 q
//0 j4 V( `. ?" [! k9 ^+ D7 P6 F( O& Q
extern void ClearRxCmdPt(void)
; M5 n+ R& l7 U. x/ [{
- \8 l/ P/ q; m& M- ]+ `    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
) U9 c# `( H0 |$ a3 |* [  k    {
: h' x& q0 D6 c8 H- P% m              RxCmdPt = 0;  z: O! T  B6 x7 r  N. y$ t
    }- n& {, u/ I) M0 X5 a+ I
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-10 10:47 , Processed in 0.063397 second(s), 31 queries , Gzip On.

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

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

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