今天发生了奇怪的事情。由于一些奇怪的原因,我无法对值进行除法或乘法,甚至只是在将值写入变量后读取值也不起作用。这是有问题的代码片段:
void Turning(heading,desiredheading){
//Boats heading too high
if (heading>desiredheading){
if ((heading - desiredheading) <10 ){
g_ulServoPulse[1]=makeAngle(5);
g_ulServoPulse[2]=makeAngle(5);
}else if((heading - desiredheading) <54 ){
g_ulServoPulse[1]=makeAngle(27);
g_ulServoPulse[2]=makeAngle(27);
}else{
g_ulServoPulse[1]=makeAngle((heading-desiredheading)*0.5);
g_ulServoPulse[2]=makeAngle((heading-desiredheading)*0.5);
}
//Boat is heading too low
}else if(desiredheading > heading){
if ((desiredheading -heading) < 10 ){
g_ulServoPulse[1]=makeAngle(-5);
g_ulServoPulse[2]=makeAngle(-5);
}else if ((desiredheading -heading) < 54 ){
g_ulServoPulse[1]=makeAngle(-27);
g_ulServoPulse[2]=makeAngle(-27);
}else{
g_ulServoPulse[1]=makeAngle((desiredheading-heading)*-0.5);
g_ulServoPulse[2]=makeAngle((desiredheading-heading)*-0.5);}
int temp = desiredheading-heading;
//temp = temp ;
UARTprintf("Wasp\n");
UARTprintf("%d\n", desiredheading);
UARTprintf("%d\n", heading);
UARTprintf("%d\n", (desiredheading-heading));
UARTprintf("%d\n", temp);
//Boat is Just right
}else{
g_ulServoPulse[1]=makeAngle(0);
g_ulServoPulse[2]=makeAngle(0);
UARTprintf("Table\n");
}
}
所以,它只是一个简单的比较器,对某些值的值进行操作。代码中的'temp',temp * 0.5和temp * 2.0,无论是哪种情况,都是巨大而错误的。事实上,即使只写出temp也是错误的,如下面的输出所示。
Wasp
180
177
3
1074266112
Wasp
180
150
30
1077805056
我看不出第二个和最后一个输出是不同的原因。这只是用于输出temp,如上所述,乘法和除法存在相同的问题。
任何见解:为什么会发生这种情况以及如何解决它将不胜感激。
干杯。
编辑: 显然,有一种奇怪的迂回方法可以让它表现出来。
int temp = desiredheading-heading;
temp &= 0xFF ;
让它正确返回。虽然我完全不知道为什么会这样,或者是什么导致了原来的行为。
答案 0 :(得分:3)
我认为所显示的代码与给出的结果之间存在脱节。
UARTprintf("%d\n", temp); --> 1074266112
这恰好就是你得到的错误格式和数据类型 (由于@Daniel Fischer反馈而应用更正)
UARTprintf("%d\n", 3.0); --> 1074266112 = 0x40080000
UARTprintf("%d\n", 30.0); --> 1077805056 = 0x403E0000
请仔细检查温度,标题和所需标题的类型。 另外,temp是通过“int temp = desiredheading-heading;”真正声明和计算的吗? 在“UARTprintf(”%d \ n“,temp)中,它看起来真的很像;”是一个双倍。
风向