不知道关于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字符,所以它总是终止。我们也直接从源字符串中选取短帧(如果有的话)作为最后一个操作。
我离开了整合实际的发送逻辑给你。
我并不感到惊讶,你没有得到你想要的结果(不管那些是什么)。你的代码调用*未定义的行为*。你的memcpy大小参数太大。你的'* data'增量没有意义。你需要一个针对后者的迭代指针,以及前者的适当数学。我承认我不知道'ble'的'println'成员的第一件事,但是如果它需要一个终止的字符串,那也是缺少的。 – WhozCraig
你的sendBuffer在memcpy之后不是空的。 –
@ WhozCraig,@ vivek感谢您的回复。你能不能给我一些建议,或者给我点任何同样的例子,这样我就能得到正确的想法。谢谢 – proCoder