Ускоряется вывод arduino функции Serial
- Войдите на сайт для отправки комментариев
Вс, 30/05/2021 - 00:25
//Таймер, который отсчитывает 1 секунду
uint16_t timer = 5000;
//Переключатель выходных портов
uint8_t iterator = 0;
//Таблица портов, прнимающих сигнал
uint8_t table[][32] =
{ {22, 26, 30, 34, 38, 42, 46, 50},
{23, 27, 31, 35, 39, 43, 47, 51},
{24, 28, 32, 36, 40, 44, 48, 52},
{25, 29, 33, 37, 41, 45, 49, 53}
};
void setup() {
//Установка портов VCC
for (uint8_t i = 2; i <= 9; i++) pinMode(i, OUTPUT);
//Установка портов GND
for (uint8_t i = 22; i <= 53; i++) pinMode(i, INPUT);
//Установка скорости передачи данных
Serial.begin(115200);
}
void loop() {
if (timer < millis())
{
//Отсчитывание каждой секунды с учётом скорости проигрывания музыки 130 единиц
timer = millis() + 461;
//timer = millis() + 1000;
// Посылаем высокое напрядение на столбец под номером итератора
digitalWrite(iterator + 2, HIGH);
//Символ начала передачи пакета
Serial.print("*");
//Считывание с портов сигнала, если высокое напряжение - загорается диод и передаётся 1 - иначе 0
for (uint8_t i = 0; i < 4; i++)
{
/*Serial.print("Номер порта: ");
Serial.println(table[i][iterator]);
Serial.print("Значение: ");
Serial.println(digitalRead(table[i][iterator]));*/
if (digitalRead(table[i][iterator])) Serial.print(1); else Serial.print(0);
}
//Символ конца передачи пакета
Serial.println("#");
//Прекращение подачи питания
digitalWrite(iterator + 2, LOW);
//Переключение и сброс итератора
if (++iterator == 7)
iterator = 0;
}
}
Всем доброго времени суток. Делаю курсовой проект, секвенсор.
Проблема заключается в следующем: у меня есть приложение, которое принимает то, что мне передаёт ардуино. Мне нужно, чтобы оно выводило это с определёнными временными периодами. И где-то первые секунд 40 так и есть. А потом ардуинка начинает отправлять данные очень быстро. С чем это может быть связано? На всякий случай: использую arduino mega.
Не 40 секунд, а ~60.
Положите-ка в 16-битную переменную timer 65535ms, добавьте 461 и сравните с 65538ms - что будет больше?
Произойдёт переполнение, я вас понял, спасибо большое! Извините за невнимательность.
Садман41, дорогой! Комментарий без пояснений породит еще одного члена секты "великого переполнения"! ;))
ТС, уважаемый. Чтобы переполнение не влияло на работу программы нужно использовать только вычитания. Как на циферблате часов, разность положения стрелок - всегда правильное число, даже если стрелки по разную сторону от 0(12).
void loop() { static uint16_t old_millis = millis(); uint16_t new_millis = millis(); // взяли два младших байта от миллис if (new_millis - old_millis > 461) { old_millis = new_millis; // или += 461 // зависит от того, что важнее интервал или частота ........