2015-08-26 20:07 | カテゴリ:PIC応用回路
今日は、ちょっとマニアックな内容です。
RS232のシリアル通信の問題が解決しましたので、そのデータを使用して、グラフィカルなオブジェクトを操作するステップに進みます。

さて、通信で取り込んだASCIIのデータはバイト単位ですが、このLCDディスプレイのソフトは2バイト/ワードですので、データのパッキングが必要です。
何か良い方法はないかと、マニュアルを見ていると、良さそうな関数がありました。
それは「TO( )」関数です。
これは、文字を出力する対象を、LCDパネルや、RS232通信などの出力装置だけでなく、「文字配列変数」にも出力できると言うものです。
しかも、文字変数に出す際は、2バイトを1ワードにパックしてくれるので、一石二鳥です。

これを使って、PUTCH( )関数でASCIIコードを一つずつ送り出すと、温度などの数字文字列を作成できます。
あとは、この数字の文字列を、算術数字変数に変換すればよいことになります。

一旦、文字数字変数ができれば、あとは算術数字の変数に変換すればよいのですが、これは、専用の関数が無いようで、サンプルの変換プログラムがありました。
これを使用することにします。

これらを間違えない様にプログラミングすれば、
RS232でデータをASCIIで受信し、それを数字の文字列にまとめて、更にそれを数値変数に変換し、その変数で、グラフィカルオブジェクトのメーターなどを動作できるわけです。

受信したASCII文字を文字列にパックするには、具体的には、TO( )関数を使用して、この様なプログラムで出来そうです。

// Receive 1st data (2 bytes)

rs232(); //シリアルポートからデータを1バイト読み込む
to(in_data); //putch関数の出力先をin_data[]配列にリダイレクトする
putch(char); //データ(char)を書き込む

rs232(); //2バイト目の処理

to(APPEND);
putch(char);
str_int_conv(); //得られた文字配列を数字変数に変換し
temp1 := num_data; //その数値をグラフィカルオブジェクトの変数としてtemp1に代入する


と言う感じです。


また、文字配列を数字に変換する部分は、

i := 0 ;
num_data := 0 ; // init number
repeat
ch := in_data[i / 2] ;      // extract word
if (i & 1)    // keep high or low byte, as appropriate
ch >>= 8 ;
else
ch &= 0xff ;
endif
if (ch == 0) break ;    // exit on null
num_data *= 10 ; // mult what we have so far by 10
num_data += ch & 0x0f ; // add in current character, after converting to number
i++ ;    // move to next char
forever


です。

で、とりあえず動作するプログラムが出来ました。細かい調整は必要ですが。

DSC01223.jpg

左から、外気温度、室内温度、右側の上が気圧で、下が湿度です。

良く見ると気圧のスケールとメモリがあっていませんでした。

修正しました。

DSC01227.jpg


ついでに、色を買えて、デジタル表示も追加してみました。


管理者のみに表示する