找回密码
 立即注册
查看: 1053|回复: 16

STC32 串口2收发问题请教!

[复制链接]

该用户从未签到

1

主题

9

回帖

51

积分

注册会员

积分
51
发表于 2023-6-27 16:22:57 | 显示全部楼层 |阅读模式
本帖最后由 stc32电子 于 2023-6-27 16:24 编辑

用官方例子可以收发。但是为什么变量UART_TXBUSY一定要是BIT 型的呢,改为u8后,发送不正常了,只能仅发一个数据了。不知道为什么么。请教一下。 STC32 串口2收发问题请教!-1.png
回复 送花

使用道具 举报

该用户从未签到

1

主题

9

回帖

51

积分

注册会员

积分
51
 楼主| 发表于 2023-6-27 16:26:39 | 显示全部楼层
试了好多种方法,想改成U8型,都不成功。只要改成BIT就正常。
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    开心
    2024-5-11 09:06
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    724

    回帖

    2578

    积分

    超级版主

    积分
    2578
    发表于 2023-6-27 16:32:24 | 显示全部楼层
    这句是否是多余的

    1.png

    串口既然是中断方式,TI标志就必须是硬件自动设置
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    9

    回帖

    51

    积分

    注册会员

    积分
    51
     楼主| 发表于 2023-6-27 16:35:01 | 显示全部楼层
    zhp 发表于 2023-6-27 16:32
    这句是否是多余的

    这个是最后加上去的,各种尝试。都不行。这个改了,也不行啊。

    点评

    zhp
    实际测试了一下,如果uart2_txbusy为u8类型 keil编译器会将下面这句优化掉,变成while ();所以会异常 解决方法1: 解决方法2: 代码优化级别设置为5以下  详情 回复 发表于 2023-6-27 17:14
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    9

    回帖

    51

    积分

    注册会员

    积分
    51
     楼主| 发表于 2023-6-27 16:36:09 | 显示全部楼层
    zhp 发表于 2023-6-27 16:32
    这句是否是多余的

    我用标准例程也试了,只要是BIT就可以发送,只要是U8就不行。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    9

    回帖

    51

    积分

    注册会员

    积分
    51
     楼主| 发表于 2023-6-27 16:50:18 | 显示全部楼层
    MCU用的是STC32G8K64
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-11 09:06
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    724

    回帖

    2578

    积分

    超级版主

    积分
    2578
    发表于 2023-6-27 17:14:58 | 显示全部楼层
    本帖最后由 zhp 于 2023-6-27 17:17 编辑
    stc32电子 发表于 2023-6-27 16:35
    这个是最后加上去的,各种尝试。都不行。这个改了,也不行啊。。 ...



    实际测试了一下,如果uart2_txbusy为u8类型
    keil编译器会将下面这句优化掉,变成while ();所以会异常
    1.png


    解决方法1:
    声明变量时添加“volatile”关键字
    2.png


    解决方法2:
    代码优化级别设置为5以下
    3.png

    4.png

    这应该算是Keil的C251编译器的一个BUG,过度优化


    回复 支持 1 反对 0 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    9

    回帖

    51

    积分

    注册会员

    积分
    51
     楼主| 发表于 2023-6-27 17:54:43 | 显示全部楼层
    zhp 发表于 2023-6-27 17:14
    实际测试了一下,如果uart2_txbusy为u8类型
    keil编译器会将下面这句优化掉,变成while ();所以会异常

    牛牛牛。。。。确实是这个问题。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    1

    主题

    9

    回帖

    51

    积分

    注册会员

    积分
    51
     楼主| 发表于 2023-6-27 17:59:18 | 显示全部楼层
    在发布的库函数中,UART.C里面定义的也是U8,并且优化等级也是7,人家就可以。

    typedef struct
    {
            u8        TX_send;                //已发送指针
            u8        TX_write;                //发送写指针
            u8        B_TX_busy;                //忙标志

            u8         RX_Cnt;                        //接收字节计数
            u8        RX_TimeOut;                //接收超时
    } COMx_Define;

    点评

    zhp
    不同的代码,即使编译器的优化级别一样,优化策略也可能不一样 比如在uart2_txbusy = 1;和while (uart2_txbusy);之间加一个无关的函数调用,可能就又正常了  详情 回复 发表于 2023-6-27 18:04
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-5-11 09:06
  • 签到天数: 16 天

    [LV.4]偶尔看看III

    16

    主题

    724

    回帖

    2578

    积分

    超级版主

    积分
    2578
    发表于 2023-6-27 18:04:13 | 显示全部楼层
    stc32电子 发表于 2023-6-27 17:59
    在发布的库函数中,UART.C里面定义的也是U8,并且优化等级也是7,人家就可以。

    typedef struct

    不同的代码,即使编译器的优化级别一样,优化策略也可能不一样
    比如在uart2_txbusy = 1;和while (uart2_txbusy);之间加一个无关的函数调用,可能就又正常了
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-19 06:53 , Processed in 0.075996 second(s), 73 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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