将double转换为uint8_t *

时间:2016-04-19 22:01:38

标签: c casting double uint8t

我有一个接受uint8_t *的函数,它应该是一个字符串。 我想向此函数发送一个double。 我在下面尝试过这段代码,但它没有用。

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

但是下面的代码可行,我想要的只是替换字符串" 90"用双变量ABOVE。

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

所以我的意思是没有工作的是函数send_data应该通过蓝牙发送一个字符串到Android手机。如果我像第一个示例代码一样,则正确传递字符串。

注意:我认为这可能是因为传递给第二个参数的数据类型不同。该函数需要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 
)

2 个答案:

答案 0 :(得分:2)

“将双字符串作为字符串发送”可能意味着两种不同的东西。您可能意味着“将双精度的实际现有字节作为字节数组发送”(换句话说,将4.5发送为{0x00,0x00,0x00,0x00,0x00,0x00,0x12,0x40}),或者您可能意为“将double的文本表示形式发送为字符串(IOW,将4.5发送为“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));

答案 1 :(得分:0)

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

ble_nus_string_send(&m_nus, data, 8);

这应该有用。