Восстановить uint32_t из массива символов в RTC.set

В настоящее время я экспериментирую с Digistump ATTiny85. Поскольку у него нет последовательного порта, я использую базовую библиотеку DigiUSB для связи. Используемая библиотека RTC: https://github.com/JChristensen/DS3232RTC/. Библиотека DigiUSB взята из Digispark.

Я подключил DS3232 через TWI к Digistump, потому что хочу использовать эту конструкцию в качестве USB-часов реального времени.

Первоначальная установка времени в методе setup работает следующим образом

  RTC.set(1532341020);

Но я не могу передать время через псевдопоследовательное соединение и установить его удаленно. Что я пробовал до сих пор:

  • Использование union с char и uint32_t. Хотя представление char верно (пробовал DigiUSB.println()), представление uint32_t этого объединения мне не нужно.
  • Пытался адаптироваться к некоторым примерам сдвига, но тут серьезно запутался. Все примеры были примерно с 4-байтовыми потоками.
  • atoi и некоторые другие функции не увенчались успехом.

Вот мой текущий эскиз

#include <DS3232RTC.h>
#include <DigiUSB.h>

//union ArrayToInteger {
//  char array[10];
//  uint32_t integer;
//};

unsigned char foo[10];
uint32_t num;

void setup() {                
  RTC.begin();
  //RTC.set(1532341020);
  DigiUSB.begin();
}

void loop() {
  if (DigiUSB.available() >= 10) {
    for (int i=0; i<=10; i++) {
    foo[i] = DigiUSB.read();
  }
  RTC.set((uint32_t)foo);
  DigiUSB.delay(100);
  DigiUSB.refresh();
  //DigiUSB.println(_foo.array);
  DigiUSB.println(RTC.get());
} else {
  DigiUSB.refresh();
  DigiUSB.println(RTC.get());
  DigiUSB.refresh();
  DigiUSB.delay(1000);
  }
}

В конце концов мне нужно, чтобы char _foo 0123456789 был представлен/преобразован в uint32_t num 0123456789

Как-то застрял здесь. Может кто-нибудь указать мне правильное направление или привести пример?

, 👍1

Обсуждение

добавьте ссылки на библиотеки. Числовое представление времени в RTC — «Эпоха» — секунды с 1.1.1970. Что вы подразумеваете под «символьным представлением»?, @Juraj

Вы можете попробовать atol(), но учтите, что с 19 января 2038 года вам нужно будет использовать strtoul()., @Edgar Bonet

как отправить значение эпохи?, @Juraj

@EdgarBonet atol ошибки недопустимое преобразование из 'unsigned char*' в 'const char*'. То же самое с strtoul., @ansi_lumen

if (DigiUSB.available()) { time_t epoch = DigiUSB.parseInt(); RTC.set(epoch);}?, @Juraj

@Juraj DigiUSB не поддерживает .parseInt., @ansi_lumen

Не делайте foo беззнаковым., @Edgar Bonet

@EdgarBonet Спасибо. Уже исправил. Но когда я делаю RTC.set(atol(foo)), время устанавливается неправильно., @ansi_lumen


2 ответа


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

1

Отвечаю на этот вопрос на основе помощи выше. Работает с этим кодом. Спасибо всем за помощь. Часы не отвечают на новое установленное время мгновенно, а через несколько секунд.

#include <DS3232RTC.h>
#include <DigiUSB.h>
char foo[10];

void setup() {                
  RTC.begin();  
  DigiUSB.begin();
}

 void loop() {
   if (DigiUSB.available() >= 10) {
     for (int i=0; i<=10; i++) {
       foo[i] = DigiUSB.read();
   }
   RTC.set(atol(foo));
   DigiUSB.delay(100);
   DigiUSB.refresh();
   DigiUSB.println(RTC.get());
} else {
   DigiUSB.refresh();
   DigiUSB.println(RTC.get());
   DigiUSB.refresh();
   DigiUSB.delay(1000);
   }
}
,

2

Здесь может быть несколько возможных проблем:

  • можно ли отправить число в виде строки с ПК на ATtiny?
  • можно ли преобразовать строку в фактическое число?
  • можете ли вы передать этот номер в RTC?

Формулировка вашего вопроса звучит так, будто ваша проблема связана с преобразование. Однако это легко решается с помощью atol(). Вот тест программа, которую я попробовал на своем Uno:

void setup() {
    char time_string[] = "1532341020";
    uint32_t time_number = atol(time_string);

    Serial.begin(9600);
    Serial.print("string: \"");
    Serial.print(time_string);
    Serial.print("\", number = ");
    Serial.println(time_number);
}

Выход:

string: "1532341020", number = 1532341020
,

Действительно, atol делает свое дело. Для полноты я ответил, разместив рабочий код. Спасибо за вклад., @ansi_lumen