看看错在那里
[i=s] 本帖最后由 yupengfei 于 2009-12-24 01:18 编辑 [/i]刚完成了一个用P1302的项目样机,想把在实际中遇到的较为迷惑的问题写出来,让大家交流,今天先写一点!
P1302接收到刷卡读头发来的数据存在一个 byte a[9] 中,约定数据协议为
a[0] 为卡类型,后面8个字节为数据,现在P1302要分别对不同的卡进行处理,处理程序片断为:
public void doCard(byte a[]){
if(a[0]==0x01){ //处理类型1的卡
doType1(a);
return;
}
if(a[0]==0x02){ //处理类型2的卡
doType2(a);
return;
}
if(a[0]==0x04){ //处理类型3的卡
doType3(a);
return;
}
if(a[0]==0x08){ //处理类型4的卡
doType4(a);
return;
}
if(a[0]==0x10){ //处理类型5的卡
doType5(a);
return;
}
if(a[0]==0x20){ //处理类型6的卡
doType6(a);
return;
}
if(a[0]==0x40){ //处理类型7的卡
doType7(a);
return;
}
if(a[0]==0x80){ //处理类型8的卡
doType8(a);
return;
}
doErr(); //出错,异常的指令
}
以上处理程序片断,有一处是错误的,请指出
你能找出来吗? 帮你放到 code 块里。 暂时还没看出有什么问题 :([code]
public void doCard(byte a[])
{
if (a[0] == 0x01) { // 处理类型1的卡
doType1(a);
return;
}
if (a[0] == 0x02) { // 处理类型2的卡
doType2(a);
return;
}
if (a[0] == 0x04) { // 处理类型3的卡
doType3(a);
return;
}
if (a[0] == 0x08) { // 处理类型4的卡
doType4(a);
return;
}
if (a[0] == 0x10) { // 处理类型5的卡
doType5(a);
return;
}
if (a[0] == 0x20) { // 处理类型6的卡
doType6(a);
return;
}
if (a[0] == 0x40) { // 处理类型7的卡
doType7(a);
return;
}
if (a[0] == 0x80) { // 处理类型8的卡
doType8(a);
return;
}
doErr(); // 出错,异常的指令
}
[/code] [i=s] 本帖最后由 yupengfei 于 2009-12-24 10:37 编辑 [/i]
[b]回复 [url=http://www.study-bbs.com/redirect.php?goto=findpost&pid=88438&ptid=29798]2#[/url] [i]tomsu[/i] [/b]
对了,补充一下,这是JAVA代码!但上面的一个片断是错误的,呵呵,大家加油,再找找,这个BUG可是花了差不多半个通霄才找到的哦!等这个问题解决了,我会陆续把我遇到最精采的与大家分享!后面还很多哦!加油:victory: 支持小鱼,大家积极参与啊 支持小鱼,大家积极参与啊 错在类型8,
Java byte 类型的取值范围是-128~127 用C 看 也没什么问题啊 [b]if(a[0]==0x80){ //处理类型8的卡
doType8(a);
return;
}[/b]
==操作符会自动将类型转换为整型;你应该先手动将类型转换为整型,再进行判断,以避免错误;
int value = a[0]&0xFF;
if(value == 0x80){
.....
} 主要是 JAVA 没有 无符号类型 (unsigned) 。
在使用单字节变量存放 无符号变量时 高位bit 就会被当作符号位,
所以引用这类变量时,一般要把它重新放到更大的类型里,比如:[code]int firstByte = (0x000000FF & ((int)buf[index]);[/code]上面指出的问题的关键是常量 0x80 会被当作int型数据,也就是数值就是 0x80;
而byte里存放的数据高位bit会被当作符号位。 呵呵,还有这种问题,没想过 有点意思 [b]回复 [url=http://study-bbs.com/redirect.php?goto=findpost&pid=88484&ptid=29798]9#[/url] [i]tomsu[/i] [/b]
或者这么写,也可以
[code] if (a[0] == (byte)0x80) { // 处理类型8的卡[/code] 道兄的这行代码写的好啊,
即简洁又明了 对的,看来人多就是力量大!
所以也给大家一个建议,在高层的应用时,最好用文本来表达数据,这也就是为什么XML这么流行的原因,象上述这么隐藏的BUG,初看起来没有什么问题,特别是在单片机中写程序是完全正确! C也是一样的。 关系到编译器的一个选项 char = unsigned char? 比如ADS1.2里面就有这样的选项 还是人多力量大啊 学习了,不会JAVA 学习学习:) 新人来顶一下技术贴。 小鱼的代码写得蛮规范的。
一般代码写得规范的,可以避免很多逻辑错误。
不过这种数据类型的错误,就是经常出问题的陷阱了。
我也同意tomsu 的看法,强制类型转化,清晰明了不出错
页:
[1]
2