STC32 串口2收发问题请教!
本帖最后由 stc32电子 于 2023-6-27 16:24 编辑用官方例子可以收发。但是为什么变量UART_TXBUSY一定要是BIT 型的呢,改为u8后,发送不正常了,只能仅发一个数据了。不知道为什么么。请教一下。
试了好多种方法,想改成U8型,都不成功。只要改成BIT就正常。 这句是否是多余的
串口既然是中断方式,TI标志就必须是硬件自动设置
zhp 发表于 2023-6-27 16:32
这句是否是多余的
这个是最后加上去的,各种尝试。都不行。这个改了,也不行啊。{:smile:}。 zhp 发表于 2023-6-27 16:32
这句是否是多余的
我用标准例程也试了,只要是BIT就可以发送,只要是U8就不行。
MCU用的是STC32G8K64 本帖最后由 zhp 于 2023-6-27 17:17 编辑
stc32电子 发表于 2023-6-27 16:35
这个是最后加上去的,各种尝试。都不行。这个改了,也不行啊。。 ...
实际测试了一下,如果uart2_txbusy为u8类型
keil编译器会将下面这句优化掉,变成while ();所以会异常
解决方法1:
声明变量时添加“volatile”关键字
解决方法2:
代码优化级别设置为5以下
这应该算是Keil的C251编译器的一个BUG,过度优化
zhp 发表于 2023-6-27 17:14
实际测试了一下,如果uart2_txbusy为u8类型
keil编译器会将下面这句优化掉,变成while ();所以会异常
牛牛牛。。。。确实是这个问题。 在发布的库函数中,UART.C里面定义的也是U8,并且优化等级也是7,人家就可以。
typedef struct
{
u8 TX_send; //已发送指针
u8 TX_write; //发送写指针
u8 B_TX_busy; //忙标志
u8 RX_Cnt; //接收字节计数
u8 RX_TimeOut; //接收超时
} COMx_Define;
stc32电子 发表于 2023-6-27 17:59
在发布的库函数中,UART.C里面定义的也是U8,并且优化等级也是7,人家就可以。
typedef struct
不同的代码,即使编译器的优化级别一样,优化策略也可能不一样
比如在uart2_txbusy = 1;和while (uart2_txbusy);之间加一个无关的函数调用,可能就又正常了
页:
[1]
2