找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

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

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

[复制链接]

108

主题

498

帖子

2289

积分

四级会员(40)

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

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

EDA365欢迎您!

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

x
#include "REG51.h"   : D0 ~) @4 ~! z7 W% h0 Z. P
#include "intrins.h". P, S* }9 s1 g. X) W) Q. e+ ?4 s. t; V
#include <string.h>
) Z' Y/ p. |! b5 C1 W0 t#include <stdio.h>" ]  `) c0 _: y8 r0 K: |
#include "i2c.c"
6 d/ N7 y6 M( i) m# X0 I#define uchar unsigned char; X0 t! [& r* b9 A/ e3 c6 u
uchar  port;
: B) G; S5 o3 Puchar  rec_data;0 O- i" F- a0 C( S; s4 c; `* m
uchar  str[6];
. M+ o- v5 l; c) Z1 Auchar  point=0;9 h, D# D* p2 C" K2 s$ E
//串口初始化
) y( |1 e% _3 d: N9 H2 r. B% hvoid UART_Initial()        7 f1 r' I. H# Y. m! f
{ * v4 ^5 d, B, L& k! r; W! |5 n
    SCON = 0x50; //串口方式1,允许接收# G5 N- p7 I" `
        TMOD = 0x20; //定时计数器1方式2) o  p# D# d( N9 O, X6 W4 \: \/ y
        TH1 = 0xFD;        //9600 波特率 FD: j8 J6 S6 j" I; ^$ |
        TL1 = 0xFD;3 K$ F" |6 J/ U3 ~
        EA=1;      
% A. _; r5 r' R! I8 A; \        ES=1;       / d0 u3 B( S( h6 Y3 V% S
        TR1 = 1;   
! I2 E/ U1 a, K2 I! m5 p}
, `2 ]6 l, I' ~
" z/ k4 @" x$ m' M5 }: Vvoid waitsend()
6 Y) `8 o8 y6 u{6 ~3 q0 u* s' ?* z; q
    TI = 0; 4 d& E: d2 M' m6 D
        ES = 0;4 c/ q' K' ?+ s7 E$ [
    while(!TI)& n: }0 m' U1 G* s  U
    {
, s! [- b1 t) ~, E* H' F/ R8 Q    };
) K  @" l& ]0 H' m' f$ \    TI = 0;
  c/ O2 W; }7 Y4 a$ D        ES = 1;- c- h+ g" A8 r* J4 |
}& x) ]' T  B. q9 i8 E
void delay(long i)" A5 g! g8 ^0 C' C! B
{' S% C- ^: m4 Z0 \/ [& v+ x
    long  j;
; S; ~, ~- _; S! Z    for(j=0;j<i;j++); Q6 Z4 v) L3 p
    {! E: {6 R. v* N1 R
        SomeNOP();
) c" _! [( V& Y- A6 Y5 ?        SomeNOP();! ]5 c3 I2 B$ }* e, _
        }5 a) }+ e* \+ P$ V% ?& L
}% T1 ^' M% ?# b4 s. W0 U

