找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
#include "REG51.h"   / N5 Q) |% v; c2 ]) c  o
#include "intrins.h"* Q; P! j0 X5 H; x& d% n
#include <string.h>2 o/ [$ \( x  b0 i# S$ m) a9 Z  _! O0 F
#include <stdio.h>
( g* r* t/ B9 z0 _1 Y7 K( s#include "i2c.c"4 C$ K* s% W9 f& ]6 S+ X# a3 `
#define uchar unsigned char; ?4 O% @, C7 c8 z$ Y4 M
uchar  port;" m; P4 t: h+ x, F. w7 q8 S
uchar  rec_data;
" s2 m8 [: D" A" zuchar  str[6];' F9 ?7 }) R- O7 h" z+ |) ]4 P6 p
uchar  point=0;' S4 Z2 x! H# Q' w  @" B
//串口初始化
/ k& x  ]/ d) J; t% Uvoid UART_Initial()        - I5 ]9 Y" V$ S; W
{
; j' H& s+ E) E    SCON = 0x50; //串口方式1,允许接收) l& D" n0 c# T2 [
        TMOD = 0x20; //定时计数器1方式20 M& l# E9 d& Z( [
        TH1 = 0xFD;        //9600 波特率 FD7 I0 J1 [( @) |/ q
        TL1 = 0xFD;
# n9 o, a  e) Q+ J  }. p        EA=1;       0 |5 M. ]! T  R
        ES=1;      
+ T4 m4 s7 e+ S3 X        TR1 = 1;    : d/ a; S+ F- z# Q1 U
}
5 @% N" ^: I  E6 p3 w; f + T  R. E7 w2 k+ m
void waitsend(). {9 E* T3 u, y4 J' K0 j$ W' r
{4 y& l, S+ B; F( X- D
    TI = 0; 1 Y5 l- i% H9 L. Z$ Y+ w
        ES = 0;7 c. @' Q5 a0 b) G0 W4 C+ N4 z
    while(!TI)
! O: r5 x& Y( j1 Y; K$ J/ e    {
" Y6 d: o8 |( \9 d+ F  i/ `$ J7 ~    };
: E) P3 n; B+ O4 h    TI = 0;
( y& V$ r% p% p        ES = 1;- B. t- o' \, {: C7 |
}  h; t' ^0 D1 }+ ^) B
void delay(long i)3 X; ^2 v1 e* ]8 d  L- w
{
  F+ Q# M1 u2 E! @; W( ]    long  j;
) N+ _2 ^- U  p5 _$ \    for(j=0;j<i;j++)+ Z9 t6 S2 F# b( G0 o4 i
    {+ m  R3 l: A1 S
        SomeNOP();
" d( U5 j6 K. D4 x0 k        SomeNOP();
3 h. K' A- a$ D0 T: G        }+ \" |3 Y+ P, ]3 a
}8 T/ j. }, k% P; h# B
) T/ K! o0 M8 {
void delay1ms(long  i)
1 L6 U! ]- ]" ~4 c0 c+ S# |% t# n  f{* X. q2 ~2 s+ p4 g( C
    long  j;  L4 H4 N* R# s- ~* M
    for(j=0;j<i;j++)& O$ }- \8 C: s
    {
5 x. P1 E& M- C' w3 _: o            delay(70);
# w8 _' m! B7 M( J& O* ]1 D2 |        }
" j- f* Z5 n, B/ K! z. e6 R6 Z}
$ j# I. ~# V5 {* Yvoid COM_REC(void) interrupt 4 : D+ I) Y2 ~2 x, h5 y( R9 e
{# Z1 a$ s; K+ k9 B; }' @
     
$ \4 A& A+ p$ u    if(RI)9 `4 Y0 }8 U- t: V5 t
    {    //清除串行接受标志位
, @. s0 G5 o) H        RI = 0;
+ Q1 Z+ [% N6 W+ a, j        rec_data = SBUF;  //从串口缓冲区取得数据6 d; Q0 x( O" ?3 m+ v4 q, W+ G/ L
        if(point<=5)
/ J/ N: }0 o( P5 D8 o( S7 u        str[point++] = rec_data;
$ Q0 c, j. ]; _% q, D, q% Q. o( M$ {$ {1 g- p' |8 _! j* `9 P3 b
    }5 i9 R9 K  q  z" {5 w0 \
  o' ^7 c' a5 N
    if(TI)
1 R$ a; V9 g3 H    {
& z* k1 l* |; Y' n+ H6 M2 M        TI=0;2 L" a' R9 K* ]* ]
    }
