0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Processing / ControlP5 > Serialの切替え > Slidebar / Buttonの使用

Last updated at Posted at 2016-07-14
動作環境
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接続時

qiita.png

COM3接続時

qiita.png

補足

本当は違うんだ日記

本当はスライダ変更時にポートオープンをしたかったが不明なエラーが出たためボタンを追加した。
スライダ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は動くのだろうか?

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?