Генератор строк не работает должным образом
Я пытаюсь построить случайную строку, сохранить ее в EEPROM как int, затем прочитать ее и вывести.
Если я даю ему предопределенную строку, тогда он работает нормально. Но что-то не так с генератором случайных строк.
String output;
char letter;
String mystr=""; //"АВCabc123..";
String characters = "ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz";
String numbers = "0123456789";
String other = "<>!.,()?|=&%¤#";
// добавляем случайные символы в пустую строку
for(int i=0 ; i < 12 ; i++){
mystr += characters[random(0, characters.length())];
}
// добавляем два числа, одно другое и еще два символа
mystr += numbers[random(0, numbers.length())];
mystr += numbers[random(0, numbers.length())];
mystr += other[random(0, other.length())];
mystr += characters[random(0, characters.length())];
mystr += characters[random(0, characters.length())];
// зациклить строку и поместить по одному символу в каждый адрес EEPROM
for(int i=0 ; i < mystr.length() ; i++)
{
EEPROM.writeInt( i,mystr[i] );
}
// прочитать строку обратно из EEPROM
for(int i=0 ; i < 17 ; i++){
letter = EEPROM.readInt(i);
output += letter;
}
Если я запущу код, вывод будет "H". Каждый раз.
Если я использую предопределенную строку «ABCabc123..», то она работает правильно.
Что я делаю неправильно при создании mystr?
@Andreas, 👍0
Обсуждение1 ответ
Ваша первая ошибка — использовать String
. Не. Вместо этого используйте массив char
.
char mystr[18]; // Место для 17 символов плюс завершающий символ NULL
Ваши строковые константы также должны быть массивами символов, а не переменными String
. А лучше поместить их в PROGMEM
:
const char characters[] PROGMEM = "ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvxyz";
const char numbers[] PROGMEM = "0123456789";
const char other[] PROGMEM = "<>!.,()?|=&%¤#";
Теперь заполнение целевого массива выглядит следующим образом:
for(int i=0 ; i < 12 ; i++){
mystr[i] = pgm_read_byte_near(characters + random(0, 50));
}
mystr[12] = pgm_read_byte_near(numbers + random(0, 10));
mystr[13] = pgm_read_byte_near(numbers + random(0, 10));
mystr[14] = pgm_read_byte_near(other + random(0, 14));
mystr[15] = pgm_read_byte_near(characters + random(0, 50));
mystr[16] = pgm_read_byte_near(characters + random(0, 50));
mystr[17] = 0; // Не забудьте NULL...
Ваша вторая проблема связана с использованием EEPROM.writeInt
и EEPROM.readInt
. Они предназначены для записи целых значений, а не символов. Вместо этого просто используйте EEPROM.read
и EEPROM.write
:
for (int i = 0; i < 17; i++) {
EEPROM.write(i, mystr[i]);
}
Затем, чтобы прочитать обратно:
for (int i = 0; i < 17; i++) {
mystr[i] = EEPROM.read(i);
}
// И не забудьте завершить строку...
mystr[17] = 0;
Я не могу заставить это работать. Во-первых, похоже, что рандом не меняется между прогонами. Каждый раз я получаю одну и ту же строку, только если я что-то меняю, я получаю другой результат. Когда я вывожу массив, символ за символом, я получаю более короткую строку, чем должна быть. 7 символов Åo-Åyäv
И два из них не входят в иероглиф char., @Andreas
Случайно не случайно, нет. Это *псевдо*случайно. Вы должны установить «начальное число», чтобы изменить «случайную» последовательность., @Majenko
Я понимаю. Тогда я попробую использовать другой подход., @Andreas
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- DateTime в строку
- Как преобразовать строку в массив байтов
- Как отправить строку на мастер с помощью i2c
- Создание форматированной строки (включая числа с плавающей запятой) в Arduino-совместимом C++
EEPROM.writeInt()
иEEPROM.readInt()
не похожи на стандартные функции Arduino. Где ты достал их? Также обратите внимание, что «¤» не является символом ASCII. Это занимает два байта, если вы пишете его в UTF-8., @Edgar Bonet@EdgarBonet Я не могу включить EEPROM.h . Думаю, его нет на платах Digispark. Я нашел EEPROM.h и скачал его, но когда я его включил, я получил ошибку, что Debug.h отсутствует. Поэтому я просто отказался от этого и нашел другую библиотеку., @Andreas