* ^( s8 u- k6 b" r1 Q. P# q/ E7 D* Evoid delay1ms(long  i)
0 B+ ]3 U$ ]2 y7 I{
  ~' M$ m( a* h+ n$ k& e+ {  ~/ k; }5 _    long  j;" g  ?3 c) Q, \
    for(j=0;j<i;j++)2 b1 [, g$ i: {6 F6 y) X) w; `2 A& \! ^
    {
* @8 ]4 C; Z! o7 }* `( \' E9 e            delay(70);0 Z5 Q- h& Z* _( c8 A
        }
0 w$ k6 n  Z! h' M1 S% q8 z}
- Q7 q3 T) U# Y$ |void COM_REC(void) interrupt 4 " {' w# E2 O! \5 H4 _$ ?- v
{
2 Z" [) h& E9 W     
9 a/ H' `/ B& c0 ]/ k# ]    if(RI); ^2 J4 d6 r5 G; W
    {    //清除串行接受标志位
! b" i# f* i+ L! h; J; {4 m, J9 t3 ~        RI = 0;
, e: n# i( Z+ [9 V  W$ I        rec_data = SBUF;  //从串口缓冲区取得数据6 C) ~2 Q5 x( j) \6 j
        if(point<=5)2 j3 Q" j! I' ]  U
        str[point++] = rec_data;
9 l( `$ t; }# U
( R0 L4 D, Z+ D* H7 C+ `$ V: c    }$ L: n. Y" W5 j# E, V

* L0 g& V0 T- Q* j- S; ?1 I    if(TI)6 w" }4 H4 m2 X* F) F2 y1 F5 E
    {
. R: @, w! }) `6 q" }        TI=0;
, }% L' b! T! D- P6 E* G    }
0 d. p" W! o+ z# M% k7 K* i}4 @9 E$ X, e5 e7 q2 X3 P
void COM_SEND(void)
# _, `+ a* h' D9 K! z' K2 Q" F{
2 a; d8 V* L0 d4 ^* cfor(point=0;point<=5,TI=1;point++)             //连续发送数据
, E" ~6 w' f* f% S4 E                                      
7 ~! o# S& N. _! k" U   {" U- }3 Z6 F7 y9 _
   SBUF=str[point]; //把缓存区的数据都发送到串口
, B3 l) g% `4 k: o* N   TI=0;
9 \; ^/ M0 O# X* S   delay1ms(2);
; l0 X; q2 K1 }6 i) j0 C   }
3 J& J  v. N8 y. S+ s; [) O   SBUF=Read_OneByte(str[3],str[5],str[2]);: [5 n. e3 h8 \/ k" @0 o
   delay1ms(2);
) e7 e' q% a; I6 \/ u9 L4 Y+ ^}, U. a; r8 @+ v/ h+ l: s3 \
$ ]: H4 P0 A3 Q7 p

. M: D3 v0 D* b; ~+ V- e6 Hvoid main()! ]' C; p2 P& B) i
{
# r+ l) m2 I6 W* g; S8 Y/ E    while(1)
# R* C2 a) a- W5 X+ `        {" ]1 _( V! C8 z, j7 z
        UART_Initial();
* f0 R! y1 ], ?1 F- e                delay1ms(4);
% y6 g6 t$ v: p: }+ a1 i                COM_SEND();
' [3 ]$ j4 D4 j- u6 B, \' |7 w5 K7 t                //point=0;
9 e- C, \" l, D0 j' O5 E- P, O                }
$ Y9 W  M4 V, V. R- K) u* E) c7 w: `}
! B' _  v6 {4 H% R+ t/ q3 u1 N3 @
这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

11

主题

232

帖子

-1万

积分

未知游客(0)

积分
-10841
2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的
& O7 `" j0 O$ O" L5 @9 |外围供电 把RXD TXD短一下

108

主题

498

帖子

2289

积分

四级会员(40)

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

积分
2289
3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45
' T: |9 O) G0 o' n. J你可以先试试看  那个串口板是不是好的
9 P" m- f; E. E0 I外围供电 把RXD TXD短一下

