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

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

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

UWSCは、Windowsの作業を自動化するソフトです。マウスとキー入力を記録して代行することが可能。スクリプト形式により自由に編集することもできます。スケジュール機能を持ち、Excelとの連携も可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

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

Q&A

解決済

1回答

1464閲覧

processingが作成したcsvデータをuwscが読み込まない

yuga1223

総合スコア2

UWSC

UWSCは、Windowsの作業を自動化するソフトです。マウスとキー入力を記録して代行することが可能。スクリプト形式により自由に編集することもできます。スケジュール機能を持ち、Excelとの連携も可能です。

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Processing

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

0グッド

0クリップ

投稿2021/08/08 09:30

編集2021/08/09 03:11

前提・実現したいこと

arduinoからの情報をprocessingが受け取り、processingはcsvデータを吐き出します。
ここまではいいのですが、この吐き出したcsvデータをuwscが受け取るとき、数字を読み込まなくなります。

まずarduinoはシリアルポートに数字を出します。以下のコードを見ればわかるように、まず0, 0 を出します。
そしてprocessingは, arduinoが出した数字(今回は0,0 )を読み込み、csvファイル(Lineinputnumber.csv)を作成して数値0,0をcsvファイルに書き込み、processingはexit()関数で停止します。

uwscの方ですが、2つのcsvファイル(すでにあるLineautobook.csvと, 今作成されたLineinputnumber.csv)を読み込みます。
問題はこの読み込みです。

Lineautobook.csvは漢字やアルファベットの名前が書かれているcsvファイルで、すでに作成されています。こちらは普通に読み込みます。(MSGBOXで確認できています。)
しかし、Lineinputnumber.csvにかかれている数字(0,0)は読み込まれません。(つまり以下のuwscプログラミングにおける変数a,bに0,0が入るはずなのですが、MSGBOXで確認しようとしても、空欄になります。)
実際にLineinputnumber.csvを開くとしっかり1行目1列目に0, 1行目2列目に0が書かれているにも関わらずです。

該当のソースコード

arduinoのプログラムは以下の通りです。

int x=0;
int y=0;

void setup()
{
Serial.begin(9600);
}
void loop()
{
//シリアルモニタに表す
Serial.print(x);
Serial.print(",");
Serial.println(y);
delay(1000);

x=x+1;
y=y+1;

}

processingのコードは以下の通りです。

import processing.serial.*;
PrintWriter output;
Serial myPort;
long time=0;
String str_format = "x,y";
String port = "COM3";
int a=0;

void setup() {
size(320, 240);
myPort = new Serial(this, port, 9600);
//csvファイル(Lineinputnumber.csv)の作成
output = createWriter( "Lineinputnumber.csv");
}

