找回密码
 注册
关于网站域名变更的通知
查看: 1761|回复: 3
打印 上一主题 下一主题

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
#include "REG51.h"   
$ p4 U" L( _% A; x#include "intrins.h"
, B, V% A7 s7 N3 ?0 o#include <string.h>
, y* H/ M0 \+ t% \6 }& X& Y4 |- _! t#include <stdio.h>4 t) p3 t$ g% k. O
#include "i2c.c"2 Q. k5 K  i. v9 M
#define uchar unsigned char
7 ?/ i: m" v, _, H9 W" quchar  port;
# ]- b+ `6 F8 B  Z" euchar  rec_data;
( R! _9 T3 Y- }+ f1 [' xuchar  str[6];/ r" l* Y& {: _: R$ s, x4 z$ l
uchar  point=0;
- [# x: ^! i+ {# x//串口初始化
1 c5 M! v5 t' |: ~5 ]- H, mvoid UART_Initial()       
3 R" A: A/ ?7 e0 A$ H1 n{ 2 |3 R, C* d( \  [+ U' I7 P# U
    SCON = 0x50; //串口方式1,允许接收
  E8 s. o. D. a* J! W        TMOD = 0x20; //定时计数器1方式23 H% B# Y; _- u6 I! F: `$ o# Z
        TH1 = 0xFD;        //9600 波特率 FD8 g  V+ Y0 s0 k% l( @; T
        TL1 = 0xFD;
# Z- L' e' d3 a- B* q        EA=1;       2 U% b' c4 @- Y' }0 U% ?- D# ~
        ES=1;       4 |: D/ V* m* R
        TR1 = 1;   
" d. L6 Z! J( R}
* s4 r6 \0 e3 y% K
* u+ G: c  v8 ?3 l# @: Y% cvoid waitsend()
$ [& o- t# @7 X1 x; ~% c2 o7 K( b2 g. x{. a5 g3 ~4 x# P  q6 h
    TI = 0; : d2 L+ o% q$ Z
        ES = 0;9 @0 Z0 ]7 v" y, C
    while(!TI)
3 q5 J" p7 K% N/ v; n- g    {8 g5 Y  B, {" R7 F3 m
    };
& E5 A. z3 {3 c" _    TI = 0;
2 d5 M* I5 f5 V3 b% c0 U5 Q        ES = 1;* o4 {2 W) W- Q$ G$ ]
}
# K+ u$ c1 p# Q; Bvoid delay(long i)' T$ a$ ?0 E2 r
{5 S# G; c3 L% ^0 l  @
    long  j;
6 M( z: Q* F* v0 U- l    for(j=0;j<i;j++); {4 q2 Z* D. W3 A. p) ]7 t
    {
, F* C! ?$ k4 J0 D) n        SomeNOP();
5 J# h' y1 |" {( N5 g# E* e3 u* C        SomeNOP();( S, i' e; |$ K( h1 x( X
        }' t7 ]9 E, _0 K% Z' f( V
}
4 i( Y! i9 _2 [: Y. x+ ]
# Q8 J- I, J! Q& r, B7 @& t. r/ evoid delay1ms(long  i)2 X8 m' A+ E- F
{
1 n8 ~! G1 l% R! j    long  j;3 Q, C, Z, u4 o' o  l( R
    for(j=0;j<i;j++)
6 D- ]8 [( ^! |0 |* }! [    {
1 Q6 e  d1 \' `7 {  f- U0 x            delay(70);1 w8 G. b  A+ Y3 c/ _2 T, o6 z
        }8 f; u1 M- W3 y  L. C4 [# h1 o
}
1 N4 o) J; W1 hvoid COM_REC(void) interrupt 4
+ Q6 V& ]& c+ {  E{5 X. B5 t. q: O0 Y5 E+ @
     
, \4 i# C  ]5 \    if(RI)
. M2 x, V% r2 M" v% H    {    //清除串行接受标志位
. r; E, G& L- u$ x        RI = 0;& ?* m6 t  }5 C% h5 I, W
        rec_data = SBUF;  //从串口缓冲区取得数据
/ q* w) T) ?- `8 A: Y* p        if(point<=5)' z1 @) e+ l1 v6 Q2 v" }% T8 c5 f0 m4 Q
        str[point++] = rec_data;
1 _$ Y7 p. |. F7 D
& T+ i. v: m; h6 |& o9 ]    }3 ~8 q1 B0 x0 G5 `

