Processing serial

Рейтинг: 1Ответов: 1Опубликовано: 24.08.2023

Программа должна управлять ардуино по com порту. Из выпадающего списка выдаётся список доступных com портов, но порт не хочет открываться. Все работает если вручную указать компорт.

import controlP5.*;
ControlP5 cp5;
import processing.serial.*;
Serial serial;


int speed = 9600;
String portName;
void setup () {
  size (400, 400);
  cp5 = new ControlP5(this);
  cp5.setFont(createFont("Ubuntu", 20));
  
serial = new Serial(this, "COM3", speed); //только если в ручную указать порт программа связывается с ардуино
  
String str[] = Serial.list();
  println(str); 

  // кнопки для работы с выпадающим листом
  cp5.addButton("Refresh").setPosition(228, 108).setWidth(100).setHeight(25);
  cp5.addButton("OpenPORT").setPosition(8, 91).setWidth(200).setHeight(25);
  cp5.addButton("ClosePort").setPosition(7, 125).setWidth(200).setHeight(25);

  cp5.addScrollableList("ComList").close()
    .setWidth(199)
    .setBarHeight(40)
    .setPosition(10, 10)
    .setItemHeight(35)
    .linebreak();
      cp5.addButton("ledOn").setPosition(8, 180).setWidth(200).setHeight(25);
   cp5.addButton("ledOff").setPosition(8, 220).setWidth(200).setHeight(25);
}

void draw() {
  background(120);
}

void OpenPORT(){
 
serial = new Serial(this, portName, speed);

 println(portName);

}

void Refresh() {
  String list [] = Serial.list();
  cp5.get(ScrollableList.class, "ComList").addItems(list);//получаем COM порты
}

void Comlist (int n) {
  portName = Serial.list()[n];
}

void ledOn(){
  serial.write('n');
  delay(1000);
}

void ledOff(){
  serial.write('f');
  delay(1000);
}

void ClosePort() {
 
 serial.stop();
 
}

Ответы

▲ 0Принят

добавил проверку на наличие порта и заработало вот итоговый код

int speed = 115200;
String portName;     // имя порта

import processing.serial.*;
Serial serial;
import controlP5.*;
ControlP5 cp5;






void setup() {
  size(500, 250);    // размер окна
  setupGUI();        // инициализация интерфейса
}


void draw() {
  background(120);   // заливаем фон        



}

   
void ledOn(){
  serial.write('n');
  delay(1000);
}
void ledOff(){
  serial.write('f');
  delay(1000);
}


// ======= ИНИЦИАЛИЗАЦИЯ ИНТЕРФЕЙСА ========
void setupGUI() {
  cp5 = new ControlP5(this);
  cp5.setFont(createFont("Calibri", 16));  // сделаем шрифт побольше

  // добавляем кнопки
  cp5.addButton("open").setPosition(90, 10).setSize(80, 30);
  cp5.addButton("close").setPosition(170, 10).setSize(80, 30).linebreak();
cp5.addButton("ledOn").setPosition(8, 180).setWidth(200).setHeight(25);
cp5.addButton("ledOff").setPosition(8, 220).setWidth(200).setHeight(25);


  // выпадающий список
  cp5.addScrollableList("com")
    .setPosition(10, 10)
    .setSize(80, 100)
    .setBarHeight(30)
    .setItemHeight(30)
    .close()
    .addItems(Serial.list());    
  ;
}

// ==== ОБРАБОТЧИКИ ИНТЕРФЕЙСА =====
// список портов
void com(int n) {
  portName = Serial.list()[n];  // запоминаем выбранный порт в portName
}

// кнопка открыть порт
void open() {
  if (portName != null && serial == null) {     // если выбран порт и сейчас он закрыт
    serial = new Serial(this, portName, speed); // открываем portName

  }
}

// кнопка закрыть порт
void close() {
  if (serial != null) { // если порт открыт
    serial.stop();      // закрываем portName
    serial = null;      // serial выключен
  }
}