标题: 又是一个奇怪的问题,关于单片机串口的程序 [打印本页]

作者: anubis577    时间: 2019-8-27 22:52
标题: 又是一个奇怪的问题,关于单片机串口的程序
是这样的,我想用查询的方式用串口发送数据,结果数据不对,怀疑是发送标志位有问题,我就写了如下测试代码:
SCON |= 0X02;
SCON &= 0XFD;
发送标志位正常清零了,但是!
我写这样:void CF(void){if(SCON&0X02)SCON &= 0XFD; }
SCON  |=0X02;
CF();
这样就不行是为什么
作者: csmyldl    时间: 2019-8-28 01:40
就你这个问题,我亲自加入程序中进行了调式STC15F2K60S2
void cf(void) {if(SCON&0X02)SCON &= 0XFD;}

//主程序
void main()
{
       
SCON|=0X02;     //运行到这步  (0x98)中内容是0x02
cf();                 //运行到这步  (0x98)中内容是0x00


所以不存在你所说的标志位TI不能清除的现象
作者: csmyldl    时间: 2019-8-28 01:49
这是仿真结果

6.png (25.81 KB, 下载次数: 62)

6.png

作者: anubis577    时间: 2019-8-28 10:02
csmyldl 发表于 2019-8-28 01:40
就你这个问题,我亲自加入程序中进行了调式STC15F2K60S2
void cf(void) {if(SCON&0X02)SCON &= 0XFD;}


不好意思,之前代码写错了,之前函数是这样的void CF(void){if(SCON&0X02 !=0)SCON &= 0XFD; },不知道怎样写为什么就清除不了,后来我怀疑是SCON压栈保存了,就又全部使用函数调用也不行,最后我就用贴出来的代码把判断!=0去了就正常了,只是不太理解其中的原因
作者: anubis577    时间: 2019-8-28 10:04
csmyldl 发表于 2019-8-28 01:49
这是仿真结果

感谢回答,代码这样是正确运行的,只是if(SCON&0X02!=0)就无法清除,好尴尬,是不是这个判断有问题
作者: csmyldl    时间: 2019-8-29 11:17
其实这样的逻辑也是可以的,只是语句的优先级未分清,应把if(SCON&0X02!=0)改为if((SCON&0X02)!=0),因为&的优先级低于!=,你那样写是先执行0x02!=0的结果1与SCON进行按位与
作者: anubis577    时间: 2019-8-29 14:27
csmyldl 发表于 2019-8-29 11:17
其实这样的逻辑也是可以的,只是语句的优先级未分清,应把if(SCON&0X02!=0)改为if((SCON&0X02)!=0) ...

刚刚我查了,&作为运算符的优先级是高于逻辑符的优先级的,而且我也试过了加括号,感谢回答




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1