Игра в ловушку между Arduino и обработкой

#serial-port #arduino #processing

#последовательный порт #arduino #обработка

Вопрос:

Следующий код заставляет Arduino и обработку передавать «A» взад и вперед, как горячую картошку:

ОБРАБОТКА ОТПРАВЛЯЕТ «A» В ARDUINO

 import processing.serial.*; //import the Serial library
Serial mySerial;  //the Serial port object

void setup() 
{
  mySerial = new Serial(this, Serial.list()[7], 9600); //Pick whichever works
  mySerial.bufferUntil('n');
}

void serialEvent( Serial mySerial) 
{
  println("writing A...");
  delay(1000);                   //How I defined this is not relevant. Trust me.
  mySerial.write('A');        //Send 'A' to Arduino
}
  

ARDUINO ОТПРАВЛЯЕТ «A» ОБРАТНО В ОБРАБОТКУ

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

void loop()
{
  delay(1000);
  Serial.println('A');      //Send 'A' back to Processing
}
  

Что происходит?
Хорошо… игра работает примерно для десяти обменов (откуда я знаю? ну, я получаю сообщение «запись …» пять раз, и мое использование bufferUntil() говорит мне, что каждое из этих сообщений было вызвано получением Serial.println(‘A’) от Arduino), НО затем обработка прерывается со следующей ошибкой:

 Error, disabling serialEvent() for /dev/tty.usbmodem1421
null
java.lang.RuntimeException: Error reading from serial port /dev/tty.usbmodem1421: Port not opened
    at processing.serial.Serial.serialEvent(Unknown Source)
    at jssc.SerialPort$LinuxEventThread.run(SerialPort.java:1299)
Could not run the sketch (Target VM failed to initialize).
For more information, read revisions.txt and Help → Troubleshooting.
  

Что происходит?

Ответ №1:

 Port not opened
  

было ключевым словом в сообщении об ошибке: последовательный порт время от времени случайно закрывается. Решение состоит в том, чтобы постоянно заставлять его открывать в draw:

 Serial serial;
boolean serialInited;


void draw () {
    if (serialInited) {
        // serial is up and running
        try {
            byte b = serial.read();
            // fun with serial here...
        } catch (RuntimeException e) {
            // serial port closed :(
            serialInited = false;
        }
    } else {
        // serial port is not available. bang on it until it is.
        initSerial();
    }
}

void initSerial () {
    try {
        serial = new Serial(this, Serial.list()[0], BAUD_RATE);
        serialInited = true;
    } catch (RuntimeException e) {
        if (e.getMessage().contains("<init>")) {
            System.out.println("port in use, trying again later...");
            serialInited = false;
        }
    }
}