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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    如题,只发一次就不发了。单片机代码如下:3 s1 u$ L% A+ K( n
    ; ^* P$ S5 s- N3 |- I* I, Y
    void serial_port4_initial(){2 u/ G1 d$ o/ ?
    3 K  P  j& V: d5 a# N
            S4CON = 0x10;                //8位数据,可变波特率
    ( k' W; J' H! `8 f3 G        S4CON |= 0x40;                //串口4选择定时器4为波特率发生器% n/ R! ]) |- \. [# W
            T4T3M &= 0xDF;                //定时器时钟12T模式2 B% h# U! Q) T/ k7 X" u, l* Z
            T4L = 0xDD;                //设置定时初始值* W$ V" |  ?4 S: `
            T4H = 0xFF;                //设置定时初始值
    # p. J- I0 E, W. c, j7 O$ i9 ]        T4T3M |= 0x80;                //定时器4开始计时
    $ H# j' T  D- o! ]) `. j6 z# D( b' p
            IE2 |= 0x10;         //ES4 = 1;7 q. y7 @8 `+ l/ B. ^
            P_SW2=0x04;         //串口2、3、4的位置( a" c  d6 Y( \+ d" X
            EA = 1;( [, [0 M9 r  X* G7 w+ s; Z" ?

    2 Z+ W  G$ H% B, m- x: i. A* K}
    9 O1 u$ M! O1 m+ P. Q/ w; s
    ' ?% l* x  e" j/ I  W) W6 b
    6 O4 L1 B- ^! p3 m. U8 m. Jvoid send_UART4(uchar dat)
      H) M$ E* R0 ~9 ]  y0 v  e{
    - f9 @) O4 y6 L2 P3 d         uchar temp = 0;
    7 U  |" R) H. E9 y8 z, k$ S        
    ! w7 K+ z6 L0 F* T4 k: [% j; l' p9 I1 G9 |, B
            S4CON = S4CON & 0xfd;  //S4TI = 0;; x; m1 o& g: e2 e

    - c0 x% t9 m+ n/ a; L9 `8 I' M                S4BUF = dat;4 O; g1 u& a8 t4 B+ ?0 H0 F( d
                    do
    . W1 ?8 z- J. `' K) {+ i( `                {1 X* z9 N  k! `8 l
                            temp = S4CON;" ~1 C2 q% B+ w& H7 c- F" t
                            temp = temp & 0x02;                //temp=S2TI' U" k, C+ D. Z5 s5 `
                    }while(temp == 0);! p5 s* T% F  I+ L& C5 c" _
                    S4CON = S4CON & 0xfd;            //S4TI = 0;
    7 O3 h+ o0 x1 s+ |7 ~  f. r        
    5 R3 P4 k' P8 y3 H. Y
    $ T/ [  G% [6 z: s7 c0 ~- M}# Y0 [: O2 J3 @+ }, q+ s
    " q' y& ?2 V( D9 K  ?. v
    主函数:9 E0 m- r! K1 n6 @
    serial_port4_initial();
    ) }0 w# L; Q+ ?+ Y        while(1)
    & {- _4 Y9 n* g; T- k  T5 _3 X7 D        {        : ~6 h" w: O: e: y  s
    9 l9 \5 G4 K- o! \- s

    5 T: U# A: c/ j) F4 p# R                delayms(500);1 M/ J8 O" R: H" n8 w* ^9 I6 _- ~
            
    8 Y: D2 H' Q- F$ c                send_UART4(0X28);" M/ r- O5 g# R- d* G
                    5 T+ Q% ^# J# p% H- M4 ?5 ~8 r4 @
            }        ' n* U+ D4 T  m7 ]# d  t
    意思是500毫秒发一次,结果发一次就不发了。  ; y6 q0 G6 C2 T) e! @9 O
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    该用户从未签到

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

    [LV.1]初来乍到

    4#
    发表于 2022-6-28 13:39 | 只看该作者
    既然串口用了中断,就不用再在发送函数中等待发送完成% U; [6 j9 k/ E8 z4 p- q
    因为,一旦发送完成,优先是进入中断的,我不知道中断触发后,不清除中断标志位(S4TI),程序会不会是一直卡在中断中
    % W1 y9 q4 V1 Q) v& C个人感觉就是因为S4TI没有清除,而你又开了中断,所以,程序是发送一次之后,中断触发了,就一直卡在中断中出不来了
    / {- i" U- }4 s: w) ]5 h5 Z推荐增加一个中断标志位,然后在中断触发后清除9 H! f! k& R& R/ R
    while(busy);busy=1;S4BUF = dat;3 I' B& v9 g9 z' Y* k) T

    $ k6 V4 K( r# D* [6 Ibusy在串口中断触发后,在中断中清除,并清除S4TI& [: c/ Z6 |8 G6 S4 N, f
    这样可以提高中断的效率
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

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

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

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

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