Ускоряется вывод arduino функции Serial

kompromiss
Offline
Зарегистрирован: 30.05.2021
//Таймер, который отсчитывает 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.

sadman41
Offline
Зарегистрирован: 19.10.2016

Не 40 секунд, а ~60.

Положите-ка в 16-битную переменную timer 65535ms, добавьте 461 и сравните с 65538ms - что будет больше?

kompromiss
Offline
Зарегистрирован: 30.05.2021

Произойдёт переполнение, я вас понял, спасибо большое! Извините за невнимательность.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Садман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 
// зависит от того, что важнее интервал или частота
........