2017-05-05 28 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

相關問題