找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
#include "REG51.h"   
5 b  g5 N" x9 @) Q5 I1 {! q. x#include "intrins.h"
/ k+ `- w( X- k9 A8 {#include <string.h>
& w& V! o; q: Z( [) q, H  V: j#include <stdio.h>+ g7 U; d) J. y  Y& t2 a
#include "i2c.c"
# B4 @# f- d! `#define uchar unsigned char3 S3 b" E0 ~, ?! |' m
uchar  port;
+ z8 l' C* X$ ^8 puchar  rec_data;( X5 }. l# d2 j9 h, O6 t# ^! m( c
uchar  str[6];
5 F# F# {" B2 b4 q3 e+ ^uchar  point=0;
6 I# Q, F) k0 }5 \% N. q9 T//串口初始化 4 o+ |$ }  ~- U7 p/ K, @
void UART_Initial()       
* Z+ L* u5 E7 o5 N. D7 C* m{ % Q/ `1 z: x# \2 D
    SCON = 0x50; //串口方式1,允许接收
. f2 A) `- R5 g0 @; n        TMOD = 0x20; //定时计数器1方式20 L8 R7 Z% n$ \" k
        TH1 = 0xFD;        //9600 波特率 FD1 M% N4 h8 |  V* }0 j/ E
        TL1 = 0xFD;& L! z0 m6 O, x2 p" \. l
        EA=1;       % `2 k! C) [9 E' `6 `; F. W8 d+ Z
        ES=1;       # v$ ?+ i4 B% w: ?1 p7 L* P
        TR1 = 1;    , c9 g( m2 n! T
}  T, o% I' G! x2 T
  ~$ T3 f+ i# E
void waitsend()
8 N! R/ M3 M8 |9 i0 V{5 y# h# O  w+ P: K) y* r! l
    TI = 0;
6 J7 S' f% S* c' S        ES = 0;! ^/ l' {3 K, x( W
    while(!TI)
/ U% ~8 A6 d* q4 \! j# `    {
* T8 N& ^* }8 K5 m: K    };4 y' O+ p1 ~, d4 f% ~& e
    TI = 0;
