TeraTermマクロで、シリアルポートで読み取った値を別のプログラムに橋渡ししたかったのだが…

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側です。ひたすらファイルを読み続けて、更新されたら次を読む、といった処理です。

今やろうとしていることは、そんなに転送されるデータ量が多くないので、この方法が使えそうですが…
もうちょっと良い方法があれば試したいですね。

Spread the love
  •  
  •  
  •  

コメント

  1. […] で…IDE上でコードの修正から実機での検証までを一気に通すことが出来ます!(前に書いた Teraterm マクロを応用して、転送からBluetoothを使用してログを受信、そしてJava製自作ログ解析 […]

タイトルとURLをコピーしました