前回2ポートで受信ログプログラムを簡単に作ったので、今回は3ポートの受信ログプログラムを作りました。1.5時間で完成となりました。TeraTermを3個立ち上げてログする操作が屋外でやるのが大変なので、このプログラムを作りました。まだ、UMPCでの動作確認はできてませんが。
●準備
3個のマイコンをそれぞれUSBシリアルでUSBハブ経由でPCへ接続して、TeraTermで3個がきちんと受信されているか確認、送信文は、COM番号とデータ連番、タイムスタンプの3データを115200bpsで送ってます
Processingが使える人が対象ですが、Processingは、BASICとかC++ができる人なら簡単にできます。文科系、芸術系の学生さんがよく使ってます。
入門は、こちらMSLABO様にブログが最適です。私も随分お世話になりました。
http://mslabo.sakura.ne.jp/WordPress/make/processing%e3%80%80%e9%80%86%e5%bc%95%e3%81%8d%e3%83%aa%e3%83%95%e3%82%a1%e3%83%ac%e3%83%b3%e3%82%b9/
●プログラム
TXTgファイルを添付します。これをPROCESSINGの新規プログラム窓のコピペして実行するだけでOKです。
SerialTest_3Port_longdata_rev06
操作は、実行でログ開始してログファイルは、ProcessingのプログラムのあるフォルダーにCSVでログされます
停止は、表示されている窓にカーソルをいれた状態でqをキーインすれば終了してファイルが保存されます。
qをキーインしないとファイルは保存されません。
// Example by Tom Igoe import controlP5.*;//Display library ControlP5 cp5tl; Textlabel tl1,tl2;//for Displayimport processing.serial.*;//USB Serial library PrintWriter output;//Filing library int lf = 10; // Linefeed in ASCII int cr=13; //Carriage Return in ASCII String myString1 = null;//1st Recieved data as string String myString2 = null;//2nd Recieved data as string String myString3 = null;//3rd Recieved data as string String [] splt_arry1=new String[100]; String [] splt_arry2=new String[100]; String [] splt_arry3=new String[100]; Serial myPort1; // 1st serial port Serial myPort2; //2nd serial port Serial myPort3; //2nd serial port int i,j; int elapsedTime; int startTime; int endTime; int endFlag=0; String [] V1=new String[1100];//1stArray declaration Buffer memory recived 600K data String [] V2=new String[1100];//2nd Array declaration Buffer memory recived 600K data String [] V3=new String[1100];//3rd Array declaration Buffer memory recived 600K data int dummy; float stx,sty,stx_1,sty_1;void setup() { frameRate(2000); //===================Display setup=================== size(1000,500); background(255); PFont font; font=createFont(“Times New Roman”,30); textFont(font);cp5tl=new ControlP5(this); tl1=cp5tl.addTextlabel(“lable1″); tl1.setText(” Data Sampling ==>Push ‘q ‘ save CSV&Stop”); tl1.setFont(font); //======================================================= // ********************Serial setup=********************** //List all the available serial ports printArray(Serial.list()); // Open the port you are using at the rate you want: myPort1 = new Serial(this, Serial.list()[0], 115200); myPort1.clear(); myPort2 = new Serial(this, Serial.list()[1], 115200); myPort2.clear(); myPort3 = new Serial(this, Serial.list()[2], 115200); myPort3.clear(); // Throw out the first reading, in case we started reading // in the middle of a string from the sender. myString1 = myPort1.readStringUntil(lf); myString1 = null; myString2 = myPort2.readStringUntil(lf); myString2 = null; myString3 = myPort3.readStringUntil(lf); myString3 = null; //********************************************************** //——————Save FIle setup————————————————————– String filename = nf(year(),4) + nf(month(),2) + nf(day(),2) + nf(hour(),2) + nf(minute(),2) ; // 新しいファイルを生成 output = createWriter( filename + “.csv”); i=0; j=0; //———————————————————————————————– }void draw() { while (myPort1.available() > 0 && myPort2.available() > 0 && myPort3.available()>0) {//–1ch————————————— myString1 = myPort1.readStringUntil(cr); //delay(200); myString1 = trim(myString1); if (myString1 != null) { i++; i=i%1000; //print(“S1:[“,i,”]”,myString1); V1[i]=myString1; print(“V1[“,i,”]”,V1[i]); // timGraph(i,V1,2); }//—2ch——————————————- myString2 = myPort2.readStringUntil(lf); //delay(200); myString2 = trim(myString2); if (myString2 != null) { j++; j=j%1000; //print(“S2[:”,j,”]”,myString2); V2[j]=myString2; println(“V2[“,j,”]”,V2[j]); //timGraph(j,V2,3); } //—3ch——————————————- myString3 = myPort3.readStringUntil(lf); //delay(200); myString3 = trim(myString3); if (myString3 != null) { j++; j=j%1000; //print(“S2[:”,j,”]”,myString2); V3[j]=myString3; println(“V3[“,j,”]”,V3[j]); //timGraph(j,V2,3); } } } void keyPressed(){ } |
●結果
データ落ちはなくログされてますが、COM7が遅いせいか1行ぬけででてます。
※追記 2020年10月 「Processingは卒業しました。」
2020年8月から1か月かけて、VisualStudio2019 でVisualBasic.NETを学習しました。
Processingではできなかった機能が必要だったからです。
1:フォームベースでボタン、コンボボックスなどオブジェクトを多用した操作パネルを使いたい
2:マルチタスクでシリアルポート受信して、バッファを制御しながら
データ間の同期を数msec精度で受信したい。
=>Processingでは、同時受信できますが、バッファにためておくだけで、リアルタイムに表示することはできません。なぜなら、マルチタスクを微妙に制御する命令群がありません。
3:.NETのライブラリー(C#など)が活用できる
慣れるまで1か月かかりましたが、慣れてしまえば、Processing以上の楽にプログラミングできます。
4:PCの性能そのもののプログラムができる
ボーレートも921600bpsでも可能です。
複数ポートも4ポートま同時受信できます(同期してない)
=>PCの処理能力次第でどこまでもプログラムが高性能化する