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

WhozCraig..

7

不知道关于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

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

#include

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

printf("%zu", i%10);

fputc('\n', stdout);

// the actual loop that enumerates your buffer

for (i=0; 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,因此它始终被终止.我们也直接从源字符串中选取短帧(如果有的话)作为最后一个操作.

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值