求验证

[复制链接]
 楼主| 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)
 楼主| stayeagle 发表于 2015-12-7 14:31 | 显示全部楼层
dirtwillfly 发表于 2015-12-7 08:30
可能被当成有符号数了,负数安位取反符号位不变

好像是因为这个,你知道keil编译出来的取反运算是怎么操作的么,是不是用减法求出来反码的
 楼主| stayeagle 发表于 2015-12-7 14:34 | 显示全部楼层
diweo 发表于 2015-12-7 11:16
试试看#define code1 ((unsigned char)0x88)

感谢大神,问题好像解决了,加了这句就是把它定义成无符号整型常量了。我试过在127范围内的就可以,但是超过(也就是0x80)就不行了
diweo 发表于 2015-12-8 07:47 | 显示全部楼层
stayeagle 发表于 2015-12-7 14:34
感谢大神,问题好像解决了,加了这句就是把它定义成无符号整型常量了。我试过在127范围内的就可以,但是 ...

uart[]是什么类型,应该也要是unsigned char
 楼主| stayeagle 发表于 2015-12-8 08:10 | 显示全部楼层
diweo 发表于 2015-12-8 07:47
uart[]是什么类型,应该也要是unsigned char

是的 我定义的一般都尽量用unsigned char
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部