RFIDカードのparallax rfid card readerをprocessingで動かしてみたついでに、Serialライブラリのみ使ってちょっとシリアルの勉強もしてみた。
parallax rfid card readerとは
いわゆるsuicaとかpasmoとかの仲間
仲間であって同義ではないけど・・・
suicaとかはRFIDの一部のNFCという部類
http://okwave.jp/qa/q7255792.html
parallax rfid card readerとシリアル通信
仕様詳細など
http://www.trossenrobotics.com/store/p/5378-Parallax-RFID-Card-Reader-Serial.aspx
今回注目する仕様は
・bps
(http://www.ocn.ne.jp/support/words/abc/bps.html)
・メッセージの長さ
の2つだけ
今回の仕様は上の仕様URLから
・2400bps
・8 data bits
だそうです。
さっそく繋げてprocessingサンプルコード書いて実行
import processing.serial.*;
Serial myPort;
int lf = 10;
int cr = 13;
String str;
void setup() {
printArray(Serial.list());
myPort = new Serial(this, Serial.list()[0], 2400);//bps 2400
//myPort.bufferUntil(lf);
//myPort.bufferUntil(cr);
myPort.buffer(12);//data bits 8
}
void draw() {
}
void serialEvent(Serial p) {
str = trim(p.readString());
println(str);
}
シリアルのbuffer関数を使うとデータ取得に便利でした。
なので先に仕様を見て区切るバイト数を見ておくのがいいんですね!
あれ?けどここで疑問が・・・
myPort.buffer(12);//data bits 8
の部分で、8とか言いながら12を入れてます・・・。
これにはわけがあります。
シリアル通信学んだこと
学んだこととか言いながらここから予想になりますが・・・
参考URL
http://www5e.biglobe.ne.jp/~komichan/network/n1_douki.html
ここがすごくわかりやすかったですが、たぶんここでのフラグ同期方式が使われているかなぁと思っています。
んで、やってみたらわかりますが12ビットで区切ると、最初に10進数での「10」文字コードでは「lf」が、最後に10進数の「13」文字コードでは「cr」が来てました。
つまり改行ですね。
フラグパターンってやつが今回はそういうことになっているらしいです。
(buffer()使わなかったりしたときに受け取った数が2桁だったり3桁だったりに見えたことがある人はたぶんそういうことです。)
なぜそういうことになっているかわからないですが、processngのシリアルライブラリが親切にやってくれているのか、フラグパターンってのは結構自由だったりするのか・・・。
ってことで長くなりましたが、なぜ8とか言いながら12を入れているかというと、最初と最後の2bitづつフラグパターンがあるからなんですね。