如何在 C 中将字符串拆分为固定长度的小块以从 Arduino BLE 发送?

编码器

我正在尝试将长字符串数据从我的 Arduino BLE 程序发送到我的 android 应用程序。如何将长字符串拆分为 20 个字节的块以发送到应用程序。

char data[] = "lat:29.459612,lon:44.011856,speed:0.75,sats:9";
char sendBuffer[20];
int len = sizeof(data);
int buflen= sizeof(sendBuffer);
int i = 0;
for (i=buflen; i<len+buflen; i=i+buflen) {
  memcpy(sendBuffer,data,i);
  *data= *data+i;
  ble.print("AT+BLEUARTTX=");
  ble.println(sendBuffer);
  delay(10000);
}

但我没有得到预期的结果。感谢您的任何帮助!

克雷格

不知道关于 Arduino 和 BLE 的第一件事,我只能为您正在做的实际数学提供帮助,这是错误的。

先说几个小点:

char data[] = "lat:29.459612,lon:44.011856,speed:0.75,sats:9";
char sendBuffer[20];

int len = sizeof(data); // HERE
int buflen= sizeof(sendBuffer); // HERE

这两个都应该是size_t类型。除此之外,除非您计划发送字符串的终止 nullchar 字符,否则发送的实际数据大小应该比现在少一,您可以通过简单的减法或通过strlen.

除此之外,这是完全错误的:

for( i=buflen; i<len+buflen; i=i+buflen){
    memcpy(sendBuffer,data,i);
    *data= *data+i;
    ble.print("AT+BLEUARTTX=");
    ble.println(sendBuffer);
    delay(10000);
}

您发送的字符串是 45 个字符。此循环从 20 开始。因此,您的第一次迭代memcpy将执行以下操作:

memcpy(sendBuffer, data, 20);

但是,第二次迭代会这样做:

memcpy(sendBuffer, data, 40);

第三:

memcpy(sendBuffer, data, 60);

但到那个时候,你早就调用了未定义的行为。

此外,您尝试使用指针数学增加源缓冲区起始位置是错误的,看起来您试图“修复”修改非左值的问题。即看起来你第一次尝试这个:

data = data + i;

当这不起作用时,您将其推*到每个 前面data,它会编译,因此您可以运行它。相信我。C不是一种你想扔在墙上看看是否有什么东西粘住的语言。

最后,我高度怀疑您的println成员需要一个以 nulchar 结尾的字符串,而您没有提供。


以下代码解决了上述所有问题。它只是转储到控制台。您必须根据发送它的需要对其进行定制......无论在哪里。

例子

#include <stdio.h>
#include <string.h>

int main()
{
    char data[] = "lat:29.459612,lon:44.011856,speed:0.75,sats:9";
    char buffer[21] = {0}; // note space for terminator

    size_t len = strlen(data);      // doesn't count terminator
    size_t blen = sizeof(buffer)-1; // doesn't count terminator
    size_t i = 0;

    // put up a header row so you can see the output in columns
    for (i=0; i<blen; ++i)
        printf("%zu", i%10);
    fputc('\n', stdout);

    // the actual loop that enumerates your buffer
    for (i=0; i<len/blen; ++i)
    {
        memcpy(buffer, data + (i*blen), blen);
        puts(buffer);
    }

    // if there is anything left over
    if (len % blen)
        puts(data + (len - len % blen));

    return 0;
}

输出

01234567890123456789
lat:29.459612,lon:44
.011856,speed:0.75,s
ats:9

请注意,我们永远不会覆盖该发送缓冲区中的第 21 个字符,它被初始化为 0,因此它总是被终止。此外,我们直接从源字符串中提取短帧(如果有)作为最后一个操作。

我把实际的发送逻辑集成给你。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在JavaScript中将字符串的字母切成固定长度的较小块?

来自分类Dev

如何将字符串拆分为固定长度的块,而不是在单词之间?

来自分类Dev

如何将字符串拆分为固定长度的行?

来自分类Dev

如何使用php将字符串拆分为非固定长度的块?

来自分类Dev

将数据从启用BLE的arduino发送到iOS应用

来自分类Dev

如何在C#中将字符串拆分为浮点数?