2 [, b9 ~" h1 n9 m  q板子没问题

2

主题

97

帖子

684

积分

三级会员(30)

Rank: 3Rank: 3Rank: 3

积分
684
4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"# }; W7 _8 G4 a# y

( r7 B! [% S& F; m, k- N. qunsigned char xdata uart_rx_buf[128];
: h3 E, `9 {$ c- Z* m  j8 [unsigned char xdata uart_tx_buf[128];% \) X- n& t; Z  W0 ?
volatile UART_T xdata uart;
8 ~  q' X: t+ l$ @( s+ R3 X) Lunsigned char xdata uartGetBuf[8];; R0 X* W9 b6 x8 f
unsigned char RxCmdPt,RxCmdTimeOut;
5 Z9 {) T$ H1 f) ?7 w, U) e! z! j+ m, P1 Z$ R6 ~
static void Serial0(void)interrupt 4 using 1: `+ a  M0 @% ~4 a7 v! H
{
1 W! x7 t: u4 K7 Q- Z9 N3 i/ ?    unsigned char temp,head;/ g) A9 `5 t" [/ U7 n

& J# b8 p, y! @1 X' Z- ~4 W" ]    if(_testbit_(RI))
- _5 _& R, F# I0 }& i; j5 I, ]    {
/ l0 ^4 M1 @0 G" m- K$ T1 U! r        temp = SBUF;/ L( s; k% A: U% Q8 }
        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));* v! a0 f5 Q0 u
        if(head != uart.rx.tail): O* g) Z6 @# e6 ~7 l
        {
5 j3 ^7 B1 k; \6 ~4 O# @! d. Y% R7 d1 J            uart_rx_buf[uart.rx.head] = temp;/ w% m. m5 d5 D( I7 ~' \
            uart.rx.head = head;
% q( J( E7 V# q3 i0 _8 z        }else
) e5 m  F- r: R, s; q) K! T        {
: D6 X+ b" g1 F1 ?3 V            uart.rx.error = 1;
$ V4 F0 B  N. U9 Y2 w* \5 Y        }
- A2 O% h* O+ L5 r    }
3 Z/ b4 E: F7 l( X5 ^/ H; q    if(_testbit_(TI))& |* Y. o9 y) f5 V) b
    {
, k! {3 ?3 O- d' O        if(uart.tx.head == uart.tx.tail)& ?0 v5 Q: K  `' P7 R* `$ N2 p
        {; r1 \3 ^' F) I: P7 W/ i4 g$ i
            uart.tx.busy = 0;
: r; I1 O  D, o& |4 @        }else) A/ x- [) U9 u# Q3 |( N/ K
        {: d# J' w- c1 J2 L7 W
            SBUF = uart_tx_buf[uart.tx.tail];$ @: V3 a( r# D/ c: X+ O% ~
            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
- {8 M# x5 ~: b- M! H6 l        }& w: Y% z8 r, U1 M5 v7 [% ?
    }
5 W9 M, p! I1 u1 _% t}
" @8 e* S) `( [//函数  串口中断初始化4 w) U0 e3 q' R
extern void UartInit(void)
8 P# {$ j) i( t& W# ~' L; q) w{
2 t/ P- {7 X. j4 g    RCAP2L = -(XTAL/32/BaudRate_9600);
) X3 R' U, c6 [% d# R1 |, K    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
4 b8 Y6 r5 Z* |. L
( }2 h( \( g9 o8 y9 d, V# Y    T2CON = 0x34;$ m/ D$ {. o1 k: b9 |& b
    SCON  = 0x50;
/ Q9 U) b" l6 h; A
( C7 H3 L" j% k, p5 N: M* Z: ]9 j    IP |= 0x10;     //serial 0 high priority
. }. M  R4 p' G  a% b    IE |= 0x10;     //enable serial 08 u3 {2 O8 k) f( E

5 b3 \2 i0 U3 c9 M% `- n/ h    memset(&uart,0,sizeof(uart));
# v. U' V* V7 c4 y$ r& v6 U( C9 ~}
' i) _0 |( o% B2 P+ A0 S: N// put char
/ w: `# e0 g& T( ~  n4 vextern char Putchar(uchar c)
2 g/ v1 _6 }9 a{
1 V5 G, l, o& _* ^9 G    unsigned char head;
# w0 K% [% T5 H% O% F: N/ A
4 O+ A$ S6 e, p7 Y1 l+ A    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));2 `4 }% J" J! d- A
    uart_tx_buf[uart.tx.head] = c;; A0 R7 ^; F4 @4 `# T" M
    uart.tx.head = head;; `$ W; }* b( R4 P1 Q' f5 d

, H4 s5 D4 z5 _1 A% ^# G    if(uart.tx.busy != 0x5a)& P% `5 z; u/ W, C
    {0 ~; A/ o  v2 @& J! n# ^" S
        uart.tx.busy = 0x5a;) |; s% Q/ }, H
        TI = 1;3 d, M) ~( L: A) z
    }
