2017-05-09 110 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