void OPC_N2_data_read()
{
unsigned int32 iobyte[3][4] = {0x00, };
int32 PM_int[3] = {0x00, };
float PM[3] = {0x00, };
int8 i,j,k;
int8 mask = 0x80;
const int16 mask1 = 0x0001;
const int16 mask0 = 0x0000;
int8 trash_byte = 0x32;
output_bit(ss,1);
output_bit(PM_CLOCK_pin,0);
delay_us (1);
output_bit(ss,0);
delay_us (2);
for(i = 0 ; i < 3 ; i ++)
{
for (j = 0 ; j < 4 ; j ++)
{
for (k = 0 ; k < 8 ; k ++)
{
output_bit(PM_CLOCK_pin,1);
iobyte[i][j] = iobyte[i][j] << 1;
if (input (PM_MISO_pin))
{
iobyte[i][j] |= mask1;
}
else
{
iobyte[i][j] |= mask0;
}
if ((trash_byte & mask) >0)
{
output_high(PM_MOSI_pin);
}
else
{
output_bit(PM_MOSI_pin,0);
}
delay_us(1);
output_bit(PM_CLOCK_pin,0);
delay_us(5);
mask = mask >>1;
}
}
}
delay_us(3);
output_high(ss);
for(i = 0; i<3; i++)
{
PM_int[i] = ((iobyte[i][0]<<24)|(iobyte[i][1]<<16)|(iobyte[i][2]<<8)|(iobyte[i][3]));
PM[i] = *(float*)&PM_int;
}
printf ("%x%x%x%x\r\n",iobyte[0][0],iobyte[0][1],iobyte[0][2],iobyte[0][3]);
printf ("%x%x%x%x\r\n",iobyte[1][0],iobyte[1][1],iobyte[1][2],iobyte[1][3]);
printf ("%x%x%x%x\r\n",iobyte[2][0],iobyte[2][1],iobyte[2][2],iobyte[2][3]);
printf ("%lx,%lx,%lx\r\n", PM_int[0],PM_int[1],PM_int[2]);
printf ("%3.5f,%3.5f,%3.5f\r\n", PM[0],PM[1],PM[2]);
}
我从一个4字节数组接收数据。 该数据是一个浮点值。 我通过电脑检查,我看到以下内容。4字节数组转换为浮点数(c)
e911bd41 d867e641 8084e941 e911bd41,d867e641,8084e941 0.00000,0.00000,0.00000
使得四个数据到一个int值正常工作。 PM_int[0],PM_int[1],PM_int[2]
但是,如果您尝试将其转换为浮点值,则只会显示0.00000。
我不知道问题出在哪里。
2016-11-11
이세영
+0
'PM [I] = *(浮子*)&PM_int;'场所严格的锯齿规则。改用'memcpy'。 –
+2
@ user694733:'memcpy'也会打断它们。打字的唯一完全合法的方式是“联合”。尽管如此,OP应该使用适当的(de)序列化,使用bitshifts和掩码到'uint32_t',然后使用'union'。 –
+1
1)不要使用有符号整数作为位移。某些值将调用未定义的行为,对于其他值则会执行定义。 2)使用固定宽度类型的标准类型,没有自制东西!请参阅'stdint.h' –