Arduino теряет соединение с последовательным портом после запуска функции

По какой-то причине, когда я прохожу свой код через отдельную функцию, последовательный порт зависает. Последовательное соединение выглядит нормально, когда я вызываю случаи внутри цикла, но не когда я звоню снаружи.

Я пытался выяснить, в чем проблема, и по какой-то причине использовал Serial.print(ComControlValue);, и результат был

-1

Но ошибка все еще сохраняется.

Раньше это было до того, как я изменил скорость передачи данных

-b⸮⸮⸮⸮ Ожидание команды

Это не распечатка -1, которую я использую в качестве основного случая. Может ли это быть проблемой?

#include <Wire.h>
/* RPi Army variables */
int RPi[3] = {3,6,9};                                        // Кодовые имена SDA/SCL для разных Raspberry Pi

/* Define parameters for computer control */
int ComControlValue = -1;

void setup() {
  Serial.begin(115200);                                     // Устанавливаем последовательное соединение с компьютером
  Wire.begin();                                             // подключаемся к шине i2c в качестве ведущего
}

void loop() {
 switch(ComControlValue){
  /* -1 : nothing happened yet */
  case -1:
     Serial.println("Waiting for Command");
     while (Serial.available()==0){}
     ComControlValue=Serial.parseInt();                             // Извлекаем значение из последовательного порта
     break;     

  case 111:
     Serial.println("Eat more Toast");
     ComControlValue = -1;
     break;

  case 210:
     Sendsignals(RPi[0],333);
     Sendsignals(RPi[1],333);
     Sendsignals(RPi[2],333);
     ComControlValue= -1;
     Serial.print(ComControlValue);
     break;
  }
}      

void Sendsignals(int Rpi, int code){
   char str[4];
   sprintf(str, "%3d\n", code);
   Wire.beginTransmission(Rpi);                                 // передаем на выбранное устройство
   Wire.write(str);                                             // отправляет 16 байт
   Wire.endTransmission();                                      // прекращаем передачу
}

, 👍0

Обсуждение

Рассмотрите возможность добавления дополнительных строк отладки во время работы функции Sendsignals. Возможно, зависает во время передачи "Провода". Вам также следует рассмотреть возможность изменения sprintf на snprintf - очевидно, он более устойчив к проблемам с буфером и требует установки размера буфера вручную., @towe

Я попробовал это, и кажется, что все работает нормально до «перерыва» при выполнении моей отдельной функции., @Hojo.Timberwolf

Arduino Uno с моторным щитом Adafruit, @Hojo.Timberwolf

повторное подключение последовательного монитора сбрасывает плату. while (Serial.available()==0){} блокирует цикл, @Juraj

Кажется, все работает нормально, если не вызывать Wire.h . Как только я вызываю функции Wire.h, последовательное соединение портится., @Hojo.Timberwolf


1 ответ


Лучший ответ:

2

Ваша переменная str в функции Sendsignals короткая. sprintf записывает в него 5 байт, 3 цифры, \n и завершающий ноль. Завершающий ноль записывается за пределы выделенного массива и вызывает сбой.

,

Это приводит к отключению последовательного терминала? Как исправить? Должен ли я увеличить длину str до 8 бит?, @Hojo.Timberwolf

Спасибо. Я изменил размер строки на 16, и это устранило проблему., @Hojo.Timberwolf

str[5] будет достаточно, если ваши коды всегда состоят из 3 цифр, @Juraj