ひでっぷの技術メモ

はてなダイアリーから移行しました

Armadillo-9のシリアルポートをJavaで制御

やっとArmadillo-9のシリアルポートをJavaで制御できるようになりました。

最初はSunもしくはRXTXのcommunication APIを使用しようと思っていました。
当然のことながら(?)どちらもARM用はなかったのですがRXTXにソースコードがあり、gccでコンパイルすればいけるかなと思って試してみました。
コンパイルできるようになるまでも結構苦労したんですが、そこそこ動くようになっても結局コンパイルでエラー。
しかもエラーが出るのがgccの標準ヘッダであろうの宣言内なので訳がわからず。
途方にくれて一時さわるのをやめていました。

そんなときに会社の先輩がcommunication APIをさわらなくてもJavaでシリアルポートを制御できる方法を調べてくれました。

やることはとっても簡単。


File file = new File("/dev/ttyS0");
OutputStream out = new FileOutputStream(file);
InputStream in = new FileInputStream(file);

デバイスをそのままFileでopenして送信用のOutputStreamと受信用のInputStreamを生成するだけ
送受信の方法はSocket通信と同じ要領で


/**
* 送信処理
**/
public void send(String senddata){
out.write(senddata.getBytes());
out.flush();
}

/**
* 受信処理
**/
public void receive(){
byte b = (byte)in.read();
byte buffer = new byte[1];
buffer[0] = b;
String receivedata = new String(buffer);
}


こんな感じ。
受信は上の例だと1バイトずつ取得だけど、例えば

/**
* 受信処理
**/
public void receive(){
if(in.available() > 0){
byte buffer = new byte[300];
int dataBytes = in.read(buffer);
String receivedata = new String(buffer,0,dataBytes);
}
}

こんな風にすればあるぶんだけがさっととることができますね。

さて、communicationAPIを使用すればボーレート、パリティビット、ストップビット、データ長の設定ができますが今回のやり方だとこれらの設定ができません。
そこでLinuxのsttyコマンドで設定をします。

stty -F デバイス名 オプション

オプションは様々ありますが例えばこんな感じ。

例1)ボーレート9600 データ長8ビット パリティビットなし ストップビット1
stty -F /dev/ttyS0 raw -echo 9600 cs8 -parenb -cstopb
例2)ボーレート1200 データ長7ビット パリティビット偶数 ストップビット2
stty -F /dev/ttyS0 raw -echo 1200 cs7 parenb -parenodd cstopb

raw:ローモードでの起動。
echo:エコーを返す。オプションの前に-をつけると取り消しの意味なので-echoはエコーを返さないという設定。
parenb:パリティビットを使用する。
parenodd:奇数パリティとする。-parenoddの場合は偶数パリティ
cstopb:ストップビット2。-cstopbはストップビット1

これ以外にもいろいろな設定があります。
今回はRuntime.getRuntime().excec()メソッドでJavaアプリ内から設定するようにしました。
これでだいぶ道が開けてきました!