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(); // прекращаем передачу
}
@Hojo.Timberwolf, 👍0
Обсуждение1 ответ
Лучший ответ:
Ваша переменная str в функции Sendsignals короткая. sprintf записывает в него 5 байт, 3 цифры, \n и завершающий ноль. Завершающий ноль записывается за пределы выделенного массива и вызывает сбой.
Это приводит к отключению последовательного терминала? Как исправить? Должен ли я увеличить длину str до 8 бит?, @Hojo.Timberwolf
Спасибо. Я изменил размер строки на 16, и это устранило проблему., @Hojo.Timberwolf
str[5] будет достаточно, если ваши коды всегда состоят из 3 цифр, @Juraj
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
Рассмотрите возможность добавления дополнительных строк отладки во время работы функции Sendsignals. Возможно, зависает во время передачи "Провода". Вам также следует рассмотреть возможность изменения
sprintf
наsnprintf
- очевидно, он более устойчив к проблемам с буфером и требует установки размера буфера вручную., @toweЯ попробовал это, и кажется, что все работает нормально до «перерыва» при выполнении моей отдельной функции., @Hojo.Timberwolf
Arduino Uno с моторным щитом Adafruit, @Hojo.Timberwolf
повторное подключение последовательного монитора сбрасывает плату.
while (Serial.available()==0){}
блокирует цикл, @JurajКажется, все работает нормально, если не вызывать Wire.h . Как только я вызываю функции Wire.h, последовательное соединение портится., @Hojo.Timberwolf