打印

求验证

[复制链接]
1007|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stayeagle|  楼主 | 2015-12-5 11:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我用STC15系列的单片机 keil编程
最近调试一个程序的时候,用串口通信,通信的协议是模拟红外解码的形式,就是每次通信有四个码,分别是用户码,用户反码,数据码,数据反码
之前试了是可以正常通信的,但有一个码很特殊,当我的数据码定义为0x88的时候,串口接收端判断数据码正常,判断数据反码就进不去了
我定义的方式是先用#define定义再调用
#define code1 0x88
。。。

if((uart[0]==code1)&&(uart[1]==~code1))
{
........
}
类似于这样子

后来我用串口把收到的uart[1]发回到电脑上,是0x77正常,但判断就是不成立

然后我又直接把那个~code1写成0x77,判断正常

然后又改回来,把code1定义成别的,像0x08,判断也是正常的

也就是说,如果把code1定义为0x88,后面的判断语句是写成uart[1]==~code1,判断就会出错,原因不明。。。
如果定义成其他码,就一切正常


查了keil编译出来的汇编语言,发现确实是有不一样的地方,但是本人看不懂汇编,不知啥意思,不过好像是先把寄存器清零再写入的操作,然后判断的时候刚好被清零一样


有没有高手帮忙验证一下!!!!

相关帖子

沙发
stayeagle|  楼主 | 2015-12-7 08:22 | 只看该作者
怎么都没有高手来啊!!

使用特权

评论回复
板凳
dirtwillfly| | 2015-12-7 08:30 | 只看该作者
本帖最后由 dirtwillfly 于 2015-12-7 08:32 编辑

可能被当成有符号数了,负数安位取反符号位不变

使用特权

评论回复
地板
diweo| | 2015-12-7 11:16 | 只看该作者
试试看#define code1 ((unsigned char)0x88)

使用特权

评论回复
5
stayeagle|  楼主 | 2015-12-7 14:31 | 只看该作者
dirtwillfly 发表于 2015-12-7 08:30
可能被当成有符号数了,负数安位取反符号位不变

好像是因为这个,你知道keil编译出来的取反运算是怎么操作的么,是不是用减法求出来反码的

使用特权

评论回复
6
stayeagle|  楼主 | 2015-12-7 14:34 | 只看该作者
diweo 发表于 2015-12-7 11:16
试试看#define code1 ((unsigned char)0x88)

感谢大神,问题好像解决了,加了这句就是把它定义成无符号整型常量了。我试过在127范围内的就可以,但是超过(也就是0x80)就不行了

使用特权

评论回复
7
diweo| | 2015-12-8 07:47 | 只看该作者
stayeagle 发表于 2015-12-7 14:34
感谢大神,问题好像解决了,加了这句就是把它定义成无符号整型常量了。我试过在127范围内的就可以,但是 ...

uart[]是什么类型,应该也要是unsigned char

使用特权

评论回复
8
stayeagle|  楼主 | 2015-12-8 08:10 | 只看该作者
diweo 发表于 2015-12-8 07:47
uart[]是什么类型,应该也要是unsigned char

是的 我定义的一般都尽量用unsigned char

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

1

粉丝