如何从通过rs232连接的CO2记录仪读取和显示数据?

时间:2012-07-19 18:33:45

标签: xml serial-port arduino

我获得了Licor CO2-Logger(Li-820)用于科学实验。 Li-820输出模拟信号(电压),并通过RS232端口提供串行通信。我想用arduino uno嗅探串行通信并在LCD显示器上显示CO2值,这样我就可以控制记录在计算机系统中的模拟信号。我想显示模拟信号和数字信号。

我使用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>

我想用arduino uno解析相关部分的信息,即“5.2527637e2”(“CO2”值)并首先将其输出到串行监视器。接下来,我将在LCD显示屏上显示该值。最后一步应该是一个小问题。

那么,我如何解析相关位的信息,然后将其显示在串行监视器上。

我在网上查看了很多例子。这里的工作代码的修改版本(http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1287446626)和此处(http://stackoverflow.com/questions/8370918/rs -232-communication-using-an-arduino-duemilanove-and-the-cutedigi-rs-232-interf)是我得到的最接近的。

我知道arduino平台的一些xml库。但是,我首先无法访问xml行。

非常感谢任何直接帮助或与其他信息来源的链接。如果这是错误的论坛或者您需要有关我的电子/软件问题的更多信息,请告诉我。

备注:我已经在[electronics.stackexchange.com/]上发布了这个,但是那里的一些好人建议我也在这里发布这个问题。由于声誉不佳,我无法移植这个问题。

2 个答案:

答案 0 :(得分:1)

不确定#include <regex>是否适用于Arduino IDE,但这是一个有用的代码片段。

此外,作为免责声明,我建议使用XML解析器,但我知道IDE是否可以使用它,并且它看起来像是arduino的很多cpu开销。

Here's对下面的代码很好。

#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;
}

答案 1 :(得分:1)

虽然你可以使用重(慢)正则表达式或xml解析器,但我会选择一个简单的解决方案。如果数据线是一致的,那么我们只需要第7个“&gt;”之间的数据和第8个“&lt;”。

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);