我正在尝试将长字符串数据从我的 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] 删除。
我来说两句