( I8 I4 v' H- n+ _0 @( ^        ES = 1;/ R# ]5 v2 v2 L0 t1 G; z- ^
}2 u7 f! v  f* A: g
void delay(long i)
( ^% b3 e, R/ E/ I4 h{! X+ x: |; A7 G! |' d) |
    long  j;
; e5 Z: B4 T" y: U6 D1 t3 w    for(j=0;j<i;j++)
1 K! W# ^" c: F, \$ O; R    {- P. o7 L9 d* l; K9 w, P1 c4 G
        SomeNOP();7 [2 W. j2 p8 t* w" D, m
        SomeNOP();* U7 |4 U& ?' @+ L
        }* f7 p- p. [7 d& J/ R6 a
}: \$ N1 k7 W  g* X

  ^6 o$ U) D8 c: q- mvoid delay1ms(long  i)
% w" o- v9 e( `- o{
3 `2 s( m# `: e" M& d' L6 }    long  j;
. X# ?" h: @! }4 _7 y4 l& l    for(j=0;j<i;j++)( i  t7 Q( v) Y: v1 e# x
    {4 J0 P& b3 I4 f( [) U( M& Q
            delay(70);
6 s1 E( R" N+ r8 y3 ]: a        }
( m: Z' d/ O9 {! E& Q}% D- L! T9 M2 ?2 i' [- i
void COM_REC(void) interrupt 4
! ]# G; p$ |4 ?% k$ ^& `% ~  w' z{$ o# m4 J. ^; D$ K+ \! O
     ( `& Q( w# R4 z. e) o8 K2 e$ V
    if(RI)
' O; t7 J; n/ B, D    {    //清除串行接受标志位) H- o  E% h# h7 O" }2 u; L
        RI = 0;
7 F' c* B7 n! N% V' v! E        rec_data = SBUF;  //从串口缓冲区取得数据; {: m3 G, c7 J' B/ p& y9 K5 @
        if(point<=5)0 ]* g7 \7 ]# X  U% h
        str[point++] = rec_data;  f+ P+ Z5 c" Q, q3 \9 B
6 A( Z  q: W- S' m
    }
! R: @8 A6 w. X
) M$ n* P3 H2 p/ @/ j" B    if(TI)
7 }1 I* L6 U) F' g    { 0 a, y) V" W# M- f- m& N9 S
        TI=0;
4 E* g, J+ ^* H1 ^    }
0 U; a& J, E& X3 U  F+ T* c}
& ?. t0 X0 q1 n* E5 k0 Bvoid COM_SEND(void)
, z6 e$ e6 D4 c3 H- X' x{9 A( h% U( A0 T& Z* b
for(point=0;point<=5,TI=1;point++)             //连续发送数据. P- `6 F0 n9 Z: L2 ~# P& G0 l
                                      
0 B( G- j/ _0 C) i& F7 j4 ~: @   {' _4 H1 f1 b" R+ i& P
   SBUF=str[point]; //把缓存区的数据都发送到串口
7 y+ h, h$ Z4 M+ T0 Z$ `2 t   TI=0;
, y7 ~, }' w7 G   delay1ms(2);
- E/ i! R& C9 v0 u/ m5 f( G   }, t$ V" [$ ~9 T# ?& ?; m# l5 M- m) T; N
   SBUF=Read_OneByte(str[3],str[5],str[2]);
2 j  \: y! _0 O0 p8 m   delay1ms(2);
2 _9 S& {2 u( D* A  C}
' {! Z. U/ Q; T5 N- z; y  S- t. B
. m4 U4 J: ?9 Q2 M& ^
9 J  r! q8 M% L& W% w/ rvoid main()
( u% t& k3 ^/ R* s# c1 S0 w  H* k{( W" F( K! p! r- V
    while(1)( l0 A% l0 m. H$ H( Y$ |
        {8 C% D) X4 b$ s/ j: f
        UART_Initial();' m3 w* `% v) x- k
                delay1ms(4);
) I3 x' ^/ d2 V/ E  Q                COM_SEND();5 q, q( ]$ E9 S' T$ D3 |
                //point=0;
8 f6 W* E! S$ ^- D  S  u                }
2 U+ B  X7 y+ |3 W6 n}
  E" w4 b! N# o- ?; s2 c
3 J2 ]7 j% B/ J3 F8 e" { 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的 , j3 L: t5 w8 |! d7 l
外围供电 把RXD TXD短一下

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45
; `! S) z: W" E  V, t+ [% @你可以先试试看  那个串口板是不是好的 3 I+ f7 H; ^: Z7 q) S# L' S
外围供电 把RXD TXD短一下
" A# A" k; M' f* C- P0 ~
板子没问题

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"$ S4 v9 d3 z: S
& \. O$ H. x4 t0 v2 B
unsigned char xdata uart_rx_buf[128];: h+ t+ q# ~& `4 I4 @
unsigned char xdata uart_tx_buf[128];
. ]/ h( Z5 w! z3 avolatile UART_T xdata uart;
0 j# G0 k% p" Aunsigned char xdata uartGetBuf[8];) R  ]; a) P! ]8 n6 }: A
unsigned char RxCmdPt,RxCmdTimeOut;
* S6 p: T' l  `6 ~1 P5 n& a9 q
" o: _- E2 _1 L" O' \static void Serial0(void)interrupt 4 using 1- I/ x) q; N# ]  f' {6 D$ ?: c
{2 U( n, E+ F$ A% `7 y) a* S3 Q" ?- ~: u
    unsigned char temp,head;
$ ~1 ?# ?! X: v# A- G% @# u- m
4 J2 b8 w: O" D- Q8 Z    if(_testbit_(RI))
9 ^7 i6 |- \6 g: [' O    {
5 _7 _& W+ Q( {: t: ^( g* @        temp = SBUF;& k1 K1 ]# @4 _1 b  S$ V
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
6 R" H5 Y+ q6 F& O$ g+ b        if(head != uart.rx.tail)9 w! N1 }+ h. a. r' X( [
        {
& }. m* D3 Y7 p- Q% L. R# W6 W# O            uart_rx_buf[uart.rx.head] = temp;; s9 y# {# l  n- O9 W/ d
            uart.rx.head = head;
' L8 B. k2 H8 N: G; m        }else
5 a' D- b' B: j; E$ _/ J  M        {
2 ~" Z6 ~9 o& T, a5 @& q            uart.rx.error = 1;- ^% H: T& M3 U& r' u. u+ w
        }
1 w/ |2 l# k" v3 B    }
5 m- W' n) s0 C9 W. F    if(_testbit_(TI))
! M) b9 G8 ^$ x    {- n! @* D4 ~  q$ n& a2 w
        if(uart.tx.head == uart.tx.tail)
' p* w$ T% ~. ~, P. s, W' Y        {: d! y* S8 I/ y9 G! c" |
            uart.tx.busy = 0;
* ~7 s6 E" V8 ~& g% x' c0 @        }else, A" Y& J/ Q% _/ f
        {3 N, X- M8 U. {  e
            SBUF = uart_tx_buf[uart.tx.tail];$ T& x6 d/ u! b: B; c) y0 l5 I) n  I, x
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
* l! f. {& L4 z' m5 w& k3 Q% Y        }( t: V' X% ^& q; M2 {
    }- c$ V& [# ^: l9 O5 x' I0 B
}' @- q: w7 R! l/ w
//函数  串口中断初始化
- \' }3 {5 _+ Z* b  a6 A+ Sextern void UartInit(void)$ w; e& p7 [& g. a5 D
{
0 _) ]* d3 Z8 _! c! L4 p    RCAP2L = -(XTAL/32/BaudRate_9600);
7 i9 @- [2 G4 b6 d& ~, p" ?, F    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
0 M% M% J  L, s
4 o- N# R4 H% V' H    T2CON = 0x34;/ W/ F% h; ~8 p' D  i2 ^
    SCON  = 0x50;/ F' d; {6 o6 ~, W

3 O* Y" T) D2 @* X, c/ d4 E    IP |= 0x10;     //serial 0 high priority
8 B, R* w$ F( L6 U! G6 ^: j    IE |= 0x10;     //enable serial 0' Z- _  Z+ |: K4 B- S/ k
' I0 W1 O% m; _$ j8 R
    memset(&uart,0,sizeof(uart));
7 t- z: e- H. ?, @' }0 A}
) _7 M4 E* h8 R: e. u0 k; t// put char
! t0 u: o4 Q: x. Zextern char Putchar(uchar c)
2 C3 g7 ?# e/ r& q{1 I7 N) z# X+ ^" v, O/ d/ m) b7 k6 V* O
    unsigned char head;- Y; v: i& @% q/ S
, C6 @) w( q2 L+ l
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));/ i6 m* w6 m* _& V# V6 j
    uart_tx_buf[uart.tx.head] = c;
5 h  R; F) K  A1 d( p    uart.tx.head = head;
9 d; z" K9 _0 B! V, K5 ?
6 g( a* E+ C0 e# z  {    if(uart.tx.busy != 0x5a)% e) l. _' G# S4 I
    {
& H% o5 `, p, o0 u; r# \        uart.tx.busy = 0x5a;1 d$ O& g4 J( O- d) C
        TI = 1;
! I( K1 O+ f+ a0 h7 x6 E1 P    }, w! w) T- S8 |+ L2 A
    return c;
0 ^* r5 w" o- O; I) h}
& C; R- t' D9 |1 K- {, m6 \. y//函数 判断串口是否有数据传进来
! D5 g8 J' |7 S6 N//     如果有,进行接收数据
8 o. I9 ]5 H$ ]6 Cextern uchar GetRxBufSize(void)
& n: @. j% Q" s0 T{
) i: g# P; x1 f$ v' y0 P; W    unsigned char head;9 a& A0 d; O# ]$ C: `
) l9 I  G9 q* W7 w, o: ~( H
    head = uart.rx.head;
6 s! g5 s9 w' \% b" U) \" J    if(head < uart.rx.tail)! \9 p% `/ Z3 c6 Z7 b% M+ v
    {
7 X9 o$ J* G3 E& }; H        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
' ~3 d7 j! P% B1 h& o" B    }else
  Q( |6 r7 e( b& y! Q3 g    {$ e) |9 k6 k2 b" f5 y4 E* I' E
        return (head - uart.rx.tail);+ F" a4 P4 P1 P
    }
# W" B  g2 ?0 K: q9 ?}/ }' Z" X! s# S. M; Q- u* `
//函数 从串口缓冲区取数据,只取前8个字节的数据
2 L* k; T, u' n# bstatic void EnterRxCmdModeByPc(unsigned char c)! L/ ^  x4 y- J- D5 z3 L2 V
{
9 w% y2 n' M  z& }6 x9 L1 n3 U! p# M    if(RxCmdPt < 8)
9 X6 [, U3 C, W0 B; U    {( S4 S+ N/ @0 M1 }8 U7 M- p# k
        RxCmdTimeOut = 10;! q! l9 N5 g2 n( [7 H: ~
        uartGetBuf[RxCmdPt] = c;" h, ?8 S: c) q0 @
        if(memcmp(uartGetBuf,Updat,3)==0)  t8 V2 C' ]" ~$ r/ r5 e
        {1 w5 `7 Z  j" D$ h1 K
            EnterIspMode();6 g# m- W" p4 S/ q
        }( ?2 [. R, [4 B, M+ N% ~. ^
        RxCmdPt ++;
( K9 d. `( K/ |. |# s    }7 o! _* Q4 U, w$ g$ s
}  w8 `8 V& H+ H  o  t/ P0 I
//函数 取缓冲区中的数据
- y3 d- a) a2 z//返回& u$ b  a9 v! z  P" G4 I
extern uchar Getchar(void)
0 L* J; [5 @1 L$ B+ a5 d! P{
! Q* }7 [& r. I. N0 e    unsigned char c;) s7 J! `! f* l2 i: M, ~

- c/ A& M6 X: T    c = uart_rx_buf[uart.rx.tail];" K: h" B$ a, o$ g
    EnterRxCmdModeByPc(c);; ]: {( N6 `8 j$ w" F
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));' S( l7 r. W+ W6 x+ d
    uart.rx.timeout = 100;( }' P( V% F& S
    return c;
, R5 i8 l  p- i; u}
* s- n7 u# p- z5 r//! J: M- N6 ~6 O0 `, D: s/ d4 @
extern void UartTimer(void)using 14 E! B& E! A9 c+ V. I
{
: G, Z$ S6 l8 l; V    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
8 ]1 L: ]" \  N9 p    {
5 Q8 j4 O: q' m# z% ]( \( u. G              uart.rx.error = 1;6 W/ J$ L& g" B$ x" a! _) n! A
    }
! i8 n3 Y" ^& I0 x; j: ^}
5 {* ]# h: k+ a8 t' f//* v, S: x% \( j% D
extern void ClearRxCmdPt(void)
0 d4 w+ S- m8 i  ?% G2 n{: y, e- R: C" t1 N  e0 U& I
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))
3 _* `  E9 C( u/ @0 `: a* M2 \- A    {
- l  N" k$ b+ J9 H# y              RxCmdPt = 0;
6 J( \! S5 k. X# Q0 r    }, P( r4 ]6 Y( M+ q
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2025-3-8 05:19 , Processed in 0.061673 second(s), 31 queries , Gzip On.

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

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

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