我有以下方法(位于一个类中)取自:https://gitorious.org/serial-port/serial-port/source/03e161e0b788d593773b33006e01333946aa7e13:1_simple/SimpleSerial.h#L46
boost::asio::serial_port serial;
// [...]
std::string readLine() {
char c;
std::string result;
while(true) {
asio::read(serial,asio::buffer(&c,1));
switch(c)
{
case '\r':
result+=c;
break;
case '\n':
result+=c;
return result;
default:
result+=c;
}
}
return result;
}
正如它所写的那样,“代码是为了简化而非速度而优化的”。所以我在考虑优化这段代码。但是我没有得到任何有用的结果。我的一般方法是:
void readUntil(const std::string& delim) {
using namespace boost;
asio::streambuf bf;
size_t recBytes = asio::read_until(serial, bf, boost::regex(delim));
[...]
'delim'将是“\ n”。但我不知道如何将asio :: streambuf转换为std :: string。此外,我不知道这种方法是否会丢失角色。例如。如果我一次收到以下大部分文本:
xxxxx\r\nyyyyyyy
我是否只读'xxxxx \ r \ n'而剩下的就丢失了?
答案 0 :(得分:0)
asio::streambuf
the data中的directly,如下所示:const unsigned char *data = asio::buffer_cast<const unsigned char*> (yourBuff.data());
read_until
may read it会进入缓冲区。(请注意,以上所有内容都记录在Asio参考,教程和示例中。)