1

科学実験用に Licor CO2-Logger (Li-820) を手に入れました。Li-820 はアナログ信号 (電圧) を出力し、RS232 ポート経由でシリアル通信も提供します。arduino uno とのシリアル通信を盗聴し、CO2 値を LCD ディスプレイに表示して、コンピューター システムに記録されたアナログ信号を制御できるようにしたいと考えています。アナログ信号とデジタル信号の両方を表示したい。

rs232 レベル シフターを使用して Licor CO2 アナライザーを arduino uno に接続すると、arduino シリアル モニターとスニファー プログラムの両方で COM ポートを正常にスニッフィングできます。rs232 ポートを介して、Li-820 デバイスは次のような xml のような行を出力します。

<li820><data><celltemp>5.1252350e1</celltemp><cellpres>9.7159633e1</cellpres><co2>5.2527637e2</co2><co2abs>7.7893261e-2</co2abs><ivolt>1.1386718e1</ivolt><raw>3950702,3808028</raw></data></li820>

「5.2527637e2」(「CO2」値)であるarduino unoで関連部分のその情報を解析し、最初にシリアルモニターに出力したいと思います。次に、その値を LCD ディスプレイに表示します。この最後のステップは小さな問題です。

では、関連するビットの情報を解析し、それをシリアル モニターに表示するにはどうすればよいでしょうか。

私はネット上で多くの例を調べました。ここ ( http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1287446626 ) とここ ( Arduino Duemilanove と Cutedigi RS を使用した RS-232 通信)の作業コードの修正版232 インターフェイス) が私が得た最も近いものでした。

arduino プラットフォーム用のいくつかの xml ライブラリを認識しています。しかし、そもそもxml行にアクセスできません。

述べる

私はすでに [electronics.stackexchange.com] にこれを投稿しましたが、そこの何人かの善良な人々が、この質問をここにも投稿することを勧めてくれました。評判が低いため、質問を移行できませんでした。

4

2 に答える 2

1

がArduinoIDEで動作するかどうかはわかりません#include <regex>が、役立つスニペットを次に示します。

また、免責事項として、XMLパーサーを提案しますが、IDEがそれを利用できるようにするかどうかはわかっており、arduinoのCPUオーバーヘッドが大きいようです。

以下のコードについての良い説明があります。

#include <regex>

using namespace std::tr1;

string seq = "<li820><data><celltemp>5.1252350e1</celltemp><cellpres>9.7159633e1</cellpres><co2>5.2527637e2</co2><co2abs>7.7893261e-2</co2abs><ivolt>1.1386718e1</ivolt><raw>3950702,3808028</raw></data></li820>";
regex rgx("(<co2>).*(<co2>)");
smatch result;
regex_search(seq, result, rgx);
for(size_t i=0; i<result.size(); ++i)
{
    //tinker with this to find the correct result index.
    cout << result[i] << endl;
}
于 2012-07-19T18:49:58.180 に答える
1

重い (遅い) 正規表現または xml パーサーを使用することもできますが、私は単純なソリューションを使用します。データ行が一貫している場合、必要なのは 7 番目の ">" と 8 番目の "<" の間のデータだけです。

int i = 0;
int start = -1;
int end = 0;

string data = "<li820><data><celltemp>5.1252350e1</celltemp><cellpres>9.7159633e1</cellpres><co2>5.2527637e2</co2><co2abs>7.7893261e-2</co2abs><ivolt>..."

string result = "";

for(i=0;i<7;i++)
{
     start = data.indexOf('>', start + 1 )
}
end = data.indexOf('<', start++);

result = data.substring(start, end - start);

Serial.print("co value = );
Serial.println(result);
于 2012-07-19T22:32:46.763 に答える