Прочитать Array of Unsigned Long из аппаратного сериала? - PullRequest
0 голосов
/ 22 апреля 2020

Я получил массив длинных без знака

unsigned long readings[ 64 ];

, которые я хотел бы заполнить из аппаратного последовательного интерфейса. Во всяком случае, нет функции для чтения напрямую без знака длинного из него.

  • Как заполнить массив из последовательного?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Мне нравится использовать для этого союзы, избавляет вас от многих неприятных заклинаний.

union{
   uint8_t asBytes[SERIAL_ARRAY_LEN];
   unsigned long asULongs[SERIAL_ARRAY_LEN/sizeof(unsigned long)];
}data;

//use memcpy, or you could for while through and transfer byte by byte;
memcpy(sizeof(SERIAL_ARRAY_LEN, data.asBytes, serialBuffer);

for (int i = 0; i < SERIAL_ARRAY_LEN/sizeof(unsigned long); i++){
   ESP_LOGD(TAG, "%d", data.asULongs[i]);
}
0 голосов
/ 22 апреля 2020

Если вы получаете что-то более последовательное, его символы ASCII, так что вы конвертируете куски символов в любой нужный вам формат:

 unsigned long my_long = 0;
 char inputChunk[] ="2273543"; // you fill that from serial
 my_long = strtoul(inputChunk, NULL, 10);
 Serial.print(my_long);
readings[0] = my_long;

Поскольку вы не привели пример того, как данные поступают по последовательному или как различать разные джонки (это \ n 'или какой-то другой терминатор), это просто базовый c howto для ASCII.
Когда вы экспериментируете с \ n и ASCII, вот пример:

 unsigned long my_long = 0;
 char inputChunk[16] = {'\0'}; // size big enough you fill that from serial

uint8_t strIndex = 0;
uint8_t longCounter = 0;
while (Serial.available())  {
 char readChar = Serial.read();
 if (readChar == '\n') {
    my_long = strtoul(inputChunk, NULL, 10);
    break;
 }
 else {
    inputChunk[strIndex] = readChar;
    strIndex++;
    inputChunk[strIndex] = '\0]; // Keep the array NULL-terminated
 }
 Serial.print(my_long);
 readings[longCounter] = my_long;
 longCounter++;
 if (longCounter>=64) Serial.print("readings[] is full")
}
...