不知道關於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