質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

Q&A

解決済

2回答

3404閲覧

シリアル通信で受信したデータから欲しい情報だけ抜き出して送信したい(別PCにUSB接続で)

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

シリアルポート

シリアルポートは一度に一ビットごと移行される物理的なインターフェイスです。一般的には、9ピンのd-subコネクタであるRS-232を指します。

Processing

Processingは、オープンソースプロジェクトによるCGのためのプログラミング言語です。Javaをベースにしており、グラフィック機能に特化しています。イメージの生成やアニメーションなど、視覚的なフィードバックを簡単に得ることが可能です。

0グッド

0クリップ

投稿2018/12/23 04:42

編集2018/12/23 07:38

シリアル通信で受信したデータから欲しい情報だけ抜き出して別PCにUSB接続で送信したいです。
シリアル通信に関して全くの初心者であるため、詳細な手順を教えて頂けますと幸いです。
どうぞよろしくお願いいたします。

//現状
processingで、import processing.serial.;を使って試みているのですが、以下のエラ画面に表示まではできるようになりました。
//ソース
import processing.serial.
;
Serial myPort;
String datastr;

void setup() {
size(1000, 500);
background(0,0,0);
myPort = new Serial(this, Serial.list()[0], 115200);
myPort.clear();
myPort.bufferUntil('\n');
}

void draw() {
if ( myPort.available() > 0) {
delay(100);
datastr = myPort.readStringUntil('\n');
datastr = trim(datastr);
String datetimestr = nf(year(),2)+"/"+nf(month(),2)+"/"+nf(day(),2)+" "+nf(hour(),2) + ":" + nf(minute(),2) + ":" + nf(second(),2);
text(datetimestr + "," + datastr,10,200);
println(datastr);
}
}

//画面上
2018/12/23 16:23,::lq=168:ct=01CC:ed=810EBFF2:id=33:ba=3310:a1=0400:a2=0453:te=2213:hu=6275

ここから、
(変換前)::lq=168:ct=01CC:ed=810EBFF2:id=33:ba=3310:a1=0400:a2=0453:te=2213:hu=6275
(変換後)(timestamp) 2213,6275
のように書き換えて、別COMポートに送信したいです。

//課題
受信まではどうにか助言をいただき、できるようになったのですが、
下記2点がまだ解決しておりません。
・文字列からteとhuのみを抜き出す
・データ整理後、別COMポートへ送信する

助言のほど、お願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

本題は解決したとのことですが、余談いくつか。

Processing(Javaモード)はJavaにちょっとカワをかぶせたものですから、Javaの道具立てがいろいろ使えたりします。
例えば、日付の文字列を得るのは、自分で整形をつなげていかなくてもそういうクラスがあるので

Processing

1import java.util.Calendar; 2import java.text.SimpleDateFormat; 3 4import java.util.Calendar; 5import java.text.SimpleDateFormat; 6 7SimpleDateFormat sdf = new SimpleDateFormat("yy/MM/dd HH:mm:ss");//フォーマット定義 8 9for (int i=0; i<10; i++) { 10 String timeStamp=sdf.format(Calendar.getInstance().getTime()); //現在時刻を得て指定フォーマットに整形 11 println(timeStamp); 12 delay(1000); 13}

文字列の検索はIndexOfで出来ます。桁数の直接指定は、途中の桁数が絶対に変わらないという確信があるならそれでも出来なくはないですけれど。しばらくするとidが3桁になったりしませんか?

Processing

1final int DIGIT_TE=4; 2final int DIGIT_HU=4; 3final String TE_KEY="te="; 4final String HU_KEY="hu="; 5 6String s="2018/12/23 16:23,::lq=168:ct=01CC:ed=810EBFF2:id=33:ba=3310:a1=0400:a2=0453:te=2213:hu=6275"; 7 8int teBegin=s.indexOf(TE_KEY)+TE_KEY.length(); 9String te = s.substring(teBegin, teBegin+DIGIT_TE); 10 11int huBegin =s.indexOf(HU_KEY)+HU_KEY.length(); 12String hu = s.substring(huBegin,huBegin+DIGIT_HU); 13 14String newData= String.format("%s,%s",te,hu); 15println( newData );

