Выполение функции loop() останавливается на Serial.print() при использовании глобального массива

shibalov_a
Offline
Зарегистрирован: 05.09.2020

Доброго дня

Сталкнулся с проблемой, когда выполение loop() просто прерывается на строчке с Serial.print(), если перед этим поставить изменение значений глобального массива 

/* дефайны/библиотеки */

//набор глобальных переменных
int transmit_data[3];
int telemetry[2];
byte rssi;
int trnsmtd_pack = 1, failed_pack;
unsigned long RSSI_timer;

int finSpeed[1];
boolean Dir = 1; 
int Step = 1024/255;

void setup() {
  Serial.begin(230400); // пробовал разные скорости
  //radioSetup();
  
  pinMode (SW, INPUT_PULLUP);
  initial_x = analogRead(STICK_X);
  initial_y = analogRead(STICK_Y);
}

void loop() {
  Serial.print("1");
  //speedCalcualte();
  finSpeed[0] = 255;
  finSpeed[1] = 255;
  Dir = 1;
  Serial.print("2");
  transmit_data[3] = Dir;
  Serial.print("3");

  transmit_data[0] = finSpeed[0]; // speed left side
  transmit_data[1] = finSpeed[1]; // speed right side
  transmit_data[2] = Dir; //direction , 1 - forward, 0 - backward
}

Если оставляю Serial.print() только в первой строчке - все выводится. Как только добавляю принт после заполнения глобального массива данными - не выводится в порт вообще ничего и ардунка (nano) ведет себя так, будто выполнение самой функции loop() в этот момент прерывается. 

Если же я массив finSpeed задаю не в качестве глобальных, а в качестве локальных данных внутри функции loop() - то проблема уходит.

Как влияет работа с глобальными переменными на вывод данных в порт и прерывание выполнения loop()?

Или здесь еще какая-то ошибка может быть?

Заранее спасибо и заранее извиняюсь, если вопрос очень глупый и я просто пока не смог нагуглить на него ответ!

rkit
Offline
Зарегистрирован: 23.11.2016

shibalov_a пишет:

int transmit_data[3];

  transmit_data[3] = Dir;

В массивах нумерация начинается с нуля и потому максимальный элемент для этого массива - 2

shibalov_a
Offline
Зарегистрирован: 05.09.2020

Капец, какой глупый миспринт)

Спасибо :)

Странно что при компиляции скетча никаких ошибок небыло

b707
Онлайн
Зарегистрирован: 26.05.2017

shibalov_a пишет:

Странно что при компиляции скетча никаких ошибок небыло

их и не будет, в Си следить за размерностью массивов - обязанность программиста, а не компилятора

rkit
Offline
Зарегистрирован: 23.11.2016

Будет, если пользоваться нормальными инструментами, а не игрушечной средой arduino.

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Нужно включить все предупреждения компилятора, которые по-умолчанию выключены.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

shibalov_a пишет:

Капец, какой глупый миспринт)

И не один. С массивом finSpeed та же петрушка.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rkit пишет:

Будет, если пользоваться нормальными инструментами, а не игрушечной средой arduino.

Если нормальными, то как раз не будет.

shibalov_a
Offline
Зарегистрирован: 05.09.2020

ЕвгенийП пишет:

И не один. С массивом finSpeed та же петрушка.

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

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

А у меня что-то никак в голове не сложится: Массив типа int, а значения типа bool присваиваются. Это нормально? Даже предупреждений не будет?

v258
Offline
Зарегистрирован: 25.05.2020

А чего там предупреждать? bool - тоже численная величина, flase = 0, true !=0

b707
Онлайн
Зарегистрирован: 26.05.2017

Мне очень нравится шутливый диалог про линукс, который, как мне кажется, очень в тему всяких там предупреждений и прочих вытираний соплей за пользователем:
- Почему в линуксе нет средства undelete?
- Если юзер уже показал свою бестолковость тем, что стер нужные файлы - стоит ли ему позволять лезть в недра файловой системы?