Последовательное соединение между Processing и Arduino не работает

Я пытаюсь подключить Arduino Nano Every раз и обрабатывать через последовательный. Я не получаю ошибок ни с одной стороны, и последовательная функциональность arduino работает иначе в arduino IDE.

Я подключаюсь к нужному порту, и порт занят во время выполнения кода обработки (как и следовало ожидать), однако переменная внутри arduino не обновляется. На самом деле весь оператор if serial.available не выполняется.

Arduino:

int var;

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

void loop() {
  if (Serial.available()) {
    var = Serial.read();
  }
  Serial.println(var);
  delay(100);
}

Обработка:

import processing.serial.*;

// Последовательный порт
Serial myPort;

void setup() {
  // Список всех доступных последовательных портов:
  printArray(Serial.list());
  // открытый порт
  myPort = new Serial(this, Serial.list()[2], 9600);
}

void draw() {
  try {
    myPort.write(1);
  }
  catch(Exception e) {
    // Выведите подробную информацию об ошибке на консоль.
    System.err.println(e);
    e.printStackTrace();
  }
  delay(50);
}

ПС. Попросил модератора закрыть предыдущий пост по теме.

, 👍1

Обсуждение

Откуда вы знаете, что это не работает? Я не вижу, чтобы вы что-то читали из последовательного интерфейса в скетче обработки. Что вы на самом деле видите?, @chrisl

Я прочитал переменную в последовательном мониторе arduino IDE, подождав несколько секунд и остановив приложение обработки. Если приложение обработки успешно записывает данные в arduino, то var = 1, однако это = 0., @Zhelyazko Grudov

как бы вы когда-нибудь узнали значение var?, @jsotola

Я печатаю его на последовательном мониторе в arduino IDE. Мне не хватает фундаментального sth?, @Zhelyazko Grudov

Я не уверен, как это происходит с Nano Every, но другие ардуино сбрасываются каждый раз, когда вы снова открываете последовательный порт. И это происходит, когда вы закрываете программу обработки и открываете последовательный монитор. Если это также относится к Nano Every, то вы не можете получить ничего, кроме нуля, потому что значение, отправленное скетчем обработки, уже забыто из-за сброса Arduino. Вам нужно будет прочитать и распечатать серийный номер внутри вашего скетча обработки, @chrisl

Спасибо за комментарий, Крис. Но разве переменная не будет обновляться и оставаться обновленной? Таким образом, он получает значение, и даже если серийный номер не открыт, он должен оставаться на том же значении, что и был установлен? Насколько я понимаю, я отправляю значение с моим кодом обработки в arduino и сохраняю это значение в переменной. Затем я закрываю последовательное соединение с обработкой и пытаюсь прочитать значение переменной. Однако переменная не была обновлена так, как я ожидал., @Zhelyazko Grudov


2 ответа


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

1

Большинство ардуино (и Nano Every-один из них) сбрасываются при повторном открытии последовательного соединения (вы закрываете его, закрывая скетч обработки и снова открывая его с помощью последовательного монитора). Переменные хранятся в оперативной памяти, которая стирается и повторно инициализируется после сброса или потери питания.

Так что в основном это происходит: Вы отправляете данные от обработки по последовательному каналу на Arduino. Arduino помещает полученное значение в переменную в своей оперативной памяти. Затем вы закрываете скетч обработки, эффективно закрывая последовательное соединение. Затем вы открываете последовательный монитор, который снова открывает последовательное соединение. Это запускает сброс Arduino и стирает предыдущее значение переменной из оперативной памяти. Таким образом, вы всегда будете видеть только начальное значение переменной (ноль).

Вы можете предотвратить сброс по последовательному каналу, если подключите конденсатор между выводом сброса и землей.

Хотя я бы сказал, что это, вероятно, не то, что вы действительно должны делать. Вместо этого просто считайте данные из serial внутри вашего скетча обработки. После того как вы прочитаете его, вы можете распечатать.


В качестве дополнительного примечания: функция reset-on-serial-reconnect используется для программирования Arduino по последовательному каналу (через USB-кабель). Новая программа записывается загрузчиком в память программы (flash). Загрузчик запускается непосредственно после сброса/включения питания. Таким образом, чтобы загрузить новую программу в Arduino, Arduino IDE должен сначала сбросить Arduino, чтобы поговорить с загрузчиком.

,

Ну, это то, о чем я никогда бы не подумал подумать. Большое тебе спасибо, Крис. Я полностью застрял здесь!, @Zhelyazko Grudov

Я полагаю, что этот сброс происходит только в том случае, если вы открываете/закрываете последовательное соединение с ПК. Поскольку многократное открытие и закрытие последовательного монитора из IDE не вызывает такого же сброса?, @Zhelyazko Grudov


1

Если вы откроете скетч обработки и отправите данные на Arduino, не открывая последовательный монитор в Arduino IDE, данные пройдут. Вот ваш скетч Arduino, который немного изменен. Отказ от ответственности - проверено на Uno.

Существуют и другие варианты для последовательных мониторов, которые могут работать (зависит от ОС), а также другие варианты интерфейса между обработкой и Arduino, такие как Firmata

int var;

void setup() {
  Serial.begin(9600);
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
}

void loop() {
  if (Serial.available()) {
    var = Serial.read();
    digitalWrite(2, HIGH);
    delay(50);
    digitalWrite(2, LOW);
  }
  Serial.println(var);
  delay(100);
}

Обновление

Arduino IDE версии 1.0.6.2 с обработкой 2.2-ish позволит вам открыть последовательный монитор в Arduino IDE и "контролировать" данные. Поскольку вы больше не можете этого делать, как насчет того, чтобы ваше приложение обработки открыло 2 окна? Одно окно может быть домашним серийным монитором, а другое - скетчем, над которым вы работаете. Используя обработку версии 3.5.3, это всего лишь 15 строк кода, чтобы открыть 2 окна. Я уверен, что фактическое внедрение такой системы было бы хорошей задачей.

,

@Zhelyazko Grudov - Еще один способ открыть 2 окна: https://gist.github.com/atduskgreg/666e46c8408e2a33b09a Просто скопируйте и вставьте оба скетча в ОДИН скетч и попробуйте :), @VE7JRO

Спасибо @ve7JRO за ответ. Я думаю, что проблема была в том, что Крис упомянул ниже с перезагрузкой. Тем не менее, это очень полезная информация для отладки, так что спасибо, что поделились., @Zhelyazko Grudov