【シリアル通信】Processingで460800bps通信できた<超簡単>

マイコンのデータをPCへ取り込む手段に自由度をもとめるといきなりMicrosoftのやり方に合わせないといけなくなるのですが、VisualStudioは、プログラムを作ることを仕事、テーマにしている専門家の方なら便利でしょうけど、私のように、マイコン電子工作趣味で、プログラムは手段にしかすぎない人には、VSをつかいこなすために費やす時間が無駄としか思えません。いろいろ探した結果、ArduinoIDE的な使われ方をしている言語Processingに行きつきました。
●Processing入門(数時間でOKです)

PROCESSING 逆引きリファレンス

こちらのMSLABO様が判り易く解説されてます。質問メールすれば丁寧に回答していただけます。

 

●460800bpsでデータ受信してCSVファイル保存プログラム(コピペで動作します)
今回は、ProcessingでマイコンのUSBシリアルポートから460800bpsという高速通信ができたプログラムを備忘録しておきます。この速度だと、マイコンのAD変換周期500μsecで1行20バイトのデータをPCへ転送してAD変換を5分間回して、60万行分のデータをCSVファイル保存できました。
Processingのシリアル通信コマンドはわずか数行だけです。
これだけで好きな受信ププログラム作れます。
●プログラムのシリアル受信コマンド

①冒頭の宣言として=>import processing.serial.*;
②オブジェクト定義=>Serial myPort;
③データSgtring型配列定義(任意)
=> String [] mystringArry=new String[600000]; //recived data

③COM番号とLIST番号表示=> printArray(Serial.list());
④COM番号、ボーレート指定=>myPort = new Serial(this, Serial.list()[1], 460800);

⑤COMポートをリセット=> myPort.clear();
⑥受信ループ=>i++でデータ数カウント
while (myPort.available() > 0) {
myString = myPort.readStringUntil(cr);
if (myString != null) {
if (i==0){startTime=millis();}
i++;//data cout
print(i,myString);
mystringArry[i]=myString;
}

⑦ループの終了=>KEY割り込みを使ってbreakする
void keyPressed(){
int k;
String[] datastr=new String[100];//1 line 100chara
if( key == ‘q’ ){
for(k=0;k<i;k++){ //i data counted
output.print(mystringArry[k]);
}
output.flush();
output.close();
exit();
}
}

 

 

●Processingソース
 コピペしてCOMポート番号をあわせればCSVファイル作ってくれます。RUNでロギング開始して’q’キー入力で、CSVファイルとしてSAVEしてくれます。データ行数は60万行になってますが、もっと大きくしても動作すると思います。
①動作概要
・マイコンからのシリアル通信を割り込み処理で受信してます。
・RUNさせている間、受信データ1行分をデータ配列String[]に記録してPCのメモリーに保持してます。このプログラムでは、60万行分を配列定義してます。高速化のために、
※受信データはString形式のままCSVに保存してますので、CRLFもそのまま保存されれますので、マイコン側の送信文字列でLFを省いておかないとCSVファイル改行が2回はいって空行が1行入ってしまうので注意です。
・text表示のためにcontrolP5ライブラリ使ってますが、テクスト表示しなくてもRUNさせて、下部モニターに受信データが流れますので、きりのいいところで’q’キーインすれば受信停止して、CSVファイルにSAVEしてくれるので、ControlP5関係を消しても動作します。
Processing Source:HIghSpeed_SerialDataSampling_460800bps

// Example by Tom Igoe
//Shinshu Makers customiazed
// Serial Speed 460800bps Recieving OK
// Recieving 600000 sample data
//Push ‘q’ key stop program and Save CSV file
import controlP5.*;//TEXT DISPLAY library
ControlP5 cp5tl;
Textlabel tl1,tl2;
import processing.serial.*; //serial library
PrintWriter output;//file saving declaration
int lf = 10; // Linefeed in ASCII
int cr=13; // NA
String myString = null;//buffer
Serial myPort; // The serial port declaration
int i,j;
int elapsedTime;
int startTime;
int endTime;
int endFlag=0;
String [] mystringArry=new String[600000]; //recived data
void setup() {
//————— TEXT Diplay————————-
size(600,100);
background(0,0,0);
PFont font;
font=createFont(“Times New Roman”,30);
textFont(font);
//Display Comments
cp5tl=new ControlP5(this);
tl1=cp5tl.addTextlabel(“lable1″);
tl1.setText(” Data Sampling ==>Push ‘q ‘ save CSV&Stop”);
tl1.setFont(font);
//———————————————————
// List all the available serial ports
printArray(Serial.list());//Search serial portNo=Serila.list(No)
// Open the port you are using at the rate you want:
myPort = new Serial(this, Serial.list()[0], 460800);//COM No set and baud rate set
myPort.clear();
// Throw out the first reading, in case we started reading
// in the middle of a string from the sender.
myString = myPort.readStringUntil(lf);//LF delimitor
myString = null;
// CSV FILE TIME STAMP
String filename = nf(year(),4) + nf(month(),2) + nf(day(),2) + nf(hour(),2) + nf(minute(),2) ;
output = createWriter( filename + “.csv”);
i=0;
}void draw() {
// LOOP Serial Recieved data are stored to mystringArry[]
while (myPort.available() > 0) {
myString = myPort.readStringUntil(cr);
if (myString != null) {
if (i==0){startTime=millis();}
i++;//data cout
print(i,myString);
mystringArry[i]=myString;
}

}
}

// Key ‘q’ Interrupt and Save CSV FILE de Program end
void keyPressed(){
int k;
String[] datastr=new String[100];//1 line 100chara
if( key == ‘q’ ){
for(k=0;k<i;k++){ //i data counted
output.print(mystringArry[k]);
}
output.flush();
output.close();
exit();
}
}

●動作と使い方
ProcessingIDEを立ち上げて
ファイルー新規 で新規プログラム開きます。
プログラムを保存すればProcessingがそのプログラム名のフォルダーを作ってくれます、そのフォルダーにCSVファイルが保存されます。

ここに上記HIghSpeed_SerialDataSampling_460800bps
をコピペします。

シリアルCOM番号は、デフォルトで0番になってますが、ケースバイケースでCOM番号が変わりますので、違っていればエラーになりますので、COM番号を合わせて、書き込む必要があります。
便利に出来ていて、35行目のprintArray(Serial.list());で、現在

使われているCOMポート番号とLIST番号の照合を下部のモニター窓にPRINTしてくれます。ここでは、COM15は[0]ということなので、37行目の[0]となっていればCOM15接続してくれます。複数COM番号ある場合は、自分が接続したいCOM番号の指定するLIST番号を[x]指定すればOKです。
myPort = new Serial(this, Serial.list()[0], 460800);

→でRUNさせれば、下記のような窓がでて連続してサンプリングが始まります。止めたければ、

‘q’ボタンをおすとCSVファイルを書き込んで、プログラムは終了します。あとは、このプログラムのあるフォルダーにCSVファイルがタイムスタンプ付きで保存されます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です