将双精度转换为 uint8_t*

Convert double to uint8_t*

我有一个接受 uint8_t* 的函数,它应该是一个字符串。 我想向这个函数发送一个双精度值。 我试过下面这段代码,但它不起作用。

double a = 10.98     
uint8_t* p = (uint8_t*) &a;
printf("p: %u \n", p); 
send_data(p);

但是下面这段代码有效,我只想用上面的双变量替换字符串“90”。

static const char *data[6];
data[0] = "90";
static uint8_t *test; 
test = ( unsigned char *) data[dataCounter] ;
send_data(test);

所以我所说的不起作用的意思是函数 send_data 应该通过蓝牙将字符串发送到 android phone。如果我像第一个示例代码那样做,字符串就会正确传递。

注意:我认为这可能是因为传递给第二个参数的数据类型不同。该函数需要 3 个参数。

 static uint32_t send_data(uint8_t data[]){ 
     return ble_nus_string_send(&m_nus, data, 5);
 }

这是函数定义:

uint32_t ble_nus_string_send    (ble_nus_t * p_nus,uint8_t * p_string,
uint16_t    length 
)

此函数调用中的数据大小限制为 5 个字节:ble_nus_string_send(&m_nus, data, 5),而 double 的长度为 8 个字节。将其更改为:

ble_nus_string_send(&m_nus, data, 8);

这应该有效。

"sending the double as a string" 可能有两种不同的含义。您可能是指 "send the actual existing bytes of the double as an array of bytes"(换句话说,发送 4.5 作为 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40}),或者您可能是指 "send a textual representation of the double as a string (IOW, send 4.5 as "4.5")。前者案例将是:

double d = 4.5;
ble_nus_string_send(&m_nus, (uint8_t *)(&d), 8);

这可能不是您想要的,因为您要发送到的应用程序必须以相同的方式期待它,具有相同的字节顺序、相同的浮点表示等。您可能想要第二种情况:

double d = 4.5;
char temp[20];
snprintf(temp, 20, "%g", d);
ble_nus_string_send(&m_nus, (uint8_t *)temp, strlen(temp));