( T# @$ d5 a- ^7 o3 }" `8 J/ E7 Y    return c;
2 y& _' D& [1 I1 O1 _}+ L* z- t" S0 Z' m: f
//函数 判断串口是否有数据传进来  i! w/ y$ E3 ~+ N$ ~
//     如果有,进行接收数据
" J3 r" a3 B9 L# _' nextern uchar GetRxBufSize(void)
& q" p) ^8 x, z. e! \{" K* g  b9 E. N
    unsigned char head;
4 w* h/ B# u1 v, }6 Q3 C# A2 A
! J$ ~5 [$ T% p6 \9 z1 l% S  s( W" Q    head = uart.rx.head;( g" m0 @, q! \8 x% o- W: j( h
    if(head < uart.rx.tail)4 P7 a. F: e+ ^5 K7 R3 N
    {
( T! E, P& d7 G/ ^2 \6 R. ~/ J        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
, j1 J0 A4 x. I    }else
9 S) K5 ?9 T, I/ m4 G9 D    {. v. y: A8 \* A
        return (head - uart.rx.tail);
5 U4 y0 R9 ], Z1 t. H& ?3 H    }# l0 d, z! K  ]; {) b  v
}
* `% F$ h% n* R( [( w//函数 从串口缓冲区取数据,只取前8个字节的数据
* m* b/ b; {, {% M# X% xstatic void EnterRxCmdModeByPc(unsigned char c)
; x( P4 t) S) [  u% D0 ~' K9 @1 v{
, h! {' q9 a- f% A4 v7 d    if(RxCmdPt < 8)" |+ ?. S/ ]' @8 Q5 b7 T' v7 y
    {) q9 C) U. ?+ o; v6 O! Y4 S( }
        RxCmdTimeOut = 10;9 t0 g  \" f6 a6 X" W) L0 i
        uartGetBuf[RxCmdPt] = c;8 m# _0 V& S1 B9 E) R% x( [
        if(memcmp(uartGetBuf,Updat,3)==0)
/ V6 L/ V7 Y3 z* `        {" x6 w8 b3 S* {0 C  t; Q6 P" t% _+ h
            EnterIspMode();; E. Z. x2 M9 \% g6 Y
        }1 w1 W1 p- S! V5 t) I  V6 O
        RxCmdPt ++;
+ f* [: O' R% Z' e    }
6 T0 @. E" c# u/ z1 r}
# P1 O% ~, N) P% j; n//函数 取缓冲区中的数据3 z) Y" l4 |2 g- B. `
//返回) z7 A3 a. i: _% F' ?3 [  w
extern uchar Getchar(void)( F. p1 Y( R/ M+ X* p
{' E4 ^2 ~) J" a4 ~1 W, K
    unsigned char c;6 N2 P. I* a: O6 v" o. A0 Z7 V: ]

* S# _- l' e* b- o2 O0 v! R- V    c = uart_rx_buf[uart.rx.tail];, h2 ?+ \# p. f1 l# x
    EnterRxCmdModeByPc(c);
# L; n+ g  c8 J    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));+ U, e+ `' o, q% ^5 o* \: I9 l
    uart.rx.timeout = 100;
3 F, ^. C9 Z7 \! f# i9 [! V: W    return c;
2 B3 ^9 a7 C) Y5 ~}8 Z' o+ K  o3 C1 U
//% @2 G7 w1 ^, t1 O/ W
extern void UartTimer(void)using 1
. z, u& J3 I0 Y{
& ~1 }) G3 g0 b; S' _    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))
% O6 N( d; j! _6 u7 ^2 n    {
3 ^* E2 l) g2 `4 I& y! M; L              uart.rx.error = 1;8 ]+ ?( D8 l3 V
    }- D1 c7 ^/ C- r& A! D9 S
}
& a. x1 o- L, _) L  \//
. h, E( l+ s" m: Oextern void ClearRxCmdPt(void)
; h! ^  {+ I4 p5 l* E1 u{
5 b+ u6 \$ E0 W- q    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))( I4 T  f" @* P4 L# V
    {
, X) @$ g$ X- ^              RxCmdPt = 0;
) O; E. d; \; ^    }
+ ^8 d3 ~& B  M8 h( |6 G* z# ]}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

巢课

技术风云榜

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

GMT+8, 2024-11-8 22:10 , Processed in 0.058728 second(s), 32 queries , Gzip On.

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

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

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