2017-05-09 136 views
1

我想轉換通過測量壓力生成的數組。 所以我得到了一個整數數組,這樣,我將使用的10個樣本,但現在它結束時它可能會成爲20個值:uint16_t ADCsample[10]= { 245, 332, 124, 98, 5, 156, 68, 199, 2, 105}將整數數組轉換爲char數組,每個整數每3位數

正如你所看到的數值範圍爲0-350,沒有負值。 ,我必須得到它像這樣的輸出:outputStr = {2,4,5,3,3,2,1,2,4,0,9,8,0,0,5,1,5,6,0,6,8,1,9,9,0,0,2,1,0,5}

因此,所有的整數值分隔,並放入新的數組,以便ADCsample[0] = {245}變得outputStr[0-2] = {2,4,5}。但是具有一位或兩位數字的樣本必須獲得值爲0的值,這是爲了使輸出具有恆定的長度。

例如:​​成爲outputStr[12-14]={0,0,5}

我需要通過發送這個數據到服務器只用短信,其中有160個字符或什麼的字符限制。所以我將不得不一次發送完整的outputStr。此外,所有的計算都是在微控制器MSP430G2553上完成的,因此它必須高效且不會佔用太多內存。

任何提示或代碼示例,以幫助我開始,我是一個真正的新手,所以我不知道內置庫的許多功能?我可以使用sprintf()或其他函數嗎?這會使用多少內存?

+1

您需要實際字符'{'2','4','5','3','3','2',...},而不是特殊的不可打印字符'{2,4 ,5,3,3,2,...}',對吧? – dasblinkenlight

+0

'帶'%03d'的sprintf' ..然後從每個中減去''0'。 –

+0

@EugeneSh。對於只有500字節RAM的微控制器,'sprintf'可能有點太貴。 – dasblinkenlight

回答

1

此代碼工作,你想要做什麼:

#include <stdio.h> 
int main(void) 
{ 
    unsigned short ADCsample[10]= { 245, 332, 124, 98, 5, 156, 68, 199, 2, 105}; 
    char outputStr[31]; 

    for (unsigned short i = 0; i < 10; i++) 
    { 
     outputStr[(i * 3)] = ADCsample[i]/100 + '0'; 
     outputStr[(i * 3) + 1] = (ADCsample[i]/10) % 10 + '0'; 
     outputStr[(i * 3) + 2] = ADCsample[i] % 10 + '0'; 
    } 
    outputStr[30] = '\0'; 
    printf("output : %s\n", outputStr); 
    return 0; 
} 

我加一個printf以顯示結果。 outputStr的大小應該是你的int數組的大小* 3 + 1。 此外,條件應根據你的int數組的大小來改變。

+0

此外,如果使用sprintf沒有問題,則類似的更緊湊的解決方案是for(i = 0; i tonypdmtr

+1

你沒有初始化'我'。爲什麼不使用'for'循環? – pat

+0

噢,那是錯的!我現在編輯它。是的,for循環會更短。 – Antokop

0

你可以用簡單的數學運算獲得uint16_t三個大字:

uint16_t val = ...; 
char hundredsDigit = (val/100) + '0'; 
char tensDigit = ((val/10) % 10) + '0'; 
char onesDigit = (val % 10) + '0'; 

這將產生零數百時和/或十位數丟失。

我需要實際的字符,所以我可以通過我得到的打印功能來打印它們,該功能通常可以一次打印數組中的所有字符。

如果您打算使用打印字符串函數來打印此字符,則需要空結束結果。最後添加一個額外的char,並將其設置爲零。

+0

這幫助我處理整數現在我需要一些幫助,我將如何將它添加到數組。 –

+0

@MartijnGielen使用索引'i'逐個瀏覽'ADCsample',並使用索引'3 * i','3 * i + 1',一次將結果添加到您的輸出數組中,和「3 * i + 2」。 – dasblinkenlight

+0

@Olaf在沒有發佈代碼的情況下提出問題並不違反本網站的規定。從嵌入式開發開始可能會感到壓倒性的,尤其是您自己。與Java新人不同的是,我傾向於將嵌入式新手切入一些鬆懈狀態,因爲可用的教程,沒有任何藉口可以提出沒有代碼的簡單問題。但是,對於發佈重複項目,你是100%正確的,特別是對於有多個完全有效答案的問題。粗魯的評論也沒有任何藉口,我標記了他們的mod注意。 – dasblinkenlight

0

對於給定的數字,就可以得到每個數字如下:

d1 = num/100; 
d2 = (num % 100)/10; 
d3 = num % 10; 

首先計算確實整數除以100,有效地丟棄1和10的數字讓你有100的數字。

第二個將餘數除以100,留下一個值從0到99,然後將結果除以10,結果減去1的數字,並留下10的數字。

第三取除以100的剩餘部分,從留下的值爲0到9