Влияние заполнения буфера UART на несвязанные переменные

Ардуино. Переменная int Pres1 выводится на LCD1602. После связи с компом ее значение становится ложным. Также переменная обернута библой обработки кнопки, но кнопка не нажимается. Если ее оттуда убрать, то все в норме.

#include <LiquidCrystal.h>
#include <LCD_1602_RUS.h>
LCD_1602_RUS lcd(0x27, 16, 2);

int Pres1;

byte buf[32];

#include "GyverButton.h"
GButton  b1(4);

void setup()
{
  Serial.begin(9600);

  Wire.begin();
  lcd.init();
  lcd.backlight();

  Pres1 = 1;

}

void loop()
{
  SoftSetup();

  b1.tick();

  if (b1.isClick())  // кнопка конечно НЕ нажимается
  {
    Pres1 =  1;  // любое число..... если это комментить, то все в норме - т.е. на индикаторе выводится 1
  }

  //  // а вот если так, то уже все в норме
  //  uint8_t gg;
  //  if (gg == 1)  // ложь
  //  {
  //    Pres1 =  1;
  //  }
}

void SoftSetup()
{
  if (Serial.available() > 0)
  {
    byte ff = Serial.read();

    if (ff == 131)
    {
      Serial.readBytes(buf, 36);  // как эта строка может повлиять на Pres1????

      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print("Pres1 ");
      lcd.print(Pres1); // выводится значения 257...258, а не 1. И эти значения почему то зависят от значений в buf
    }
  }
}
byte buf[32];
....
Serial.readBytes(buf, 36);
1 лайк

Подскажите, пожалуйста, как читаются (словами, на русском языке) строка 7 и 51. Что-то у меня сомнение есть, что компилятор не выдает предупреждения.

Компилятору это глубоко фиолетово.

1 лайк

в IDE 1.85 и 2.01 пробовал. Одинаково. В смысле курить в сторону настроек, чтоб компилятор сам подсказал проблему?

О! 32 и 36?? Неужели тут… Счас исправлю.

Да, не, курите в сторону настроек :slight_smile:

Т.е. компилятор не видит размера массива? Вроде логика выявления ошибки не сложная?! Или я ошибаюсь, в смысле сложно выявлять такие ошибки?

Видит. Просто он никак не ассоциирует размер массива с числом в скопках.

1 лайк

А при чём тут вообще массив? Смотрим ещё раз:

byte buf[32];
....
Serial.readBytes(buf, 36);

Каким, по-Вашему, боком первый параметр readBytes относится к массиву? Тип у него совсем не массивный

size_t readBytes( char *buffer, size_t length);

И при чём тут вообще массив-то? Откуда бедному компилятору про это догадаться?

Мдя, не часто программирую… Получается черте что а не код. Массив байт и символов с одинаковым именем. Один локальный, другой глобальный.

Нет, массив-то один, глобальный. Никакого локального нет.
Просто в оператор readBytes() передается не массив, а указатель, и тип у него - не массив. а указатель на символ

Конечно, если бы компилятор был “совсем умный” - он мог бы отследить ситуацию, и предупредить незадачливого “программиста”. Но посудите, разве это дело, когда компилятор мнит себя умнее автора программы? :slight_smile:

Нет, тут компилятор С ведет себя как верный и почтительный слуга - “Ежели барину захотелось скопировать 36 байт в массив размером 32 - значит он знает, что делает. Не мне ему указывать, что да как”.