来自分类Dev

如何在Oracle Data Integrator 12c中将字符串字段拆分为几行

来自分类Dev

如何在C#中将字符串拆分为令牌?

来自分类Dev

如何在Object-C中将字符串发送到AppDelegate?

来自分类Dev

如何在 Arduino 中将字符串转换为字符 *?

来自分类Dev

可以通过串行连接发送字符串以使用c ++和arduino打开swtch吗?

来自分类Dev

如何在Arduino的C ++类中的构造函数中分配字符串字段?

来自分类Dev

如何在Arduino C ++中通过引用传递字符串

来自分类Dev

如何让 Qt 中的程序不断向我的 Arduino 发送字符串?

来自分类Dev

如何用Arduino C语言清空字符串

来自分类Dev

我只能通过Flutter Blue发送到Arduino 33 BLE 4字节

来自分类Dev

在Arduino和RPi IOT C#之间通过I2C发送JSON字符串

来自分类Dev

如何以Xamarin形式拆分和发送BLE大于20字节的数据?

来自分类Dev

如何将数据(整数)从 C++ 发送到 Arduino?

来自分类Dev

如何在Snowflake中将字符串拆分为字符?

来自分类Dev

如何在VB.net中将字符串拆分为输入的长度字符串数组

来自分类Dev

从Java向Arduino发送字符串(简单示例)

来自分类Dev

无法将字符串从python发送到arduino

来自分类Dev

如何在 C# 中使用 tcp 发送字符串数组

来自分类Dev

如何在Arduino / C / C ++中将带有布尔值的数组转换为字节?

来自分类Dev

如何使用串行通信将数据作为字符串从 NodeJs 运行时发送到 Arduino 板?

来自分类Dev

固定长度C#的字符串对象

来自分类Dev

生成固定长度的随机字符串(使用C)

来自分类Dev

固定长度C#的字符串对象

Related 相关文章

  1. 1

    如何在JavaScript中将字符串的字母切成固定长度的较小块?

  2. 2

    如何将字符串拆分为固定长度的块,而不是在单词之间?

  3. 3

    如何将字符串拆分为固定长度的行?

  4. 4

    如何使用php将字符串拆分为非固定长度的块?

  5. 5

    将数据从启用BLE的arduino发送到iOS应用

  6. 6

    如何在C#中将字符串拆分为浮点数?

  7. 7

    如何在Oracle Data Integrator 12c中将字符串字段拆分为几行

  8. 8

    如何在C#中将字符串拆分为令牌?

  9. 9

    如何在Object-C中将字符串发送到AppDelegate?

  10. 10

    如何在 Arduino 中将字符串转换为字符 *?

  11. 11

    可以通过串行连接发送字符串以使用c ++和arduino打开swtch吗?

  12. 12

    如何在Arduino的C ++类中的构造函数中分配字符串字段?

  13. 13

    如何在Arduino C ++中通过引用传递字符串

  14. 14

    如何让 Qt 中的程序不断向我的 Arduino 发送字符串?

  15. 15

    如何用Arduino C语言清空字符串

  16. 16

    我只能通过Flutter Blue发送到Arduino 33 BLE 4字节

  17. 17

    在Arduino和RPi IOT C#之间通过I2C发送JSON字符串

  18. 18

    如何以Xamarin形式拆分和发送BLE大于20字节的数据?

  19. 19

    如何将数据(整数)从 C++ 发送到 Arduino?

  20. 20

    如何在Snowflake中将字符串拆分为字符?

  21. 21

    如何在VB.net中将字符串拆分为输入的长度字符串数组

  22. 22

    从Java向Arduino发送字符串(简单示例)

  23. 23

    无法将字符串从python发送到arduino

  24. 24

    如何在 C# 中使用 tcp 发送字符串数组

  25. 25

    如何在Arduino / C / C ++中将带有布尔值的数组转换为字节?

  26. 26

    如何使用串行通信将数据作为字符串从 NodeJs 运行时发送到 Arduino 板?

  27. 27

    固定长度C#的字符串对象

  28. 28

    生成固定长度的随机字符串(使用C)

  29. 29

    固定长度C#的字符串对象

热门标签

归档