#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;
}
}
}