ようこそNICのホームページへ(なが〜い試運転中 from 2001/5/12)
HP パソコン 健康 落語 海外 思うまま 電子工作


Freebsd上で温湿度データロガーからデータを取り込む(Freebsd8.2)

シリアルポートを使うとエラーがでる

Last update:2012/9/30    Build:2011/11/09

上から見たデータロガーです
温湿度データーロガー製作
 引っ越しに伴いサーバーを新しくした。ついでにOSもFreeBSD 6.1から8.2にバージョンアップした。  温湿度データーロガーは従来のものであり、ソフトもそのまま使うつもりであった。しかし、壁にぶつかった。エラーがでる。

1.シリアルポート用のディバイスがない

FreeBSD6.1の時は/dev/cuad0であったが、見つからない。またドライバーもsioがみつからない。 FreeBSD8からドライバーが変わったようだ。ググっているとFreeBSD7の頃にもこの変更があったようだ。
ドライバ又はディバイス名 FreeBSD 6.1 FreeBSD 8.2
ドライバー sio uart
ディバイス名 /dev/cuad0 (dの小文字) /dev/cuau0 (uの小文字)

今回のサーバー仕立てのノートパソコンは新しいので、この時点ではシリアルポートをUSB経由で使っているものと思っていた。 RS232CのUSBシリアル変換ケーブルを使うと/dev/cuaU0というディバイス名になったから。
   ハード、ソフトの仕様は以下の通りです

ハード、ソフトの種別 前回 今回
パソコン本体 NEC VersaPro VA70J/WXA HITACHI flora 270W PC8MF1
CPU M Pentium3 700MHz Core2Duo T5500 1.6GHz
メモリー 256MB 1GB
ハードディスク 20GB 40GB
OS FreeBSD 6.1 FreeBSD 8.2
Perl perl-5.8.8 perl-5.10.1_3
 
 ページ上部に移動します

2.ディバイス名を変更しkermitで試験する

ディバイスを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
$  

うまくいく。これで、以前のプログラムのディバイス名を修正すればうまくいくはず!!! 
 ページ上部に移動します

3.perlを使ったスクリプトではエラーが出る

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ヶ月ほど使わなかったことでおかしくなったのか?
 ページ上部に移動します

4.FreeBSD7.1で確認する

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

ここで迷路に突入してしまった。
 ページ上部に移動します

5.FreeBSD8.2でテストプログラムを走らせる

簡単なテストプログラムまで作った。 ここ
しかし、結果は同じで最初のデータは受信できるが、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;

 ページ上部に移動します

6.さらに検索をする、ドライバーの変更に伴う不具合か

googleでもyahooでも検索したが、同じような事例が見つからない。しかしこの過程で前述のシリアルポートの ドライバーやディバイス名がfreebsd8から変更になったことを知った。つまりUSB経由のシリアル変換ではなく、 ドライバーやディバイス名が変わっただけなのだとわかった。
利用OS ディバイス名 備 考
FreeBSD 8 7 6 /dev/cuaU0 (Uが大文字) USBポート (シリアル変換ケーブル使用)
FreeBSD 8 /dev/cuau0 (uが小文字) シリアルポート
FreeBSD 7 6 /dev/cuad0 (dの小文字) シリアルポート

紛らわしいが、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
$ 

 

 ページ上部に移動します

7.ソフト関係の整理

今後のために作成したソフトを区別して表記する。
以下は前回のものとほとんど同じです。 ファイル名は日付を変えました。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です

 ページ上部に移動します

電子工作へ     HomePage