動作環境
Processing 3.1.1
ControlP5ライブラリ
Windows 8.1 pro (64bit)
参考 http://qiita.com/akspect/items/6a574e12181c00125d40
- sliderでCOMポートを変更
- Button押下時にポートオープン
- COMからの通信をコンソール出力
code
import processing.serial.*;
import controlP5.*;
Serial myPort;
ControlP5 slider;
int sliderValue;
int numSerial = 5;
int curSerial = -1;
ControlP5 btnOpen;
void setup() {
size(500,500);
slider = new ControlP5(this);
slider.addSlider("COM")
.setRange(-1, numSerial - 1)
.setValue(-1)
.setPosition(50,40)
.setSize(200, 20)
.setNumberOfTickMarks(numSerial + 1);
btnOpen = new ControlP5(this);
btnOpen.addButton("openPort")
.setLabel("Open")
.setPosition(275, 40)
.setSize(100, 30);
}
void controlEvent(ControlEvent theEvent) {
if (theEvent.isController()) {
if (theEvent.getName() == "COM") {
if (curSerial != slider.getValue("COM")) {
curSerial = (int)slider.getValue("COM");
}
}
}
}
void serialEvent(Serial myPort) {
String mystr = myPort.readStringUntil('\n');
mystr = trim(mystr);
println(mystr);
}
void openPort() {
println("Open Port");
if (myPort != null) {
myPort.stop();
}
myPort = new Serial(this, Serial.list()[(int)curSerial], 9600);
myPort.bufferUntil('\n');
}
void draw() {
background(0);
}
実行環境
実行環境
- シリアル受信側: processingを動かすPC (Windows 8.1pro)
- シリアル送信側: TeraTermで送信する (Windows 7 pro)
上記の2つの端末をシリアルのケーブル(クロス)で接続する。
こちらではVMイメージ2つにてnamed pipeを使っての動作をした。
送信側のTeraTermでは「設定 > 端末」にて[CR]を[CR+LF]に変更する。LFを終端として認識するため。
実行例
- Sliderを通信したいCOMポートに移動する
- OPENを押す
- 送信側から
文字列+Enter
を送信する- Processingソフトのコンソールにその文字列が表示される
COM1接続時
COM3接続時
補足
本当は違うんだ日記
本当はスライダ変更時にポートオープンをしたかったが不明なエラーが出たためボタンを追加した。
スライダ1つでオープンまでできないのであれば、スライダを使う意味はなさそう。
TeraTermの罠
TeraTermは送信を「CR+LF」にし忘れると失敗するので、確認が必要。
java
javaはまだよくわからない。以下は
if (myPort != null) {
myPort.stop();
}
GCを動かすために、以下のようにした方がいいのだろうか?
if (myPort != null) {
myPort.stop();
myPort = null; // for GC
}
あとの方でmyPort = new Serial()しているからGCは動くのだろうか?