e-tipsmemo.hatenablog.com
電力測定のためのアプリを作るために
Rustでserialportを操作する方法を調べた。
非同期だったりとかいろいろあってよくわからなかったが結果的に動いた
serialport-rsを利用することにした。
https://crates.io/crates/serialport
wattchecker-rexが配布しているCのコードで送っているコマンドを表示させた。
RTC設定→リアルタイム測定2秒ごと繰り返しという処理内容
コマンドをどうやって組み立てているかは見ればわかる
ひとまず
timer : [n]というコマンドを送って
buf[n]という応答が帰ってくればよさそう
fn main() { println!("Hello, world!"); let settings = serialport::SerialPortSettings{ baud_rate : 115200, data_bits : DataBits::Eight, flow_control : FlowControl::None, parity : Parity::None, stop_bits : StopBits::One, timeout : Duration::from_millis(1) }; let mut port = match serialport::open_with_settings("/dev/rfcomm0", &settings) { Ok(p) => p, Err(_) => panic!("Error"), }; println!("{:?}", port.settings()); let cmd = vec![ここにコマンドを入れておく]; for b in cmd.clone() { println!("timer : 0x{:02X}", b); } match port.write(&cmd) { Ok(_) => println!("OK"), Err(e) => eprintln!("{:?}", e), } let mut buffer : [u8; 1] = unsafe{mem::uninitialized()}; loop{ match port.read(&mut buffer) { Ok(bytes) => if bytes == 1 { println!("0x{:02X}", buffer[0]); }, Err(ref e) if e.kind() == io::ErrorKind::TimedOut => (), Err(e) => eprintln!("{:?}", e), } } }
serialportのサンプルコードをそのまま利用
Err(ref e)でタイムアウトのエラーを無視している。
これで特定の長さを受信したら外のloopをbreakすればよさそう。
うまくいった。(この時はすでにRTCコマンドも計算してしまった)
コマンドの計算にはCRC8なども出てくるのでそれはCRC8-crateなどを利用した。
次回は別スレッドでコマンドを送信しながら
方やデータ受信してそれをどうにかするというものを書く予定。(サンプルdeplexを利用すれば簡単そう)
ラトックシステム Bluetoothワットチェッカー REX-BTWATTCH1
- 出版社/メーカー: ラトックシステム
- 発売日: 2014/07/17
- メディア: Personal Computers
- この商品を含むブログを見る
- 作者: Jim Blandy,Jason Orendorff,中田秀基
- 出版社/メーカー: オライリージャパン
- 発売日: 2018/08/10
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
- 出版社/メーカー: Raspberry Pi
- 発売日: 2016/05/31
- メディア: Personal Computers
- この商品を含むブログを見る
Raspberry Pi 3 Model B+ スターターセット BASIC
- 出版社/メーカー: RASPBERRY-PI
- メディア: エレクトロニクス
- この商品を含むブログを見る