Восстановить 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


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
,