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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    如题,只发一次就不发了。单片机代码如下:
    ) g4 a9 @, @: d- O9 X) d- {" b$ }% y% r- I7 i/ v" [
    void serial_port4_initial(){3 g, i; H: {4 T2 c) O4 A# K
    ( U& d4 Z! Q+ i- `% a# U0 w4 U
            S4CON = 0x10;                //8位数据,可变波特率( M3 _. _* [" V+ J
            S4CON |= 0x40;                //串口4选择定时器4为波特率发生器8 g* t: R! G% |9 m0 |7 L3 U; @
            T4T3M &= 0xDF;                //定时器时钟12T模式6 j: [" d4 W2 }# S1 ?9 R! k
            T4L = 0xDD;                //设置定时初始值
    3 E: S" C) Y, G4 t( {5 z        T4H = 0xFF;                //设置定时初始值
    4 `2 L3 c) d9 z        T4T3M |= 0x80;                //定时器4开始计时 : U, u$ a( r0 n: @. x% J( o
    , P, d; O% J- E0 i" [
            IE2 |= 0x10;         //ES4 = 1;
    6 k7 n& B6 \! a# x, m        P_SW2=0x04;         //串口2、3、4的位置+ S7 {7 i7 G: X# A" D
            EA = 1;
      W% A+ c. E  w: ]5 X
    / i2 {+ C4 V1 ]# y5 F6 z! W6 O}) N5 X) o  k5 W- N8 O3 v6 `

    ; v8 r0 L! L5 \5 Z) u% ^$ Q( |' l5 p  u  e4 x* w9 S
    void send_UART4(uchar dat)
    2 t3 h$ A# |% a{! s/ N/ r8 o6 q0 E
             uchar temp = 0;
    / U7 Q* u0 E' v        / h0 l" }3 T1 w& D( x/ U

    % E/ n: g0 K3 U9 z6 A, H' a        S4CON = S4CON & 0xfd;  //S4TI = 0;( F  a6 r4 P  r; C
    6 T1 g0 d. X  w$ G4 z' h# E3 |
                    S4BUF = dat;
    8 E# D$ H% h; Z0 K+ m7 ~1 u                do# k; k" P# s* {1 Z. ~. ]4 _' x( K+ S
                    {
    3 D) c$ D: v( j5 C                        temp = S4CON;
    ; O+ Q, ~; H9 T4 S1 m- }/ [# r                        temp = temp & 0x02;                //temp=S2TI) ~* e, R5 b: W' [+ p1 Q
                    }while(temp == 0);2 {0 t) l! `0 V
                    S4CON = S4CON & 0xfd;            //S4TI = 0;
    7 s6 `' K2 v' X& A; G        
    1 S0 m" J. ^9 c5 s& m
    : k3 v4 t0 i# Q' Q; c7 s}
    8 X& A( I( j, P7 G
    7 P9 `$ U# M6 }1 I6 q主函数:
    - q9 ]6 Y  r! s" xserial_port4_initial();
    : S7 u9 A+ R/ }: o' w6 V4 C! ]+ E        while(1)
    7 q+ \+ e' x0 N# G        {        / Y- x# h8 F7 o  K  j% C; Q( v
    ) S$ Y: b) l% I* y
    8 i7 z9 G. i% m/ ~
                    delayms(500);7 X2 D) x9 k) F+ R/ ]
            2 l/ C+ \" e4 r  u/ r  y
                    send_UART4(0X28);# k& F& V3 `/ C$ {/ u
                    9 C3 g; x( L; c. z2 O
            }        + |; e; v  w. t% T7 O
    意思是500毫秒发一次,结果发一次就不发了。  
    9 _4 Y2 f/ n1 d# t; q. j
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    该用户从未签到

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

    [LV.1]初来乍到

    4#
    发表于 2022-6-28 13:39 | 只看该作者
    既然串口用了中断,就不用再在发送函数中等待发送完成
    ! W* R/ W6 p4 @* L因为,一旦发送完成,优先是进入中断的,我不知道中断触发后,不清除中断标志位(S4TI),程序会不会是一直卡在中断中
    & N( u7 P2 T' j# k个人感觉就是因为S4TI没有清除,而你又开了中断,所以,程序是发送一次之后,中断触发了,就一直卡在中断中出不来了
    & h7 Q: w/ ?6 g5 b' x2 ]推荐增加一个中断标志位,然后在中断触发后清除
    - I% x0 o) y" d$ v( [  ewhile(busy);busy=1;S4BUF = dat;
      _& Y  Q& J4 b" e3 ?* s, T9 \) f3 h/ G' s5 s3 t$ ^1 x0 r
    busy在串口中断触发后,在中断中清除,并清除S4TI
    # \. z' L' P0 B' y6 h- _这样可以提高中断的效率
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-4 18:57 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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