void draw() {
while ( myPort.available() > 0 ) {
String inBuffer = myPort.readString();
if ( inBuffer != null &&a==0) {
//arduinoからの情報をcsvに書き込む
output.print(inBuffer);
a=a+1;
}

if ( a==1) { //processingのプログラムを停止 output.flush(); output.close(); exit(); }

}
}

uwscのコードは以下の通りです。

//Lineautobookに書かれている名前の数
book_num = 13

//Lineautobookに書かれている名前をスキャンして格納
DIM name[book_num]

// CSVをオープン
fib = FOPEN("lineautobook.csv", F_READ)
fin = FOPEN("Lineinputnumber.csv", F_READ)

// Lineinputnumberをスキャン
a = FGET( fin, 1, 1 )
b = FGET( fin, 1, 2 )

// Lineautobookの各行をスキャン
FOR i = 1 TO book_num
// CSVの各列の情報を読み取り
name[i-1] = FGET( fib, i, 3)

NEXT

//読み込んでほしいcsvデータが読み込まれているか確認
MSGBOX("a="+a)
Sleep(1)

MSGBOX("b="+b)
Sleep(1)

MSGBOX("name[0]="+name[0])
Sleep(1)

//ファイルを閉じる
FCLOSE( fib )
FCLOSE(fin)

試したこと

Lineinputnumber.csvを閉じた状態や開いた状態にしてもだめでした。
しかしLineinputnumber.csvの中身を書き換えずExcelアプリで上書き保存するだけで読み込めるようになります。
しかし今回諸事情のため、手動でExcelを上書き保存ボタンは押したくありません。

ですのでUWSCでLineinputnumber.csvを自動的に上書き保存するプログラム(以下に記載)をuwscのプログラム上部に追加したものの、DOSCMDが終わった後停止してしまいます。(つまり、Lineinputnumber.csvは開きますが上書き保存、終了が行われない)
試しにlineinputnumber.csvを閉じてみると、プログラムが再開し、上書き保存が行われます。

cmf="C:\Users\itoyu\Downloads\lineautoprocess\Lineinputnumber.csv"

id7=DOSCMD(cmf, FALSE, FALSE)

Sleep(3)

//上書き保存
KBD(VK_CTRL, DOWN)
KBD(VK_S, DOWN)
KBD(VK_S, UP)
KBD(VK_CTRL, UP)
MSGBOX("上書き保存しました")

Sleep(2)

//Excelの終了
KBD(VK_ALT, DOWN)
KBD(VK_F4, DOWN)
KBD(VK_F4, UP)
KBD(VK_ALT, UP)

色々思考錯誤しましたがなかなか進まないため、こちらに質問させていただきました。
長くなってしまいましたが宜しくお願いいたします。

追記
マルチポストさせていただきました。
理由:マルチポストが習慣化してしまっていたため。
リンク:https://detail.chiebukuro.yahoo.co.jp/qa/question_det

不明点がすべて解明してはいませんが、問題解決しました。

DOSCMD(FALSE,FALSE)→DOSCMD(TRUE,FOLSE)に変更することで、プログラムが停止する問題は解決しました。
processingが吐き出したcsvデータをuwscが直接読み込む方法はまだ解明されていません。(uwscで上書き保存を自動的に行わせることで問題の解決はしました)

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

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

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

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

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

thkana

2021/08/08 21:50

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10247371980 マルチポストについてはルールが定められています。対応してください。 「やむを得ず複数のサイトに質問を投稿された場合は、質問内容にマルチポストをする理由を書き、他のサイトの投稿へのリンクを貼ってください。また、解決した際には必ずteratail及びすべての投稿に解決した旨と、どのように解決したかを記載してください。」 https://teratail.com/help#posted-otherservice
thkana

2021/08/09 00:54

Arduinoと言ってもいろいろありますけれど、UNOですか? ちょっとProcessingは置いておいて、Arduino IDEでシリアルモニタを閉じたり立ち上げたりしてみてください。立ち上げ後最初の表示はどうなっていますか? それがProcessingのプログラムが受け取る文字列になるはずのものですが、そのプログラムで処理できるはずのデータが届いていますか?
yuga1223

2021/08/09 02:51

マルチポストの方ですが、初めての利用でしたので知りませんでした。ごめんなさい。 今回UNOを使っています。シリアルモニターの方ですが、 0,0 1,1 2,2 という表示です。processingのプログラムが受け取る文字列になっていました。 ちなみにprocessingにおいて、受信バッファにあるデータを取り込む回数を1回から2、3回に変更することで(つまりa=0だけでなく、a=1やa=2のときにもデータを取り込めるようにする)、出力されるcsvファイルは 0,0 1,1 となります。
yuga1223

2021/08/09 02:55

知恵袋の方に質問させていただいた際の回答からわかったことなのですが、上書き保存前と後でバイト数が大きく変化しています。csvファイルの形が上書き保存によって、uwscファイルが読み込める形になるのではないかとのことです。
thkana

2021/08/09 03:40

マルチポストについては、teratailでは非推奨ということですので今後は心に留めておいてください。 で、シリアルモニタの方は...私のてもとと状況が違いますね。私のほうではシリアルモニタを閉じたり開いたりしていると、開いた時に文字列の先頭にゴミがついているが観察できたりもするのですけれど。
yuga1223

2021/08/09 04:17

ごめんなさい。 閉じたり立ち上げたりしたら、先頭にゴミがついているのが確認できました。(一番最近に閉じた際の続きのようなものが、開きなおした際に現れます。)
thkana

2021/08/09 04:47

というわけで、通信の「プロトコル(手順)」を考えてやらきなゃ...やっぱりその受信ルーチンじゃ大丈夫じゃないわけです。
guest

回答1

0

ベストアンサー

uwscは使っていないので知りませんが、csvファイルの行末に改行が必要、といかいうことはありませんか?

while ( myPort.available() > 0 ) { String inBuffer = myPort.readString(); if ( inBuffer != null &&a==0) { //arduinoからの情報をcsvに書き込む output.print(inBuffer); a=a+1; } if ( a==1) { //processingのプログラムを停止 output.flush(); output.close(); exit(); } }

の動きはちゃんと把握しているでしょうか?
String inBuffer = myPort.readString(); はそのとき受信バッファにあるデータを取り込むだけであって、一行分のデータを取り込むということではないのは大丈夫ですか? 最悪、一文字だけ(送りが"0,0\n"だったら'0'だけ)しか受信/ファイル書き込みしないこともありうる、というのは覚悟の上で使っていますか?

投稿2021/08/08 09:56

thkana

総合スコア7703

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

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

yuga1223

2021/08/08 14:54

回答ありがとうございます! はい、readStringについては大丈夫です。とりあえず今はarduinoのシリコンボードにPrintされた数値がcsvに出力され、そのcsvをuwscがしっかり読み込んでくれるかどうかが一番確認したいことなので。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問