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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    如题,只发一次就不发了。单片机代码如下:
    " h0 x# m! j8 \6 F3 u& ^! k& m* ]% p* T: r) E, N1 o
    void serial_port4_initial(){" P( \2 f3 {9 S- z- L" D' Q

    1 Y  }5 w" `+ c        S4CON = 0x10;                //8位数据,可变波特率8 o3 R# L& m- L- D- v# f
            S4CON |= 0x40;                //串口4选择定时器4为波特率发生器
    9 v2 m7 \. w% M! D        T4T3M &= 0xDF;                //定时器时钟12T模式, T; S7 H$ t. X# j4 f
            T4L = 0xDD;                //设置定时初始值
    6 H2 ]( L% H4 v- a5 q4 V# B( k1 \6 \        T4H = 0xFF;                //设置定时初始值' x' X2 f  J5 ?6 R: N
            T4T3M |= 0x80;                //定时器4开始计时 - Z4 T8 w, j  J
    . w& _6 _1 `: |9 ?
            IE2 |= 0x10;         //ES4 = 1;
    - f$ R1 {1 [- J$ F/ w; z        P_SW2=0x04;         //串口2、3、4的位置
    ; x( V# q, y; h% e- y, ?+ J        EA = 1;) d5 D- p3 W+ @
    ' X% h9 `9 {( l
    }
    & B; j% `! b- s  y# K# c$ ^' [/ C' |6 C5 _- k1 l" n  k; ]( J
    6 a0 g' Y0 s* U( ~
    void send_UART4(uchar dat)! a; W* i  t* B; K# }, l
    {* A! ?" n, X  f2 V3 I9 E& S
             uchar temp = 0;7 B6 \. i3 M4 u9 F( u6 O/ E# M3 q
            0 }! L7 W' l" Q. g" w
    % H* T+ i, g) S* D0 M, Q
            S4CON = S4CON & 0xfd;  //S4TI = 0;' t1 D" Z3 V1 l

    # C1 ~1 V' Y' R. P$ ~; }/ s                S4BUF = dat;) g  i. ^$ O& q% N
                    do
    + O) H+ f* N3 L                {
    " L& J/ I6 C- J                        temp = S4CON;
    6 F5 y) s7 K" w/ c9 Y& U- N) r' d                        temp = temp & 0x02;                //temp=S2TI, b4 a% x5 \0 n" D) F8 }  U
                    }while(temp == 0);
    ( ~$ ~% q2 k  I8 S6 r                S4CON = S4CON & 0xfd;            //S4TI = 0;7 E8 w" k5 }2 C% v  |
            
    - |* Y$ p0 S* _4 g/ w" t/ ~% @8 Y7 `( C( w- E& m. I+ q8 s+ Z
    }
    7 K( b5 ]4 L4 }3 O& |
    / `' Z1 ^/ ]4 k4 L$ l主函数:3 R1 {' l' Q/ ]
    serial_port4_initial();
    + I$ [; e! ^' C, q% h8 f; v: r; f        while(1)
    ) a+ Z, y; |$ e( e        {        , x, j2 p* V9 c, l) _/ ~: \1 `6 ]
      q, e& V! i4 E( \  z

    ) [" @* b0 J" ^# ?% _                delayms(500);9 K- D% X  B" W  _. b3 d1 @
            
    7 {( y% k% y' Q, f                send_UART4(0X28);
      Y+ j+ Y" m& }2 e# Q6 c               
    2 f4 Y6 y, M& b- F$ R/ H$ t        }        
    ( i# ~! K, H$ y意思是500毫秒发一次,结果发一次就不发了。  2 P& ~# X6 U. L) i' _- C" X
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    该用户从未签到

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

    [LV.1]初来乍到

    4#
    发表于 2022-6-28 13:39 | 只看该作者
    既然串口用了中断,就不用再在发送函数中等待发送完成
    ' f, q" U7 _4 M* `) J因为,一旦发送完成,优先是进入中断的,我不知道中断触发后,不清除中断标志位(S4TI),程序会不会是一直卡在中断中
    3 F! o! |3 ~* q5 a个人感觉就是因为S4TI没有清除,而你又开了中断,所以,程序是发送一次之后,中断触发了,就一直卡在中断中出不来了) {' A$ s! K* g8 s9 M6 _
    推荐增加一个中断标志位,然后在中断触发后清除: C4 s# }3 c' w# T6 G1 t# {
    while(busy);busy=1;S4BUF = dat;
    7 K8 C- d+ F% G3 [
    6 r6 o$ l1 K5 S: J' L0 qbusy在串口中断触发后,在中断中清除,并清除S4TI
    # u) Y5 o* d5 M. y; R这样可以提高中断的效率
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-6-20 21:46 , Processed in 0.093750 second(s), 23 queries , Gzip On.

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

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

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