シリアルの直結は
PC1<-USBシリアル変換-(Dsub9Pin)-シリアルのリバースケーブル-(Dsub9pin)-USBシリアル変換->PC2
のように間をリバースケーブルで接続しなければ通信出来ませんから、忘れないで買ってください。

teratermをお持ちなら、まずは双方のPCでteratermを立ち上げてそれぞれのPCで繋がっているポートを確認してからProcessingでの接続に進んだほうがいいです。上手く行かなかったときに何が何だかわからなくなりますから。

投稿2018/12/23 12:09

thkana

総合スコア7633

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/23 14:24

ご丁寧にご回答していただきましてありがとうございます。 文字列検索、非常に助かりました。 また、シリアル変換ケーブルもありがとうございます。探してみます。
guest

0

ベストアンサー

Error opening serial port COM3: Port busy

COM3が使用中なのでオープンできないと言ってますが。

投稿2018/12/23 04:48

y_waiwai

総合スコア87749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/23 04:54

ありがとうございます。 このエラーに関しては、Tera Termを閉じたらなくなりました。 ただ、コンソールにCOM3とでるだけの状況です。 どのようにしたら、欲しい情報だけ抜き出せるでしょうか。 COM3には温度センサーからシリアル通信で受信しています。
y_waiwai

2018/12/23 05:02

まずはその温度センサからどういう形式でデータが出てくるのかわかってますか? https://qiita.com/7of9/items/4be0cbbdc02c81b27025 とりあえず、1行づつ受信して画面に出すコードを組んで、画面になにが出てくるのか見てみれば。
退会済みユーザー

退会済みユーザー

2018/12/23 05:13

myPort = new Serial(this, Serial.list()[0], 115200); を9600から115200に書き換えたら以下のようになりました。 COM3 ::lq=168:ct=01CC:ed=810EBFF2:id=33:ba=3310:a1=0400:a2=0453:te=2213:hu=6275 ::lq=162:ct=01CD:ed=810EBFF2:id=33:ba=3310:a1=0402:a2=0455:te=2192:hu=6279 java.lang.NullPointerException at processing.core.PApplet.parseInt(PApplet.java:9629) at processing.core.PApplet.parseInt(PApplet.java:9615) at temperature.draw(temperature.java:40) at processing.core.PApplet.handleDraw(PApplet.java:2429) at processing.awt.PSurfaceAWT$12.callDraw(PSurfaceAWT.java:1557) at processing.core.PSurfaceNone$AnimationThread.run(PSurfaceNone.java:313) ::lq=165:ct=01CE:ed=810EBFF2:id=33:ba=3320:a1=0402:a2=0458:te=2204:hu=6296 ::lq=168:ct=01CF:ed=810EBFF2:id=33:ba=3310:a1=0405:a2=0455:te=2210:hu=6255 ::lq=159:ct=01D0:ed=810EBFF2:id=33:ba=3310:a1=0405:a2=0458:te=2204:hu=6257 ここから、下記のようにしたいです。 (変換前)::lq=168:ct=01CC:ed=810EBFF2:id=33:ba=3310:a1=0400:a2=0453:te=2213:hu=6275 ※←Tera Termで確認 (変換後)(timestamp) 2213,6275 いろいろとお力添えいただきありがとうございます。 もう少しばかりお願いいたします。
y_waiwai

2018/12/23 05:16

変換するより前に、受信データを正常に画面表示できるようにしましょう。 そんな基本的なこともできないではどうしようもありません
退会済みユーザー

退会済みユーザー

2018/12/23 07:24

