我获得了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/]上发布了这个,但是那里的一些好人建议我也在这里发布这个问题。由于声誉不佳,我无法移植这个问题。
答案 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);