Оптимизированный генератор случайных буквенно-цифровых строк

Я пытаюсь создать генератор 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);
        }
    }
}

Как мне заставить это работать?

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

, 👍0

Обсуждение

Почему вы проверяете " если(серийный номер.доступен() == 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


1 ответ


Лучший ответ:

2

Ваша проблема, по-видимому, связана с тем, как вы получаете фактическую длину, которую хотите сгенерировать. Есть и другие способы, которыми вы могли бы это сделать. Поскольку ваш максимальный размер, по-видимому, составляет 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;
}
,