6 W: D' e/ F. `6 o, a5 l! H- W    if(TI)! B% M' x. G- v9 T0 h9 ^$ m- `& R
    { ; ~" T9 e* a& z! H6 c: ?% }! `, X. t$ m
        TI=0;2 A6 g$ Q$ x3 U/ ]' ]! J
    }9 r& u8 B  }& {; [
}
+ \2 F* t) O( {3 U/ l; s( [6 svoid COM_SEND(void)
3 \" o, _  X7 ~6 c  {{
3 v' s0 ]& Z% Y2 K; M% a9 Lfor(point=0;point<=5,TI=1;point++)             //连续发送数据
! J" F! x; a% K; {: v/ D                                      3 b5 Y. o' R: i0 j7 s# k, U
   {
( _: @) |1 X9 K, v" a" r6 D   SBUF=str[point]; //把缓存区的数据都发送到串口# m. @  M+ n* U9 r- D; a2 i
   TI=0;
. m) D' R$ E3 W7 g* e* T   delay1ms(2);% q, J. x2 z9 i' ?$ Z- l$ a6 V
   }
: j. s( X/ F' R5 Z3 v  |+ o1 \   SBUF=Read_OneByte(str[3],str[5],str[2]);8 u! o# ^; S9 k# b3 ~: j5 P8 {0 @' m
   delay1ms(2);
( @( `3 L1 U7 ~4 ^. z; D}1 c. L; L% ~  n2 s. P* ~% o; f+ `
; S$ U+ c; c# C% L9 \

" F( [- \0 {% _6 T, g  [void main()2 K/ G, |9 @- \6 l# z
{
* U! G4 Q. L! r& T6 B    while(1)
7 D6 D+ c0 A8 _# ~  j4 W$ }        {
, C* T# w: ~: ~* h% z- j& n) R/ G        UART_Initial();
+ P; m. }; e+ e" }& F: ~) J: Y                delay1ms(4);
5 t7 A+ m& I8 ~, S) u( c6 D( m                COM_SEND();; f) u  Z  e4 j7 h
                //point=0;
7 z- t/ k) V8 b" O2 b5 \' D                }9 t: H. N7 p. s4 w2 @/ Y! y% s! ?0 s
}
$ r2 j, v, n9 g
8 ~* Z4 G9 u! _5 b3 M 这是串口调试多字符发送接收程序,我想发送例如 5a 06 00 9a 00 01字符串,但在串口调试助手中接收不到啊

该用户从未签到

2#
发表于 2013-7-22 15:45 | 只看该作者
你可以先试试看  那个串口板是不是好的
, H8 R4 N, ]3 [  P. Y9 ]+ |/ v' m外围供电 把RXD TXD短一下

该用户从未签到

3#
 楼主| 发表于 2013-7-23 08:48 | 只看该作者
幸福万岁 发表于 2013-7-22 15:45
6 K# p5 j% B$ X6 c# r( q) {3 ^你可以先试试看  那个串口板是不是好的
1 K# m* }; F9 U: z- l外围供电 把RXD TXD短一下
/ G5 m, X0 S* @6 T- J
板子没问题

该用户从未签到

4#
发表于 2013-11-15 01:46 | 只看该作者
#include "Include.h"
# G  h- i4 S6 y/ v1 g' l9 _
2 Q9 g8 t# g7 r* l  {unsigned char xdata uart_rx_buf[128];! y* ?$ U# f5 w/ N" g* z
unsigned char xdata uart_tx_buf[128];
/ I7 y& ?+ Y1 Vvolatile UART_T xdata uart;- ^! z0 c5 t* y* T4 {1 r2 _& W/ d
unsigned char xdata uartGetBuf[8];5 |6 S. n6 r3 m5 M2 P
unsigned char RxCmdPt,RxCmdTimeOut;( ?: Z' c  o) Z  c$ f, d) y  n

7 _# `1 N0 s* g1 D( }static void Serial0(void)interrupt 4 using 1
: D! {/ D* t( F! o/ Q{
$ h$ t9 C2 C2 \1 R    unsigned char temp,head;# j) ~- A8 y5 P

0 ~4 s- I+ ]% @0 t4 ?, F    if(_testbit_(RI))
- `" E# W2 X/ F0 D; ]5 e$ U- a    {
% s4 E. D& |, E! V* z: Q: [8 N        temp = SBUF;
3 a9 x: I/ u5 A1 q* Q5 N, @/ i        head = RBUF_NEXT_PT(uart.rx.head,sizeof(uart_rx_buf));
- f) Z# T: K: w- G5 R        if(head != uart.rx.tail)( }; r( h' h; S! w6 r
        {
, l/ L1 e! _# e4 T5 x4 `            uart_rx_buf[uart.rx.head] = temp;1 m1 h4 _- w" S1 _1 W" _" P
            uart.rx.head = head;
5 E8 W& K3 C2 _9 W% t% a        }else8 a. m3 s9 d1 S* v' G$ M7 D
        {1 Z! R- k( E- U
            uart.rx.error = 1;2 q. ~% s/ R% {
        }
) g  e6 j5 [) O! @, E# ?: w0 i4 r7 ^    }
- z) P9 w& H" [0 }    if(_testbit_(TI))
* o' `0 a1 E; |7 g    {1 O2 R/ p: v6 z
        if(uart.tx.head == uart.tx.tail)
9 h! [+ Z1 [% g8 L0 v. D        {
6 j7 z+ b# `  n+ y4 s! t0 l            uart.tx.busy = 0;
5 u9 b8 I9 a7 }1 v; |- J        }else
" r" V% b1 V' ]3 T+ h! m        {
$ ?4 g3 w  j8 o. j: V3 V" Y            SBUF = uart_tx_buf[uart.tx.tail];
, M- d3 N2 D0 T9 b! x            uart.tx.tail = RBUF_NEXT_PT(uart.tx.tail,sizeof(uart_tx_buf));
0 r! @. l) I: n# t8 _0 M        }/ E, o9 V, u# s8 \* K: h
    }* L: ^4 `+ h$ z9 c- }
}% f" ^! c! _! M7 t2 P) F& g
//函数  串口中断初始化, ~7 z3 B/ t6 m
extern void UartInit(void)" n7 ^) ]# T: K, Y. b3 T0 A
{
# u0 Q# H& w* F7 p( s8 {    RCAP2L = -(XTAL/32/BaudRate_9600);
; l# L" K5 ^( R  r8 D    RCAP2H = (-(XTAL/32/BaudRate_9600))>>8;
3 A, X6 X& i1 q( [* d4 d" J+ J* Z! Y4 |4 p
    T2CON = 0x34;/ y, o, _; j- l; u- \2 P
    SCON  = 0x50;
1 M0 S/ D6 A% C, C2 M
) X; k# }3 Y; W; m    IP |= 0x10;     //serial 0 high priority
" a0 `4 T6 T! u1 {6 m1 L# r    IE |= 0x10;     //enable serial 0  {& L. T! m+ Y- r% V

, q2 q: |: p$ I* |    memset(&uart,0,sizeof(uart));) t( P3 ^* @) k& s+ \
}( t3 B* e) K0 J4 J1 h* Y
// put char
3 h/ ]  u" t$ n* f! O9 Nextern char Putchar(uchar c)' n. W, Z7 l" w/ f% C, d
{: F* G* Z1 s4 g1 P
    unsigned char head;
- |: e+ F4 P/ _3 n5 a2 Y
; V6 V0 S0 P- Y8 G    head = RBUF_NEXT_PT(uart.tx.head,sizeof(uart_tx_buf));2 e9 h/ O8 s! k, ~0 A% Z5 N
    uart_tx_buf[uart.tx.head] = c;; C( W4 l$ B$ U% H5 t
    uart.tx.head = head;6 @  e. P8 ]0 Y8 _

6 D7 ~/ t3 r. r& `8 L8 S& F8 J    if(uart.tx.busy != 0x5a)
0 q. T0 U$ T- a/ k+ k( ?" u    {
: S2 P1 U1 K9 m0 v' W        uart.tx.busy = 0x5a;" r* N. X* R/ L7 G
        TI = 1;# u1 \; f* W$ r5 [  R
    }4 O1 q, m1 z4 X5 v+ U" f
    return c;4 A# n' p5 t& }/ z  @
}
% `9 P$ [4 N' C! g//函数 判断串口是否有数据传进来" z/ S& q0 K! c' n4 r- R/ F
//     如果有,进行接收数据
  T9 V  }5 U+ x; b/ K5 @4 Yextern uchar GetRxBufSize(void)
7 F7 G1 u* w+ Q& y$ ]9 ~4 z{8 w! W2 g7 T: e( t4 |( S/ a0 s8 j" _  C; \
    unsigned char head;9 s+ \. o5 E& d& ^
5 H4 g  r: j4 w- M* Z' J0 h, n1 y* a, s
    head = uart.rx.head;  A9 }  W2 n: M8 |
    if(head < uart.rx.tail); }; P7 O0 W3 ^- q3 b; X
    {% T. h, N' g& j, W+ m
        return (sizeof(uart_rx_buf) - (uart.rx.tail - head));
. a9 W  e$ I& C( z" E# b; P    }else
) {( h" `/ U9 J7 d8 t0 _    {% [7 ^0 K$ F: h- |1 [; r3 z) d
        return (head - uart.rx.tail);- Y! ?2 n: z$ I7 u
    }
; K9 \( U+ D" I4 W}8 a2 n4 p5 Y& U- F- h4 \- x2 l
//函数 从串口缓冲区取数据,只取前8个字节的数据
# B! ^" Z2 [3 t7 e5 G0 d4 _! mstatic void EnterRxCmdModeByPc(unsigned char c)
4 u3 W/ `( E5 A' B; c{9 s* @/ J! F, R4 L+ N  c; o$ s  H5 x
    if(RxCmdPt < 8)
, z: x  w6 Y- }9 i    {
, P( N' x& }' O% q7 l: ~1 b& f% G        RxCmdTimeOut = 10;2 W7 _: N' r2 P! J5 u: Z5 Q
        uartGetBuf[RxCmdPt] = c;- q% B, z* K- K9 N" p' \; K: P
        if(memcmp(uartGetBuf,Updat,3)==0)
* a8 @% D/ f7 a  Z" P) t; M# C        {0 N5 c" i9 f0 u. z9 x$ t  W
            EnterIspMode();# r+ [" o3 X- x; b6 j8 v9 Y1 S
        }  P5 X: S. \3 x/ T$ J
        RxCmdPt ++;
3 X. [" q5 F  E0 s2 x6 F    }
0 L7 D, m( D* ?" R  Q. G0 N4 L}
2 R' i( @; b, @' @$ b3 A//函数 取缓冲区中的数据' {. r9 l/ s; w) g
//返回
8 |8 e8 G; Y) u4 s. p2 J5 vextern uchar Getchar(void)6 C  Y+ q# P" d+ T) U1 K$ D
{
  e+ p, o- h) Q, i) S    unsigned char c;
; t, j7 Z5 O" o4 X+ @+ |2 ^
3 I: T! x2 ]; q% `$ X6 X: h    c = uart_rx_buf[uart.rx.tail];
2 C$ s& S! N3 b0 g    EnterRxCmdModeByPc(c);: \0 U. q  ~. P" \8 |
    uart.rx.tail = RBUF_NEXT_PT(uart.rx.tail,sizeof(uart_rx_buf));2 T1 ?( x' N. \
    uart.rx.timeout = 100;
2 o  n2 Y! C* v3 G7 q' X    return c;: F4 Z4 a  X. I; }# a4 Q& W7 @* H2 b( l2 J
}  m( Y  R" J2 C, ?+ v
//
8 c5 n8 T' @# O1 |! Gextern void UartTimer(void)using 1
) Y( I/ d) j" o( f4 ^' d: q{) K# b8 K1 e5 N* Y4 K" F
    if((uart.rx.timeout)&&(--uart.rx.timeout == 0))% {. t" o" \) ?2 d: H2 \
    {5 H% C3 Q2 C4 V) d9 V( }8 w
              uart.rx.error = 1;. |8 Q8 @4 b5 y
    }
2 y. P" ^; L4 E6 F, G2 D/ t}
$ B! H2 g2 L' \! d//
& W& W" {  h' R- rextern void ClearRxCmdPt(void), s$ F1 I7 K. \0 m
{! ~; f" Y& c) k; B0 r3 ?
    if((RxCmdTimeOut)&&(--RxCmdTimeOut==0))4 L$ V9 c* U% [% H8 `2 i$ T/ a. @
    {! e1 I+ \. i# A9 i( d  N; G7 R, x5 N5 }
              RxCmdPt = 0;
8 L+ V( Z& U6 N( N/ _6 E    }5 v5 J/ v/ \/ T; ~( _; t5 O
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-9-10 23:18 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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