-4

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

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

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

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

所以我的意思是不起作用的是函数 send_data 应该通过蓝牙向安卓手机发送一个字符串。如果我像第一个示例代码那样做,则字符串传递正确。

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

2 回答 2

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));
于 2016-04-19T23:44:28.120 回答
0

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

ble_nus_string_send(&m_nus, data, 8);

这应该有效。

于 2016-04-19T22:12:15.927 回答