画面に表示まではできるようになりました。 //ソース import processing.serial.*; Serial myPort; String datastr; void setup() { size(1000, 500); background(0,0,0); myPort = new Serial(this, Serial.list()[0], 115200); myPort.clear(); myPort.bufferUntil('\n'); } void draw() { if ( myPort.available() > 0) { delay(100); datastr = myPort.readStringUntil('\n'); datastr = trim(datastr); String datetimestr = nf(year(),2)+"/"+nf(month(),2)+"/"+nf(day(),2)+" "+nf(hour(),2) + ":" + nf(minute(),2) + ":" + nf(second(),2); text(datetimestr + "," + datastr,10,200); println(datastr); } } //画面上 2018/12/23 16:23,::lq=168:ct=01CC:ed=810EBFF2:id=33:ba=3310:a1=0400:a2=0453:te=2213:hu=6275 ここから、 (変換前)::lq=168:ct=01CC:ed=810EBFF2:id=33:ba=3310:a1=0400:a2=0453:te=2213:hu=6275 (変換後)(timestamp) 2213,6275 のように書き換えて、別COMポートに送信したいです。 助言のほど、お願いいたします。
y_waiwai

2018/12/23 08:05

んじゃそのつぎは、受信文字列から、te=を検索して、その文字列以降を出力するようにしましょう 文字列処理の話ですね
退会済みユーザー

退会済みユーザー

2018/12/23 08:43 編集

"te="や"hu="以降の抜き出しはわからなかったので、 下記のように何文字目かで抜き出しました。これでも大丈夫でしょうか。 te = datastr.substring(74, 78);//temperature hu = datastr.substring(82, 86);//humid //コンソール :lq=153:ct=00C9:ed=810EBFF2:id=33:ba=3310:a1=0663:a2=0537:te=2217:hu=5581 //画面上 2018/12/23 17:41 2217 5581 あと、別ポートへの送信はどのように選択したらいいのかが分かりません。 良い方法ございますでしょうか。
退会済みユーザー

退会済みユーザー

2018/12/23 09:31

教えていただいたURLを参照しましたが、後方部分抜き出しの仕方はわかりませんでした。 また、送信用ポートを作成し、実行してみましたが、別PC側から受信できませんでした。 どこに原因がございますでしょうか。 //ソース import processing.serial.*; import processing.net.*; Serial inPort; Serial outPort; String datastr; String te,hu; void setup() { size(1000, 500); background(0,0,0); println(Serial.list()); inPort = new Serial(this, Serial.list()[0], 115200); outPort = new Serial(this, Serial.list()[1], 115200); inPort.clear(); inPort.bufferUntil('\n'); } void draw() { if ( inPort.available() > 0) { delay(100); datastr = inPort.readStringUntil('\n'); datastr = trim(datastr); te = datastr.substring(74, 78);//temperature hu = datastr.substring(82, 86);//humid String datetimestr = nf(year(),2)+"/"+nf(month(),2)+"/"+nf(day(),2)+" "+nf(hour(),2) + ":" + nf(minute(),2) + ":" + nf(second(),2);//timestamp text(datetimestr + " " + te + " " + hu,10,200);//window println(datastr); outPort.write(datetimestr + " " + te + " " + hu); } }
y_waiwai

2018/12/23 09:40

Serial.list()[1] がホンマにそのポートを指してるのかチェックしてみる 相手のPCとはなにを使ってつないでるかはわからんが、送信確認用のランプとかついてたらそれ見てみる オシロがあるなら送信してるか波形をチェック
退会済みユーザー

退会済みユーザー

2018/12/23 10:25 編集

println(Serial.list()[1]);で書き出し、COM4であることは確認しました。 使用USBはUSB3.0 wormhole switch JUC500です。 ランプやオシロが手元に無いので、他に方法があれば助言を頂きたいです。 お願いいたします。
y_waiwai

2018/12/23 10:33

それってシリアルケーブルじゃないぢゃん serialでは通信できません
退会済みユーザー

退会済みユーザー

2018/12/23 10:38

そうなんですね。 教えていただき、ありがとうございました。 シリアルケーブルを入手してからまたトライします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問