; B* o; Y. D" o9 f  Z( P}
, u9 G. h+ r0 Gvoid COM_SEND(void)2 ]. K5 _# k2 |9 s3 M: M% W  S
{! H# q+ R, j) S2 i' e) _; u: P5 \
for(point=0;point<=5,TI=1;point++)             //连续发送数据( ^4 w$ I7 h/ {8 t3 o% m! w
                                      
7 [) d5 a9 S6 e" L" t& w   {
' ^' Y% r# Q* B   SBUF=str[point]; //把缓存区的数据都发送到串口
2 c/ Q$ b7 j) ~- T- Z   TI=0;
0 d" k/ B/ t$ z/ d  Q6 v5 Z1 F   delay1ms(2);
0 }' a; O  j; o   }
6 s& X5 b' v0 \   SBUF=Read_OneByte(str[3],str[5],str[2]);
( ~# @6 S6 Y8 h( w% V* ?   delay1ms(2);9 I7 s' q. ^9 q$ W( G! O
}# D& T5 t! V# \3 c

: a# \- Q* x; Q% m+ F$ }
) ^/ Q+ x$ Z8 s4 dvoid main()
$ X& h2 C9 Y3 ^, h* k$ a3 Z{
1 d# N' R, b" W. Z8 W    while(1)7 `9 N4 H! k: U! ~% s3 Z
        {9 X+ T, V3 _9 ]
        UART_Initial();
' {# g+ i; s7 ~. q                delay1ms(4);
' ~& O* N9 c8 v/ O* [! w' n* u) d2 z                COM_SEND();
6 H0 k! ~4 \4 O- v9 u                //point=0;
( E/ x! q% c. u) g2 K                }$ ?% |3 V( e5 k; n
}. Q% _1 f8 I: `4 u6 |

5 y: N# Y8 u: S4 K% u2 \ 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的
+ `( g. N# |: U4 P/ s外围供电 把RXD TXD短一下

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45 1 ]; R: [- }! {; k2 M
你可以先试试看  那个串口板是不是好的 4 i8 D! B$ X! T1 A3 I
外围供电 把RXD TXD短一下
% z& R+ m1 V3 T: K- i0 L$ b' `
板子没问题

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"* }' D5 `2 o; c8 f
9 z/ n& W2 v# o. A0 l* @- C8 V
unsigned char xdata uart_rx_buf[128];
; G7 L1 s7 I4 o9 C  v! H, p7 gunsigned char xdata uart_tx_buf[128];0 A* b3 W$ Q, E+ H
volatile UART_T xdata uart;+ H' A) _2 v2 p( \6 ~7 {6 F& W
unsigned char xdata uartGetBuf[8];3 u" H) v4 q9 j: y$ w" c
unsigned char RxCmdPt,RxCmdTimeOut;5 ~! r$ ^7 N, v* P4 c

0 o* e, I- ]; J7 i* c1 {. \static void Serial0(void)interrupt 4 using 1
, s& ]6 O. L) z' `4 J7 W8 }{) j; h8 l. C1 y- w' S
    unsigned char temp,head;
# |; ?! g6 z- N' y% o  U1 t* K9 y3 L( \+ _# ~9 C$ k
    if(_testbit_(RI))
. g. W; C3 p7 s    {
3 ~3 ]* g( u/ w/ ~        temp = SBUF;
  q. @5 s( F2 H+ n        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));; S5 T* c9 s- v9 [) w. e
        if(head != uart.rx.tail)! R& P) O+ s, m4 }
        {0 L& F+ S. H, l) |
            uart_rx_buf[uart.rx.head] = temp;
