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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    如题,只发一次就不发了。单片机代码如下:' o1 C# o7 q1 \# I+ Y
    . s- t# U9 m, b; V7 s, {/ [
    void serial_port4_initial(){
    8 `9 p7 R* D6 S* l( n+ V* o" P8 y5 n' z" {8 H5 k
            S4CON = 0x10;                //8位数据,可变波特率
    7 _/ s5 ~" v' g) ]        S4CON |= 0x40;                //串口4选择定时器4为波特率发生器
    8 E6 J6 h1 e2 b9 s        T4T3M &= 0xDF;                //定时器时钟12T模式
    4 P+ W. [9 n$ c$ }7 ?/ u        T4L = 0xDD;                //设置定时初始值
    3 m) F! L2 R$ H9 ^- w% C1 _8 w" F        T4H = 0xFF;                //设置定时初始值2 I) }4 l+ `1 Z' R( R" d; W! M
            T4T3M |= 0x80;                //定时器4开始计时
    + S- y; ], {' _
    2 K, q; T. V7 u( U8 g        IE2 |= 0x10;         //ES4 = 1;; d! U  A. m) O2 o& P( }+ c
            P_SW2=0x04;         //串口2、3、4的位置4 _8 d4 g' I0 B) _2 k
            EA = 1;" v" c5 O0 a* ~. R
      f8 v, m7 H: t! q
    }& e/ I1 N, }0 I9 B( e! w/ a* Y
    ) M( x. F5 g) P" I/ M8 Y

    1 e2 {; ^$ u6 a) Xvoid send_UART4(uchar dat)' K2 J: k/ l5 ]; @
    {( b9 j: ~5 o" U* b
             uchar temp = 0;6 E, s- t* P- c! ~, M  c
            
    9 o3 R) d$ j& R2 q; ?+ [3 g. F" L- p
            S4CON = S4CON & 0xfd;  //S4TI = 0;
    & Q# k+ p: {8 y% D6 z3 ^5 L2 |4 w; ~+ g3 k8 @
    % ?5 M4 x' g- d6 T8 j                S4BUF = dat;+ ?# F7 q* N+ q
                    do, @" n1 F4 V9 s1 L% F8 W
                    {
    / M9 @4 v' s' g. ~                        temp = S4CON;
    ' \3 N+ q" z- f5 @                        temp = temp & 0x02;                //temp=S2TI
    - n' ?. f/ u! d5 r( E" m) v4 g                }while(temp == 0);9 M* d  ?% S8 V% J# r
                    S4CON = S4CON & 0xfd;            //S4TI = 0;
    1 \' J3 X( C3 c( _$ e) g8 C        4 H/ A. m" i0 x% F; l
    , P3 @1 [/ g+ o) j# x
    }* V+ ~  N3 {. x6 a- w

    . b7 U* J3 P+ m+ o- w8 I8 K  Q3 E主函数:7 _7 x* k/ f) r  \2 |6 o+ T
    serial_port4_initial();
    ! X' f, ^0 `  o+ i$ D0 R  [3 A        while(1)
    4 o1 `$ c$ {. L, {        {        
    ! a+ i, W" A2 l7 F6 @* f+ f) |' P' X' Q
    4 P' P* j. G9 k; T, Q3 D1 R
                    delayms(500);: \; b" _! f6 n# {; M
            
    ! l+ R# K, \! K* m5 v                send_UART4(0X28);* f& {4 q9 A( y% V6 ^( e
                    2 Q7 h( J* x- A$ |, ~8 w: Y  N* Q
            }        
    2 d/ ^9 `) X- P% K1 f意思是500毫秒发一次,结果发一次就不发了。  / B; B2 D1 O9 B6 S3 \2 k
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    该用户从未签到

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

    [LV.1]初来乍到

    4#
    发表于 2022-6-28 13:39 | 只看该作者
    既然串口用了中断,就不用再在发送函数中等待发送完成( H7 E6 ]2 N% {& Q
    因为,一旦发送完成,优先是进入中断的,我不知道中断触发后,不清除中断标志位(S4TI),程序会不会是一直卡在中断中1 a+ s# }1 Y( L. b% `9 d2 j
    个人感觉就是因为S4TI没有清除,而你又开了中断,所以,程序是发送一次之后,中断触发了,就一直卡在中断中出不来了' H  L/ p! ?9 Q' m* Y( G
    推荐增加一个中断标志位,然后在中断触发后清除
    4 _1 z( q0 v( T( n' _' _4 fwhile(busy);busy=1;S4BUF = dat;8 r/ ~5 B: Q* C( U
    ; ]7 S+ j% G/ O4 x9 Z7 V+ ^
    busy在串口中断触发后,在中断中清除,并清除S4TI
    5 Y! E9 m/ b  \& k' d4 V这样可以提高中断的效率
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-8-24 11:05 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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