Оптимизированный генератор случайных буквенно-цифровых строк
Я пытаюсь создать генератор arduino nonce, но единственное, что я нашел, - это этот вопрос на форуме arduino, но я не могу понять, как заставить его работать на меня. Я проверил и Serial.available() всегда 0 для меня, и если я удалю, если я все равно ничего не получу
Мой код:
void setup() {
Serial.begin(9600);
randomSeed(analogRead(0));
}
void loop() {
byte randomValue;
char temp[5];
char letter;
char msg[50]; // Имейте в виду ограничения SRAM
int numBytes = 0;
int i;
int charsRead;
if(Serial.available() == 0)
{
charsRead = Serial.readBytesUntil('\n', temp, sizeof(temp) - 1); // Найти новую строку или максимум 4 символа
temp[charsRead] = '\0'; // Теперь это строка
numBytes = atoi(temp);
if(numBytes > 0)
{
memset(msg, 0, sizeof(msg));
for(i = 0; i < numBytes; i++) {
randomValue = random(0, 36);
msg[i] = randomValue + 'a';
if(randomValue > 26) {
msg[i] = (randomValue - 26) + '0';
}
}
Serial.println("Here is your random string: ");
Serial.println(msg);
Serial.print("I received: ");
Serial.println(numBytes);
delay(1000);
}
}
}
Как мне заставить это работать?
У вас есть какой-нибудь работающий генератор случайных буквенно-цифровых строк, который вы используете?
@krystof18, 👍0
Обсуждение1 ответ
Лучший ответ:
Ваша проблема, по-видимому, связана с тем, как вы получаете фактическую длину, которую хотите сгенерировать. Есть и другие способы, которыми вы могли бы это сделать. Поскольку ваш максимальный размер, по-видимому, составляет 4 символа, вы можете ввести "9999", что приведет к переполнению временной
переменной 50 байт.
Вы могли бы просто читать до \n
, а затем atoi
. Затем крышка на 50.
В качестве примечания, вот функция, которую я использовал в прошлом для генерации (псевдослучайных)случайных строк для сетевых запросов (например, параметры состояния
или nonce
).
#define MAX_UID 8 /* Измените на любую длину, которая вам нужна */
const char * generateUID(){
/* Изменение на допустимые символы */
const char possible[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
static char uid[MAX_UID + 1];
for(int p = 0, i = 0; i < MAX_UID; i++){
int r = random(0, strlen(possible));
uid[p++] = possible[r];
}
uid[MAX_UID] = '\0';
return uid;
}
- Ардуино - Извлечение нескольких строк из последовательного чтения
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- Как объявить массив переменного размера (глобально)
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Ошибка "'Serial' does not name a type"
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
Почему вы проверяете " если(серийный номер.доступен() == 0)
? Если вы хотите прочитать данные из
Serial, вам следует проверить наличие
if(Serial.available() > 0), которое можно записать короче как " if(Serial.available())
. Пожалуйста, попробуйте это, @chrislЭто правильно? Вы читаете 4-значное число, а затем используете его в качестве числа цифр для ввода случайных символов в 50-байтовый массив? Почему бы не прочитать 2-значное число? Или, по крайней мере, проверьте, является ли число > 49 или нет., @Nick Gammon
if(randomValue > 26)
if(randomValue >= 26)`. Помимо исправлений, предложенных в этих трех комментариях, скетч должен работать так, как было объявлено., @Edgar Bonet@chrisl даже при этом код никогда не входит в это, если, @krystof18