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

请教STC15单片机串口4的发送数据的程序问题

[复制链接]
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 2 天

    [LV.1]初来乍到

    跳转到指定楼层
    1#
    发表于 2022-6-28 11:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

    EDA365欢迎您登录!

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

    x
    如题,只发一次就不发了。单片机代码如下:
    , K5 R3 l5 o& R8 E9 a& q( N, c8 f+ X- M; ?: E; t8 ]
    void serial_port4_initial(){0 x6 j+ N  g+ d# T) |/ S2 n4 U- |) W
    1 U: t! x) S) |
            S4CON = 0x10;                //8位数据,可变波特率
    + z% W2 v! {( Z* B! J' g1 F        S4CON |= 0x40;                //串口4选择定时器4为波特率发生器$ m7 X; z, A7 p3 D/ N
            T4T3M &= 0xDF;                //定时器时钟12T模式
    . ]# Q5 y/ k$ E) n9 [3 w% H% K        T4L = 0xDD;                //设置定时初始值7 Z3 G- S& b( R6 M/ J
            T4H = 0xFF;                //设置定时初始值
    # w, a) q+ K+ I. f3 F# C6 a8 o        T4T3M |= 0x80;                //定时器4开始计时 + q9 r8 f% Q% Q) |& V" d

    7 g. [2 k: r0 P8 c! |' j        IE2 |= 0x10;         //ES4 = 1;
    - r6 W: {/ c7 L        P_SW2=0x04;         //串口2、3、4的位置& n6 X5 r3 O0 U* X
            EA = 1;$ e# K+ z5 E" _% Z1 k& l) @1 ]2 k

    $ h0 \  D- @; ^9 b2 n$ X" U}% V( ?' y- A! _  W

    : k/ Y3 n9 F, z* [7 G3 P" V$ p1 V9 R! s
    void send_UART4(uchar dat)
      c% s. r$ |# n{
    . d1 g3 m4 j/ ?5 m         uchar temp = 0;
    ; f* _) x( m5 f& z        
    / ], P3 f) M3 q' E* J* o1 f3 h1 p  {1 f8 t
            S4CON = S4CON & 0xfd;  //S4TI = 0;
    7 d/ W5 u" E1 p- P
    7 m# F1 \4 t+ n. F& N6 C                S4BUF = dat;
    % Q( |/ |( _# @/ |, K4 {: B                do
    ' k- }) B/ _, g3 o- ?" ]" W                {
    # g  R1 V. ~: z6 ?. ?- I3 J# @                        temp = S4CON;
    + |5 m! J9 E) J                        temp = temp & 0x02;                //temp=S2TI6 u6 _( d- W. J: P' ]) F$ \
                    }while(temp == 0);# ~+ P2 B8 n$ n  o+ V5 Z$ c
                    S4CON = S4CON & 0xfd;            //S4TI = 0;2 D: f6 ~3 N( y+ I3 v( L
            
    $ i  j. O* \' [4 r2 V! F; H  Y0 W) V: t1 X1 W9 }4 k/ y% ^
    }
    6 q5 A$ G# N& ~3 b
    " W( C. }' M6 Q主函数:, e2 G, ^+ o. V4 j
    serial_port4_initial();
    % ~* j0 p* w! B- F        while(1)
    ( F5 X. |: j- c, T& z        {        ) B+ l& M  Q( \% n# j+ j

    / l7 _! t6 S; O" _2 i
    $ l% C8 ~; h  _8 E% `                delayms(500);" K: G+ s4 V' {: w4 z; ?1 H$ X2 W
            + H. w+ m7 k' i- X- A2 W! S. N
                    send_UART4(0X28);
    0 Q- k2 @$ c$ y$ b* S               
    2 D5 i& E: Z$ T        }        
    . O2 C& A5 `9 w" d8 z/ m2 p5 M/ g意思是500毫秒发一次,结果发一次就不发了。  
    6 w; J% I- U+ w1 G5 E
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

    2#
    发表于 2022-6-28 13:13 | 只看该作者
    看下delayms函数,可能是这个函数的问题

    该用户从未签到

    3#
    发表于 2022-6-28 13:27 | 只看该作者
    定义运算,要加";"号于结尾
      F3 V: u1 B: L' m; h#define  UART4_INT_DISABLE() IE2 &= ~(1<<4);        //允许串口3中断
  • TA的每日心情
    开心
    2022-1-29 15:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    4#
    发表于 2022-6-28 13:39 | 只看该作者
    既然串口用了中断,就不用再在发送函数中等待发送完成
    & B* ]  t+ A0 X3 G  ?; Z3 l& Y因为,一旦发送完成,优先是进入中断的,我不知道中断触发后,不清除中断标志位(S4TI),程序会不会是一直卡在中断中
    ( D# R; O/ H& b$ G个人感觉就是因为S4TI没有清除,而你又开了中断,所以,程序是发送一次之后,中断触发了,就一直卡在中断中出不来了" z, X3 [9 F& C4 V0 s! m0 b8 E
    推荐增加一个中断标志位,然后在中断触发后清除/ u; Y- Y! p) \7 M& T# h  k9 S, s
    while(busy);busy=1;S4BUF = dat;' m- u0 `2 s* _/ J
    0 J8 u  Z" y. [5 e( x, I# }& m
    busy在串口中断触发后,在中断中清除,并清除S4TI+ a; O) v5 E3 a1 }+ h: p) A- d! @- X* l
    这样可以提高中断的效率
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-28 22:39 , Processed in 0.078125 second(s), 23 queries , Gzip On.

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

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

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