Boost Asio串行端口如何找出读取C++的队列中缓冲区的大小



在Arduino中,数据可以如下读取:

void setup() {
Serial.begin(9600);
}
String Comand = "";
void loop() {
if (Serial.available() > 0) //If there is data read 
{
char c = Serial.read(); //get byte
if(c!='n')
{
Comand+=c;
}
else
{
if(Comand == "MyComand")
{
Serial.println("Comand 1");
}
//else
//...
Comand = "";
}
}
}

С++升压这里有一个c++从端口播放数据的例子,但是用什么函数来检查是否有要读取的内容?

#include <boost/asio.hpp>
#include <windows.h>
//....
int main(int, char**)
{
{
boost::asio::io_service io;
boost::asio::serial_port serial(io,"COM5");
serial.set_option(boost::asio::serial_port_base::baud_rate(9600));
std::string s = "MyComandn";
boost::asio::write(serial,boost::asio::buffer(s.c_str(),s.size()));
std::string result;
//while serial data > 0 ???  How to check
{
using namespace boost;
char c;
asio::read(serial,asio::buffer(&c,1));
result+=c;
}
std::cout<<result.c_str();
}
return 0;
}

如果我在一个周期内读取,但没有数据,程序将停止并等待数据,这不适合我。如何在尝试读取之前检查是否有数据

异步IO的理念是不检查数据是否可用。相反,您可以推迟完成读取,直到出现这种情况。

现在,您使用Asio仍然可以进行同步IO。您的要求是:

如果我在一个循环中读取,并且没有数据,程序将停止并等待数据,这不适合我。

同步IO意味着阻塞读取。你可以让它返回任何可用的东西:

while (auto n = serial.read_some(asio::buffer(buf))) {
result.append(buf.data(), n);
std::cout << "Received " << n
<< " bytes, total length: " << result.length() << "n";
}

read_some仍在阻塞:

此函数用于从串行端口读取数据。函数调用将阻塞,直到成功读取一个或多个字节的数据,或者直到出现错误。

因此,串行端口的唯一真正替代方案是使用异步接口:

std::string result;
std::array<char, 32> buf;
std::function<void(error_code, size_t)> read_loop;
read_loop = [&](error_code ec, size_t n) {
if (ec.failed())
return;
std::cout << "Received " << n
<< " bytes, total length: " << result.length() << "n";
result.append(buf.data(), n);
serial.async_read_some(asio::buffer(buf), read_loop);
};
read_loop(error_code{}, 0);

现在你有了一个新的";"问题":如何将应用程序逻辑集成到其中。您打印请求的事实向我表明,您没有接收到无限的二进制数据流。相反,可以考虑简化应用程序逻辑,以便读取您需要的内容,也许需要超时。参见例如asio_read_some countinue读取以获取所有数据

最新更新