" l& @5 B% v! i5 ?7 _2 _, C9 X            uart.rx.head = head;
) ^  ]6 Z6 ~& N, p: U+ e        }else
  ]6 I$ h& m+ T* _' A        {& i2 y5 P$ Y. d% V5 i6 X  z
            uart.rx.error = 1;
% P7 f/ p( B+ u+ J" H        }: {6 `8 }" S. S' n
    }6 d* p: [, n8 y5 U6 U
    if(_testbit_(TI))' a3 l: K; B1 l$ x( T- d1 C6 [
    {2 L+ L2 p2 ?, l
        if(uart.tx.head == uart.tx.tail)- c! s5 c4 }9 L4 d  }% d( \+ h0 q+ l
        {- s9 T* X8 Y; C7 W$ X. M6 U1 o
            uart.tx.busy = 0;& E) K4 n+ Y. W% z( y5 v* I
        }else! ]7 y5 z0 U8 ~9 \4 Q
        {
. X. R5 n# |7 M) j' r9 x2 {& o0 P) [            SBUF = uart_tx_buf[uart.tx.tail];# p6 k( K1 u1 J* V0 B
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
# ]3 I: \. D% y8 o7 k- V) n5 r! l        }
8 @7 I1 Y9 c: M    }
' F8 B# m, h6 E5 `) N, ^}
. ^# U! n0 b9 s* G//函数  串口中断初始化/ ~& _/ P" C' w7 F$ N4 f/ m
extern void UartInit(void)- ~" v% W8 Q% K2 |$ Z* s9 f
{$ I4 b( s$ ]" O: ^2 g- J* m2 x
    RCAP2L = -(XTAL/32/BaudRate_9600);, @* \  U8 `9 p" h) B" r
    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
7 F0 V1 |. `4 b" S: b, c4 g. A- w
    T2CON = 0x34;( Y: w! z" D# a6 K! Q; T
    SCON  = 0x50;
# Q+ N) I; g6 \3 B$ G$ g7 |( V; Y2 p: }4 @& h* `
    IP |= 0x10;     //serial 0 high priority
+ n3 _2 O( T/ J, p& }) z/ f+ z! o    IE |= 0x10;     //enable serial 03 `1 A# X5 M3 n8 q$ \8 E$ P
2 u9 ?0 h4 k" ^! q
    memset(&uart,0,sizeof(uart));
) q) }! H0 |# T' Y& k& ]% e}
' Y' L+ O8 x( j  G: H# i+ I! O/ ~// put char
/ S% U6 Y0 Y4 w! K+ sextern char Putchar(uchar c)  e4 r! o+ @0 q9 t8 b
{  y, x1 I0 N- u* i9 m  D! G
    unsigned char head;* v' J; q! G& [  ~7 D* Z7 e
! g! U4 m* t0 U( `( U
    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));
% P1 B, _4 x" ^" _0 \& s2 x3 Y    uart_tx_buf[uart.tx.head] = c;$ X' Q. M$ F, n( D& L4 x
    uart.tx.head = head;" o: L  h. ]) K( R

7 [( d8 }: \. Q) ?2 t    if(uart.tx.busy != 0x5a)7 u( u/ ?2 H/ w! y' b! n7 T
    {6 N% i" l. S! |1 T0 v, A& f/ j' C! a
        uart.tx.busy = 0x5a;
1 l3 [1 e9 L* E# e- p' E/ b& |9 E        TI = 1;
# w8 A; `& U5 ]( t$ u( l    }9 `- }% f" r6 `! D$ q, W5 W$ w: }
    return c;) g  |$ ^% L* ]3 y% x
}
9 ?; \% e! e- L; P//函数 判断串口是否有数据传进来& w. F1 H! g8 J6 D, A) y+ {
//     如果有,进行接收数据
; P' B4 {" N  Nextern uchar GetRxBufSize(void)
" l! `1 W( e; {: r0 s{$ ?- y+ m6 c. K" [: K8 N5 n& m" a
    unsigned char head;
+ g! W. d4 F4 a. A' t) k, j" Q; V$ }. M$ s2 K3 g
    head = uart.rx.head;$ {' ]4 x# I% G3 {
    if(head < uart.rx.tail)6 E$ O7 f1 {7 \1 K: [
    {/ f9 ^, S, k4 H: t. Y% W! J1 F1 i
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
( b+ w, }' t$ P; R, p    }else
( F4 U" l' ~4 [. H    {
1 p' X; Q! {0 N. t2 r. \3 ~* C        return (head - uart.rx.tail);
8 n7 s  L; M: i1 V, D    }" A: ^& y; ~% C/ a
}
. m" ~" Q7 {+ {  T5 ^1 B//函数 从串口缓冲区取数据,只取前8个字节的数据* a7 E8 R5 J& S: C! f4 \
static void EnterRxCmdModeByPc(unsigned char c)# j4 G  }  o1 Z; r
{0 R* ]' ^! s5 _) a
    if(RxCmdPt < 8)
& y9 X* q! }6 @: f    {9 E# @" I4 u% }; P& }, v  _4 C
        RxCmdTimeOut = 10;* B. `0 ^; e1 m' a
        uartGetBuf[RxCmdPt] = c;0 J2 e, o7 L, q+ o; a4 t( v
        if(memcmp(uartGetBuf,Updat,3)==0)
4 _( I/ J; A2 b- Y8 U+ B2 m; A; Z        {  N( ^5 X# V7 p, v
            EnterIspMode();0 n2 X9 m( f- ~7 k
        }5 ^$ y5 a8 S' r0 T+ b
        RxCmdPt ++;4 V1 j$ Y" B( C# G* S* c; M6 J/ V8 D" g" a
    }
' ]- Q5 S3 t0 D; o) y}4 ]2 T6 d" A" _& U( q* F+ E
//函数 取缓冲区中的数据0 y( d9 Z4 l2 B1 T. D; Y, c7 @
//返回; {8 s- J3 R2 g/ g- x$ W1 L
extern uchar Getchar(void)
1 ~! i+ Z, a6 k{8 P$ d( w: B  K; I9 U
    unsigned char c;
5 m. n& N8 j0 [8 j& g8 z0 i; q
* H# v, y( i3 F8 p! m    c = uart_rx_buf[uart.rx.tail];& S! p5 v) l7 b$ z6 I- q/ ?
    EnterRxCmdModeByPc(c);5 z7 w# ?: b4 ~: ~+ l
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));  ~" ~8 U! W( R% m# k; W1 r
    uart.rx.timeout = 100;
. `# a6 V1 }2 ]  m    return c;# Z' z& k. q+ V$ `/ k
}
% j4 S  Q. W* x& \//3 w- _4 b' s! W+ M! e$ z4 ~
extern void UartTimer(void)using 1. x. `" `' I$ o; |
{  n/ f5 T/ k- @* \9 S$ h
    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))3 M5 i5 g* n  f; z5 j
    {
* U% ~! I3 R1 ~/ r; _; o2 ^              uart.rx.error = 1;4 J5 {* _4 I& L) V
    }
; b' b" O! p: r( k}' ?, b( h4 S0 N+ V6 I: [
//
  [) c3 t& R) `0 e/ {3 {3 d' a( Iextern void ClearRxCmdPt(void)/ `( I0 R/ T7 T9 R5 s
{) w, Z" h3 F4 t  M8 P* E
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))7 X. A0 N: x) v5 v& }( H0 \
    {
. q; X8 f# O4 v5 I8 Y/ y& G% d              RxCmdPt = 0;
% y. I3 c# N! X5 C7 I    }2 B- x$ s# }  W8 b8 X) J
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-9-19 09:57 , Processed in 0.058949 second(s), 31 queries , Gzip On.

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

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

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