Печать массива с помощью функции печати и последовательной записи в Arduino Uno

У меня есть одна программа, использующая только массив печати, а другая с функцией последовательной записи и печати для массива, при использовании функции последовательной записи и печати я получаю эти дополнительные символы между данными, как показано ниже, может ли кто-нибудь помочь мне с этим

Печать массива с помощью функции печати

uint8_t a[13] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0X77, 0x88,
                 0x01, 0x02, 0x03, 0x04, 0x05};
int i;

void Print_Hexa(uint8_t num) {
  char Hex_Array[2];

  sprintf(Hex_Array, "%02X", num);
  Serial.print(Hex_Array);
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  for (i = 0; i <= 12; i++) {
    //Serial.write(a[i]);
    Print_Hexa(a[i]);
  }
  Serial.println();
  delay(100);
}

Using Print Function

Использование с последовательной функцией записи и печати для массива

uint8_t a[13] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0X77, 0x88,
                 0x01, 0x02, 0x03, 0x04, 0x05};
int i;

void Print_Hexa(uint8_t num) {
  char Hex_Array[2];

  sprintf(Hex_Array, "%02X", num);
  Serial.print(Hex_Array);
}

void setup() {
  Serial.begin(9600);
}

void loop() {
  for (i = 0; i <= 12; i++) {
    Serial.write(a[i]);
    Print_Hexa(a[i]);
  }
  Serial.println();
  delay(100);
}

Using Serial write and Print function for array

, 👍2

Обсуждение

Serial.write(a[i]); отправляет символ, но не все значения являются читаемыми символами, @Juraj

Чтобы предотвратить переполнение буфера, используйте snprintf(Hex_Array, sizeof(Hex_Array), "%02X", число);. Более подробная информация [здесь](https://www.cplusplus.com/reference/cstdio/snprintf/) и [здесь](https://en.cppreference.com/w/c/io/fprintf). Также имейте в виду, что версии Arduino не поддерживают спецификатор формата " %f`., @tim


2 ответа


1

Для хранения 2-символьной строки вам нужен 3-байтовый массив, а не 2-байтовый массив. Это связано с тем, что в C строка состоит из фактических строковых данных и нулевого ("НУЛЕВОГО") байта в конце, указывающего, где находится конец строки.

Таким образом, вам понадобится:

char Hex_Array[3];

таким образом, он может хранить для числа 0x69: 69\0. В противном случае вы переполняете массив и повреждаете другие данные, которые следуют в стеке, и изменение этих других данных повреждает вашу строку, изменяя маркер "конец строки" на какой-либо другой случайный символ ASCII.

,

Спасибо за ответ, я изменил размер массива на 3, как уже упоминалось, по-прежнему вывод последовательного монитора остается прежним., @voticoy


6

Serial.write(some_byte) записывает байт на последовательный вывод. То Последовательный монитор Arduino пытается интерпретировать байты, которые он получает, как текст:

  • 0x11-это управляющий символ, отображаемый как“□”.
  • 0x22-это код ASCII для двойной кавычки (")
  • 0x33-это код ASCII для цифры 3.
  • 0x44-это код ASCII для прописной буквы “D”.
  • и т.д.
,

Можно ли их удалить или замаскировать, если это возможно, @voticoy

@voticoy: Конечно! Удалите инструкцию Serial.write ()., @Edgar Bonet