2017-05-05 27 views
1

我想从我的Arduino BLE程序发送一个长的字符串数据到我的android应用程序。我如何将我的长字符串分成20个字节的块以发送给应用程序。如何在C中将字符串拆分为固定长度的小块以从Arduino BLE发送?

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

我并不感到惊讶,你没有得到你想要的结果(不管那些是什么)。你的代码调用*未定义的行为*。你的memcpy大小参数太大。你的'* data'增量没有意义。你需要一个针对后者的迭代指针,以及前者的适当数学。我承认我不知道'ble'的'println'成员的第一件事,但是如果它需要一个终止的字符串,那也是缺少的。 – WhozCraig

+1

你的sendBuffer在memcpy之后不是空的。 –

+0

@ WhozCraig,@ vivek感谢您的回复。你能不能给我一些建议,或者给我点任何同样的例子,这样我就能得到正确的想法。谢谢 – proCoder

回答

5

不知道关于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类型。除此之外,除非您打算发送字符串的终止空字符,否则发送的实际数据大小应该比现在小,比如您可以通过简单的减法或通过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; 
} 

输出


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

注意我们从来没有覆盖在发送缓冲区,这是初始化为0的的21'st字符,所以它总是终止。我们也直接从源字符串中选取短帧(如果有的话)作为最后一个操作。

我离开了整合实际的发送逻辑给你。

+0

你有多耐心,男人,+1 – Antonio

+0

@WhozCraig,安东尼奥:谢谢,现在我明白了我的想法,我会改变你的榜样以适应我的需求。谢谢。 – proCoder

+0

@proCoder很高兴帮助。 – WhozCraig

相关问题