TeraTermのマクロを使って、シリアルポートからデータを受信して、それを他のプログラム(RubyとかJavaで作ったモノ)に渡そうとしてみました。
…が、TeraTermのマクロって、よく出来てはいるのですが…
他プログラムとの連携機能はほぼ提供されておらず、
やりたいことが素直にはできないことがわかりました…。
シリアルポートを叩きたいだけであれば、TeraTermを噛ませる必要はないのですが、今回は ZModelプロトコル等を使いたい関係で、ちょっと頑張ってみることにしました。
結果的にうまくいった方法は、TeraTermマクロで、結果をファイルに出力し、Javaプログラムではその出力されたファイルを継続的に読むことでデータ転送を実現するという方法です。
fileopen csv "C:\Users\hoge\Desktop\receive.csv" 1 InputBox 'Port number' 'question' SprintF2 connStr '/C=%s /BAUD=9600' inputstr connect connStr setecho 0 while 1 WaitRegEx '(-?\d+\.\d+); (-?\d+\.\d+); (-?\d+\.\d+); (-?\d+\.\d+); (-?\d+\.\d+); (-?\d+\.\d+)' SprintF "%s,%s,%s,%s,%s,%s" groupmatchstr1 groupmatchstr2 groupmatchstr3 groupmatchstr4 groupmatchstr5 groupmatchstr6 filewriteln csv inputstr endwhile
これは、TeraTermのマクロ。シリアルポートを叩いて、受信したデータを正規表現でバラして、csvファイルに書きだすという処理です。
ちなみに、実験に使うデータですが、Androidの「Bluetooth SPP Test」というアプリを使い、COMポート経由(Bluetooth経由)で、ジャイロセンサーの値を送ってみました。
public class Main { public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\hoge\\Desktop\\receive.csv")); while(true) { String line; while( (line = br.readLine()) != null ){ System.out.println("Get line > " + line); } Thread.sleep(100); } } }
こちらが、色々処理をしたいJava側です。ひたすらファイルを読み続けて、更新されたら次を読む、といった処理です。
今やろうとしていることは、そんなに転送されるデータ量が多くないので、この方法が使えそうですが…
もうちょっと良い方法があれば試したいですね。
コメント
[…] で…IDE上でコードの修正から実機での検証までを一気に通すことが出来ます!(前に書いた Teraterm マクロを応用して、転送からBluetoothを使用してログを受信、そしてJava製自作ログ解析 […]