c - 从 BLE 接收的数据无法从十六进制转换为字符串(北欧)

标签 c string hex bluetooth-lowenergy nrf51

在 ble_app_template 的 on_ble_evt(ble_evt_t*) 函数中,我添加了“BLE_GATTS_EVT_WRITE”的情况。其中有以下代码:

    case BLE_GATTS_EVT_WRITE:
    { 
        ble_gatts_evt_write_t * p_evt_write = &p_ble_evt->evt.gatts_evt.params.write;
        SEGGER_RTT_printf(0, "Length = %d \n", p_evt_write->len);
        int n;
        char* buf2 = "";    
        char* buf3 = "";    
        count += p_evt_write->len;
        for(n=0; n<p_evt_write->len; n++)
        {
                   SEGGER_RTT_printf(0, "Received[%d] : %X \n", n, p_evt_write->data[n]);
                   SEGGER_RTT_printf(0, "Received[%d] : %d \n", n, p_evt_write->data[n]);
                   if(n>0){                                                     
                       sprintf(buf2, "%s", ((char*)p_evt_write->data[n]));    
                       strcat(buf3, buf2);
                   }                                                    
                   else{                                                
                       sprintf(buf2, "%s", ((char*)p_evt_write->data[n]));   
                       strcpy(buf3, buf2);
                   }
                   SEGGER_RTT_printf(0, "buf2 string: %s \n", buf2);
                   SEGGER_RTT_printf(0, "buf2 hex: %X \n", buf2[0]);
                   SEGGER_RTT_printf(0, "buf3 in string: %s \n", buf3);
                   SEGGER_RTT_printf(0, "count: %d \n", count);
        }
   }

我正在从 p_evt_write->data[n] 中存储的 BLE 接收十六进制值。我想将所有这些收到的十六进制值连接成一个字符串,并将其存储在“buf2”中。

但是我在 sprintf 行收到错误。当我在 sprintf 中输入“%X”时,这些值不会转换为字符串,因为 buf2/buf3 字符串不会打印任何内容。当前代码

sprintf(buf2, "%s", ((char*)p_evt_write->data[n]));

返回错误“错误:从不同大小的整数转换为指针[-Werror=int-to-pointer-cast]”。如果我删除了 (char*) 类型转换,它会返回错误“错误:格式“%s”需要“char *”类型的参数。

我看到p_evt_write->data[n],其中数据声明为

uint8_t                     data[1];

我目前使用Nordic的nRF51DK配合Eclipse IDE和SEGGER RTT JLink进行调试。所有打印均以 SEGGER RTT 打印。 (printf不起作用,使用SEGGER_RTT_printf代替打印)

如何成功地将所有十六进制值连接在一起形成一个字符串?谢谢。

最佳答案

要附加到缓冲区,您可以使用以下命令:

size_t total_len = 0;
uint8_t buf = NULL;

while (receive()) {
    size_t len = p_evt_write->len;
    buf = realloc(buf, total_len + len);
    memcpy(buf + total_len, p_evt_write->data, len);
    total_len += len;
}
<小时/>

要将 uint8_t 数组转换为以 NUL 结尾的字符串,请分配足够的空间,复制字节并附加 NUL。

char* s = malloc(total_len + 1);
memcpy(s, buf, total_len);
s[total_len] = 0;

当然,如果 buf 的任何元素是 NUL (0),您将看到一个被截断的字符串。没有办法解决这个问题(除非去掉 NUL)。

<小时/>

请注意,->data 不包含“十六进制值”。十六进制是数字的文本表示形式。你没有十六进制;你有数字。这很好,因为这意味着不需要转换。您只需复制字节并添加 NUL。

请注意,您遇到的具体错误是因为您将 uint8_t (数字)转换为 char* (指针)。这是没有意义的。您可能想要 (char*)(&(p_evt_write->data[n])),但这也行不通,因为 %s 并不简单期望一个指向字符的指针,但指向以 NUL 字符结尾的序列的第一个字符的指针。

关于c - 从 BLE 接收的数据无法从十六进制转换为字符串(北欧),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47118223/

相关文章:

C + 外部声明 - 将它们放在哪里

javascript - 如何将数组写入的字符串转换为真正的数组?

C 字符串段错误

c - 通过函数时获取垃圾而不是变量

c - 打印指针到指针

javascript - 使用 Object.keys() 与 Object.values() 从对象属性创建数组

sed - 在 awk 或 sed 中将十六进制转换为十进制

c - 如何将 Basys mx3 计时器从十六进制更改为十进制

java - 将十六进制转换为特殊字符 (Java)

c - fread() 无法正常工作?