Восстановить 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
Как-то застрял здесь. Может кто-нибудь указать мне правильное направление или привести пример?
@ansi_lumen, 👍1
2 ответа
Лучший ответ:
Отвечаю на этот вопрос на основе помощи выше. Работает с этим кодом. Спасибо всем за помощь. Часы не отвечают на новое установленное время мгновенно, а через несколько секунд.
#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);
}
}
Здесь может быть несколько возможных проблем:
- можно ли отправить число в виде строки с ПК на 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
- Как подключить USB к пользовательской схеме Arduino Uno и программированию Atmega?
- Как использовать контакты ATtiny, которые обычно «зарезервированы» для программирования микросхем?
- cast double to long приводит к неожиданным результатам
- Attiny85 не распознается при запуске Windows
- Attiny85 ошибка загрузки
- Как настроить кабели для подключения Cp2102 к Pro Mini?
- Как использовать передатчик и приемник для условной отправки строковых сообщений получателю?
- Используйте ATtiny85 для выполнения начальной настройки маршрутизатора Cisco с использованием его консольного порта USB.