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

STC32 串口2收发问题请教!

[复制链接]

1

主题

9

回帖

55

积分

注册会员

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

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

使用道具 举报 送花

1

主题

9

回帖

55

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-06-16 09:23:00

26

主题

1037

回帖

3946

积分

超级版主

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

1.png

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

使用道具 举报 送花

1

主题

9

回帖

55

积分

注册会员

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

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

点评

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

使用道具 举报 送花

1

主题

9

回帖

55

积分

注册会员

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

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

使用道具 举报 送花

1

主题

9

回帖

55

积分

注册会员

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-06-16 09:23:00

26

主题

1037

回帖

3946

积分

超级版主

积分
3946
发表于 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

回帖

55

积分

注册会员

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

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

使用道具 举报 送花

1

主题

9

回帖

55

积分

注册会员

积分
55
发表于 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;

点评

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:57
  • 最近打卡:2025-06-16 09:23:00

26

主题

1037

回帖

3946

积分

超级版主

积分
3946
发表于 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, 2025-6-17 02:04 , Processed in 0.587140 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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