Freebsd上で温湿度データロガーからデータを取り込む(Freebsd8.2) シリアルポートを使うとエラーがでる Last update:2012/9/30 Build:2011/11/09
引っ越しに伴いサーバーを新しくした。ついでにOSもFreeBSD 6.1から8.2にバージョンアップした。
温湿度データーロガーは従来のものであり、ソフトもそのまま使うつもりであった。しかし、壁にぶつかった。エラーがでる。
FreeBSD6.1の時は/dev/cuad0であったが、見つからない。またドライバーもsioがみつからない。 FreeBSD8からドライバーが変わったようだ。ググっているとFreeBSD7の頃にもこの変更があったようだ。
今回のサーバー仕立てのノートパソコンは新しいので、この時点ではシリアルポートをUSB経由で使っているものと思っていた。 RS232CのUSBシリアル変換ケーブルを使うと/dev/cuaU0というディバイス名になったから。 ハード、ソフトの仕様は以下の通りです
ページ上部に移動します ディバイスをcuau0に変更した。kermitを使ってアクセスしてみる。 $ kermit ・・・ kermit C-Kermit 8.0.211, 10 Apr 2004, for FreeBSD 8.2 Copyright (C) 1985, 2004, Trustees of Columbia University in the City of New York. Type ? or HELP for help. (/usr/home/USER/) C-Kermit>connect ・・・ 接続 Connecting to /dev/cuau0, speed 9600 Escape character: Ctrl-\ (ASCII 28, FS): enabled Type the escape character followed by C to get back, or followed by ? to see other options. ---------------------------------------------------- 615 0,2,3を入れると値が返ってくる (Back at Flora-T5500.ddo.jp) オーバーライトされて、入力値は消えている。 ---------------------------------------------------- 終了は ctrl+\+c (/usr/home/USER/) C-Kermit>ex kermitの終了はex(it) Closing /dev/cuau0...OK $ うまくいく。これで、以前のプログラムのディバイス名を修正すればうまくいくはず!!! ページ上部に移動します perlを使ったプログラムを走らせると値がおかしい、0がでたりする。 $ pwd /home/datalgr $ ./datalgr-htm-rs232c-101210-cron.pl $ l total 8 -rwxr-xr-x 1 datalgr nic 725 Nov 5 16:35 crontab-datalgr-101210 -rwxr-xr-x 1 datalgr nic 3378 Nov 5 16:33 datalgr-htm-rs232c-101210-cron.pl -rw-r--r-- 1 datalgr nic 32 Nov 5 16:36 log-data.txt $ cat log-data.txt 2011/11/5 16:36:53 116.2 0 0 ← 何故か0がでる。 以下何度やっても同じ。 $ cat log-data.txt 2011/11/5 16:36:53 116.2 0 0 2011/11/5 16:44:9 116.9 0 0 $ ./datalgr-htm-rs232c-101210-cron.pl $ cat log-data.txt 2011/11/5 16:36:53 116.2 0 0 2011/11/5 16:44:9 116.9 0 0 2011/11/5 16:47:51 58.6 0 58.5 $ ./datalgr-htm-rs232c-101210-cron.pl $ cat log-data.txt 2011/11/5 16:36:53 116.2 0 0 2011/11/5 16:44:9 116.9 0 0 2011/11/5 16:47:51 58.6 0 58.5 2011/11/5 16:48:31 0 0 51.8 kermitをつかった場合はうまくいくのにperlを使ってデーターを読み取ろうとするとうまくいかない。 perlのバージョンも変わったので何かまずい点があるのだろうか、どこに問題があるのかわからない。 PICのプログラムが4ヶ月ほど使わなかったことでおかしくなったのか? ページ上部に移動します FreeBSD7.1を入れたパソコンがあったのでこのシリアルポートにデーターロガ−をつないでみた。 これにはドライバーsioもディバイス/dev/cuad0もあり、前の通りきちんとデータを集めることができた。 cgiからもエラーはない。データーロガーは正常に作動していることが確認された。 $ ./test-111106-2.pl data2= 608 data2= 610 data2= 599 data2= 612 data2= 622 data2= 598 data2= 606 data2= 607 data2= 608 data2= 601 data2= 600 data2= 605 data2= 617 data2= 602ここで迷路に突入してしまった。 ページ上部に移動します 簡単なテストプログラムまで作った。 ここ しかし、結果は同じで最初のデータは受信できるが、2つめ以降はエラーがでる。 調べたがわからない。USB経由でタイミングがあわないのか? テストプログラムでもエラーが出る例。 $ ./test-111105.pl data2= 605 data2=E data2=E data2= 605 data2=E data2=E data2= 605 data2=E data2=E data2= 604 data2=E data2=E data2= 606 data2=E data2=E data2= 606 data2=E data2=E data2= 607 data2=E data2=E data2= 605 data2=E data2=E data2= 602 data2=E data2= 605 data2=E data2=E data2= 604 picのプログラムを書き換えてどんなエラーが出ているのかエコーバックするようにした。 制御文字だろうか。表示されない。print文のデータがおかしくなっている。 何か変なデーターを送信しているようだ。 PICのプログラムを変更してエコーバックするようにしたあとのエラー例 $ ./test-111105.pl data2= 565 data2= data2=^ data2= }・ta2= data2= }・ta2= }・ta2= data2= data2= data2= 564 data2= data2=@ data2=@ data2= }・ta2=@ data2= 564 data2= data2=^ data2= }・ta2= data2= }・ta2= }・ta2= data2= data2= data2= 565 data2= data2=^ data2= }C $ stty speed 9600 baud; ページ上部に移動します googleでもyahooでも検索したが、同じような事例が見つからない。しかしこの過程で前述のシリアルポートの ドライバーやディバイス名がfreebsd8から変更になったことを知った。つまりUSB経由のシリアル変換ではなく、 ドライバーやディバイス名が変わっただけなのだとわかった。
紛らわしいが、USBシリアル変換を使っているのではないことがわかった。 ということは、私のプログラムが悪いわけではなく、ドライバーが変更になったことで何らかの不具合が出ているようだ。 ここまで理解するのに3日くらいかかった。 さらに検索していると 2チャンネルにもエラーの例(pdf)があった。 kernelを再構築などと出ている。 また、 freebsd−users−jp93470 (pdfはこちら)に FreeBSD8になって、シリアル経由で計測器をつないでいるとエラーが出ているとの情報。 ドライバーがuartになって、カノニカルモード(canonical mode)になっている、原因はわからないが当面の対処方法としては 非カノニカルモード(noncanonical mode)にすればよいとのこと。 参考:カノニカルモードと非カノニカルモード 確かにkermitを使った場合、非カノニカルモードである。キーを一文字を押すとすぐにデータが返ってくる。キャリッジリターンを 押す必要はない。だからkermitではうまくいっているのか。 これをヒントにperlのプログラムでopen文のあとにエコーバックをやめるように指定する行を追加した。 system( ”stty −f /dev/cuau0 −echo”); この一文をいれ、エコーバックを停止した。 #open (COM2, "+</dev/cuad0") or die "ERROR /dev/cuad0 not open\n" ; # シリアルポートを入出力可能でオープン open (COM2, "+</dev/cuau0") or die "ERROR /dev/cuau0 not open\n" ; # cuad0 → cuau0 に変更 system("stty -f /dev/cuau0 -echo") ; ・・・ この一文を追加した これでうまくいった。テストプログラムを走らせるときちんとデータを受信している。 $ ./test-111105.pl data2= 567 data2= 566 data2= 565 data2= 567 data2= 564 data2= 567 data2= 566 data2= 566 data2= 568 data2= 567 data2= 566 data2= 566 data2= 565 data2= 565 data2= 571 data2= 565 data2= 565 data2= 565 data2= 564 data2= 564 data2= 569 data2= 565 data2= 565 data2= 565 data2= 565 data2= 565 data2= 567 data2= 565 data2= 564 data2= 566 $ ページ上部に移動します 今後のために作成したソフトを区別して表記する。 以下は前回のものとほとんど同じです。 ファイル名は日付を変えました。perlのプログラムには全て前述の一文が入っています。もちろんディバイス名は全て変更しました。 1)ウェブから温湿度データを読む /pic/keisoku-onsitsudo.html cgi呼び出し(呼び出すcgi名修正) /cgi-bin/datalgr-htm-rs232c-111109.cgi 温度と湿度を読み込むcgi(修正) webから読み込むcgiです 2)携帯電話から温湿度データを読む /i/index.html 携帯のトップページ(修正なし) /i/onsitsudo-i.html cgi呼び出し(呼び出すcgi名修正) /cgi-bin/datalgr-htm-rs232c-111109-i.cgi 温度と湿度を読み込むcgi(修正) 携帯から呼び出すcgiです 携帯から呼び出すcgiです(2012/9/30出力文字を少なくした) 3)cronで30分毎に温湿度データを自動取り込み(AD変換値のみ) 10回データを取り込み平均を取る /home/datalgr/datalgr-htm-rs232c-111109-cron.pl (修正) /home/datalgr/crontab-datalgr-111109 (呼び出すperl名を修正) cronで動かすPerlです cronをセットするcrontabです ページ上部に移動します |