stc32电子 发表于 2023-6-27 16:22:57

STC32 串口2收发问题请教!

本帖最后由 stc32电子 于 2023-6-27 16:24 编辑

用官方例子可以收发。但是为什么变量UART_TXBUSY一定要是BIT 型的呢,改为u8后,发送不正常了,只能仅发一个数据了。不知道为什么么。请教一下。

stc32电子 发表于 2023-6-27 16:26:39

试了好多种方法,想改成U8型,都不成功。只要改成BIT就正常。

zhp 发表于 2023-6-27 16:32:24

这句是否是多余的



串口既然是中断方式,TI标志就必须是硬件自动设置

stc32电子 发表于 2023-6-27 16:35:01

zhp 发表于 2023-6-27 16:32
这句是否是多余的




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

stc32电子 发表于 2023-6-27 16:36:09

zhp 发表于 2023-6-27 16:32
这句是否是多余的




我用标准例程也试了,只要是BIT就可以发送,只要是U8就不行。

stc32电子 发表于 2023-6-27 16:50:18

MCU用的是STC32G8K64

zhp 发表于 2023-6-27 17:14:58

本帖最后由 zhp 于 2023-6-27 17:17 编辑

stc32电子 发表于 2023-6-27 16:35
这个是最后加上去的,各种尝试。都不行。这个改了,也不行啊。。 ...


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



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



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




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


stc32电子 发表于 2023-6-27 17:54:43

zhp 发表于 2023-6-27 17:14
实际测试了一下,如果uart2_txbusy为u8类型
keil编译器会将下面这句优化掉,变成while ();所以会异常



牛牛牛。。。。确实是这个问题。

stc32电子 发表于 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 发表于 2023-6-27 18:04:13

stc32电子 发表于 2023-6-27 17:59
在发布的库函数中,UART.C里面定义的也是U8,并且优化等级也是7,人家就可以。

typedef struct


不同的代码,即使编译器的优化级别一样,优化策略也可能不一样
比如在uart2_txbusy = 1;和while (uart2_txbusy);之间加一个无关的函数调用,可能就又正常了
页: [1] 2
查看完整版本: STC32 串口2收发问题请教!