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

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

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

    [LV.1]初来乍到

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

    EDA365欢迎您登录!

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

    x
    如题,只发一次就不发了。单片机代码如下:
    " w6 e, V0 c. k# u
    ) e$ G/ q# V7 `void serial_port4_initial(){! W2 T+ r' V1 T( Q$ \4 l

    " k. p, q5 K' U" ^  {2 e        S4CON = 0x10;                //8位数据,可变波特率
    % g" G( R. y: O# p, H  e        S4CON |= 0x40;                //串口4选择定时器4为波特率发生器) c$ ?4 j3 C$ H( D, H' M$ j
            T4T3M &= 0xDF;                //定时器时钟12T模式
    # ]. P/ v- c" a( d        T4L = 0xDD;                //设置定时初始值
      s( e* I) B1 I  R        T4H = 0xFF;                //设置定时初始值
    / ?* x) b+ m! ^  B: h        T4T3M |= 0x80;                //定时器4开始计时
    1 g1 k+ u3 x+ W5 u
    3 `7 E* h4 {4 g) y* M        IE2 |= 0x10;         //ES4 = 1;4 N7 T5 ^: J4 |) I6 p- Y( s
            P_SW2=0x04;         //串口2、3、4的位置
    : w+ L3 D: k' D  n& M1 R7 ]$ Z        EA = 1;
    + J* B* l# x  o$ C4 H& m
    ! J  C& P- n& L9 m& c! M}
    + {( k- B6 A$ Q. F6 A4 [6 O
    7 ~& p! t7 ~/ n, n! d3 R
    # ?( w+ {+ L+ c1 M4 k* t) h- R" Evoid send_UART4(uchar dat). f5 r9 Z& v2 @. q- S
    {
    ( h" D! C- |- ]5 N7 `         uchar temp = 0;' s0 o# s/ x8 J% y* E3 g6 Q) p
            7 w; B. P7 k7 L8 c
    # J& W$ w1 S4 r  i
            S4CON = S4CON & 0xfd;  //S4TI = 0;& n9 z+ w3 B/ n

    % E  z2 r2 Z1 F2 @8 K. z) n# H                S4BUF = dat;
    5 J. |) T% F3 V0 h7 d                do9 Z* b; e4 z" h- q
                    {1 R+ M4 K+ v/ I3 J3 T) ~6 A! U+ ]7 N$ Y
                            temp = S4CON;
    " r$ e) S2 l8 Y) D9 @7 K+ J0 r                        temp = temp & 0x02;                //temp=S2TI
    " j5 I! T# f9 p  `" N+ {: m7 z  R                }while(temp == 0);6 P0 l& S( ~# `. ^
                    S4CON = S4CON & 0xfd;            //S4TI = 0;
    ' f  z6 O( w* ]% N' i$ X        ; j6 H+ ~9 A  z7 j& l+ k

    , o% W2 T" e7 u8 d. l( s+ `. y}
    ) R; d5 X- Y3 D3 c4 n
    ( z; V# D/ s5 C主函数:
    * M6 C' Z' s$ j+ L1 D$ Mserial_port4_initial();" {  b+ X# v3 `1 W. i( [* `# F( N- c
            while(1)
    ; V. \! e& T/ Q- Q3 p) j+ u* v. C        {        
    ; q3 Z) e7 o7 G0 X. Q2 T* i$ f8 e) Y4 K, a

    ) Z" d  D" Y" T# s1 ]# u! U) m                delayms(500);
    2 V# |# q. j* C4 M        / z( F5 f2 ]) @
                    send_UART4(0X28);
    , M" W1 _! u$ _' x, U" d                , s4 F. l8 Y" _9 @/ Q
            }        ; D: x9 l& u0 q, x# j6 V+ Z
    意思是500毫秒发一次,结果发一次就不发了。  
    & `" v. ~2 L+ @: c7 |
  • TA的每日心情
    开心
    2022-1-29 15:03
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    该用户从未签到

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

    [LV.1]初来乍到

    4#
    发表于 2022-6-28 13:39 | 只看该作者
    既然串口用了中断,就不用再在发送函数中等待发送完成& v3 j; @/ S/ U4 V( b" v
    因为,一旦发送完成,优先是进入中断的,我不知道中断触发后,不清除中断标志位(S4TI),程序会不会是一直卡在中断中
    6 s; K. Q: y0 Y) P8 X个人感觉就是因为S4TI没有清除,而你又开了中断,所以,程序是发送一次之后,中断触发了,就一直卡在中断中出不来了1 s* \' x. q% n. E2 V9 O; x
    推荐增加一个中断标志位,然后在中断触发后清除
    ) \3 r7 H5 k" [% t4 I2 y& l' r) _while(busy);busy=1;S4BUF = dat;, P' _% J3 U* H2 z  ~! O. \
    : k6 R/ d  F& f  T$ `6 C/ H3 w
    busy在串口中断触发后,在中断中清除,并清除S4TI1 A8 k8 X+ X" D( ]0 Z6 Z
    这样可以提高中断的效率
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-8 18:28 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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