如何在不使用库

时间:2017-05-08 16:51:19

标签: c arrays microcontroller

所以我正在做一个实习项目。

我必须开发一个整个系统来收集一些数据,然后将其发送到服务器。该系统由一个MSP430G2553微控制器组成,所以我在没有任何库的情况下使用纯C进行编码,因此我没有使用sprintf或malloc函数。

我目前遇到的问题是我不知道如何立即将数组中的所有数据发送到服务器。

我的数组ADCvalue [20]有20个值,范围从0到350

ADCvalue[20]= {10, 40, 50, 90, 100, 200, 300, 240, 260, 10, 40, 50, 90, 100, 200, 300, 240, 260, 300, 20}

现在我想用分隔符","一次性发送这些值。每个值到服务器之间。 像这样:

10,40,50,90,100,200,300,240,260,10,40,50,90,100,200,300,240,260,300,20

如何获得这样的数组并立即发送?我已经有一个打印功能,可以发送例如:char property[] = "property"作为字符串。

如果有人可以帮助我使用一些伪代码或一些算法让我入门,那将会很棒。

3 个答案:

答案 0 :(得分:1)

正如你所说,不使用任何库(无论出于何种原因),我只写了一个简单的writeIntValue - 函数。请参阅以下代码,该代码使用此函数将正整数值序列写入字符数组。 希望它有所帮助。

char* writeIntValue(int val, char* dest) {
    // count digits:
    int digits = 0;
    int valCopy = val;
    while (valCopy) {
        digits++;
        valCopy /= 10;
    }

    if (digits == 0)  // means val has been 0
        digits=1; // assume 1 digit to write the '0'-value

    for (int i=digits-1; i>=0; i--) {
        dest[i] = val%10 + '0';
        val/=10;
    }
    dest[digits] = '\0'; // write string-terminating 0x0-value
    return dest + digits; // return a pointer to the end of the value written so far
}

int main() {

    int ADCvalue[20]= {10, 40, 50, 90, 100, 200, 300, 240, 260, 10, 40, 50, 90, 100, 200, 300, 240, 260, 300, 20};

    char buffer[500] = { '\0' };
    char *dest = buffer;
    for (int i=0; i<20; i++) {
        if (i>0)
            *dest++ = ',';
        dest = writeIntValue(ADCvalue[i], dest);
    }
    // buffer here will be "10,40,50,90,100,200,300,240,260,10,40,50,90,100,200,300,240,260,300,20"
    return 0;
}

答案 1 :(得分:0)

试试此代码

const char ansitable[10] = {'0','1','2','3','4','5','6','7','8','9'};

void procInt(char* buf, int* loc, unsigned short v) {
   if (v == 0) {
      buf[*loc] = '0';
      *loc++; 
      return; 
   }
   unsigned short cv = v;
   unsigned short r;
   unsigned short divid = 1;  
   if (v>9) divid = 10;  
   if (v>99) divid = 100;  
   while (divid > 0) {
      r = cv / divid;
      buf[*loc] = ansitable[r];
      *loc++; 
      cv %= divid;
      divid /= 10;
   }
}

int MAX_SIZE_OF_CHUNCK = 4;

void startWrite(unsigned short* input, int sizeinput) {
   char* buffer = (char *)calloc(sizeinput * MAX_SIZE_OF_CHUNCK, sizeof(char));
   int loc = 0;
   for (int i = 0; i < sizeinput; i++) {
      procInt(buffer, &loc, input[i]);
      if (i < sizeinput-1) {
         buffer[loc] = ',';
         loc++;
      }
   }
   sendToMPU(buffer, loc); //loc - length 
}

答案 2 :(得分:0)

  

如何获得这样的数组并立即发送?一世   已经有一个打印功能,可以发送例如:char   property [] =&#34; property&#34;作为一个字符串。

范围[0 ... 350]中的值不适合单个字节,但您可以使用字节对对这些值进行编码。

一个例子

short int x = 300; /* 0x012C */

=

unsigned char arr[] = {0x01, 0x2C};

short int x[] = {0x000a, 0x0028, 0x0032, 0x005a, 0x0064, 0x00c8, 0x012c, 0x00f0, 0x0104, 0x000a, 0x0028, 0x0032, 0x005a, 0x0064, 0x00c8, 0x012c, 0x00f0, 0x0104, 0x012c, 0x0014};

=

unsigned char arr[] = {0x00, 0x0a, 0x00, 0x28, 0x00, 0x32, 0x00, 0x5a, 0x00, 0x64, 0x00, 0xc8, 0x01, 0x2c, 0x00, 0xf0, 0x01, 0x04, 0x00, 0x0a, 0x00, 0x28, 0x00, 0x32, 0x00, 0x5a, 0x00, 0x64, 0x00, 0xc8, 0x01, 0x2c, 0x00, 0xf0, 0x01, 0x04, 0x01, 0x2c, 0x00, 0x14};
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    short int ADCvalue[] = {10, 40, 50, 90, 100, 200, 300, 240, 260, 10, 40, 50, 90, 100, 200, 300, 240, 260, 300, 20};
    size_t sz = sizeof(ADCvalue) / sizeof(*ADCvalue);
    unsigned char *arr = malloc(sz * 2);

    if (arr == NULL) {
        perror("malloc");
        exit(EXIT_FAILURE);
    }
    /* Encode */
    for (size_t i = 0; i < sz; i++) {
        arr[i * 2 + 0] = (unsigned char)(ADCvalue[i] >> 8);
        arr[i * 2 + 1] = (unsigned char)(ADCvalue[i] & 0xFF);
    }
    /* Send array */
    /* .. */
    /* Decode */
    for (size_t i = 0; i < sz; i++) {
        printf("%d\n", (arr[i * 2] << 8) | (arr[i * 2 + 1]));
    }
    return 0;
}