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

时间:2017-05-05 08:32:29

标签: c arduino bluetooth-lowenergy

我正在尝试从我的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);
}

但我没有得到预期的结果。谢谢你的帮助!

1 个答案:

答案 0 :(得分:6)

不知道关于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字符,否则发送的实际数据大小应该比现在少一个,您可以通过简单的减法或通过{{ 1}}。

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

strlen

您发送的字符串为45个字符。此循环从20开始。因此,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); } 的第一次迭代将执行此操作:

memcpy

但是,第二次迭代将执行此操作:

memcpy(sendBuffer, data, 20);

第三个:

memcpy(sendBuffer, data, 40);

但到那时你很久就调用了未定义的行为。

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

memcpy(sendBuffer, data, 60);

当它没有工作时,你在每个data = data + i; 前面推了*,它已编译,所以你用它运行。相信我。 C 不是你想要扔在墙上的语言,看看是否有东西粘在上面。

最后,我非常怀疑你的data成员需要一个nulchar终止的字符串,而你却没有提供。

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

示例

println

<强>输出

#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;
}

注意我们永远不会覆盖那个初始化为0的发送缓冲区中的21&#char;所以它总是被终止。我们也直接从源字符串中选取短帧(如果有的话)作为最后一个操作。

我将实际的发送逻辑集成到你身上。