Печать массива с помощью функции печати и последовательной записи в 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);
}
Использование с последовательной функцией записи и печати для массива
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);
}
@voticoy, 👍2
Обсуждение2 ответа
Для хранения 2-символьной строки вам нужен 3-байтовый массив, а не 2-байтовый массив. Это связано с тем, что в C строка состоит из фактических строковых данных и нулевого ("НУЛЕВОГО") байта в конце, указывающего, где находится конец строки.
Таким образом, вам понадобится:
char Hex_Array[3];
таким образом, он может хранить для числа 0x69: 69\0
. В противном случае вы переполняете массив и повреждаете другие данные, которые следуют в стеке, и изменение этих других данных повреждает вашу строку, изменяя маркер "конец строки" на какой-либо другой случайный символ ASCII.
Спасибо за ответ, я изменил размер массива на 3, как уже упоминалось, по-прежнему вывод последовательного монитора остается прежним., @voticoy
Serial.write(some_byte)
записывает байт на последовательный вывод. То
Последовательный монитор Arduino пытается интерпретировать байты, которые он получает, как текст:
0x11
-это управляющий символ, отображаемый как“□”.0x22
-это код ASCII для двойной кавычки (")0x33
-это код ASCII для цифры 3.0x44
-это код ASCII для прописной буквы “D”.- и т.д.
Можно ли их удалить или замаскировать, если это возможно, @voticoy
@voticoy: Конечно! Удалите инструкцию Serial.write ()
., @Edgar Bonet
- массив в последовательный порт
- Отправить массив 2d PROGMEM через SoftwareSerial
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Почему я не могу распечатать значения логических переменных (0 и 1) с помощью функции println?
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
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