1

我有一台 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)和此处(使用 Arduino Duemilanove 和 Cutedigi RS-的 RS-232 通信)的工作代码的修改版本232 接口)是我得到的最接近的。

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

评论

我已经在 [electronics.stackexchange.com] 上发布了这个问题,但是那里的一些好人建议我也在这里发布这个问题。由于声誉低下,我无法迁移问题。

4

2 回答 2

1

不确定这#include <regex>是否适用于 Arduino IDE,但这里有一个片段会有所帮助。

此外,作为免责声明,我建议使用 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 回答