Serial port c++;boost asio串行通信“;无法访问私有成员“;在basic_serial_port.hpp中 我写了一个C++程序,与多个设备通信,一个ARDUIO PRO迷你W/ATMEGA328和一个带有GPS屏蔽的ARDUINO UNO同时通过COM端口,并且我使用Boosi::ASIO包。我不是C++大师,所以我偶尔会困惑不解,试图弄清楚什么时候什么时候通过引用或价值;我认为这就是其中之一

Serial port c++;boost asio串行通信“;无法访问私有成员“;在basic_serial_port.hpp中 我写了一个C++程序,与多个设备通信,一个ARDUIO PRO迷你W/ATMEGA328和一个带有GPS屏蔽的ARDUINO UNO同时通过COM端口,并且我使用Boosi::ASIO包。我不是C++大师,所以我偶尔会困惑不解,试图弄清楚什么时候什么时候通过引用或价值;我认为这就是其中之一,serial-port,arduino,boost-asio,private-members,Serial Port,Arduino,Boost Asio,Private Members,下面是设置串行通信端口的代码 std::string IMU_COM_PORT = "COM5"; // or whatever... it varies int IMU_BAUD_RATE = 57600; std::string ARDUINO_COM_PORT = "COM3"; // also varies int ARDUINO_BAUD_RATE = 115200; int main() { std::vector<boost::thread *> sensor

下面是设置串行通信端口的代码

std::string IMU_COM_PORT = "COM5"; // or whatever... it varies
int IMU_BAUD_RATE = 57600;
std::string ARDUINO_COM_PORT = "COM3"; // also varies
int ARDUINO_BAUD_RATE = 115200;

int main() {
    std::vector<boost::thread *> sensorThreads;
    int sensorThreadCount = 0;

    using namespace::boost::asio;

    // get the COM port handle for the IMU sensor
    boost::asio::io_service IMU_io;
    boost::asio::serial_port IMU_port(IMU_io);
    IMU_port.open(IMU_COM_PORT);
    if (!IMU_port.is_open()) {
        cerr << "Failed to connect to IMU." << endl;
    }
    else {
        IMU_port.set_option(boost::asio::serial_port_base::baud_rate(IMU_BAUD_RATE));
        // the IMU has to be put into triggered output mode with a specific command: #o0
        // to put it back into continuous output mode we can use this command: #o1
        std::string IMU_init_cmd = "#o0";
        boost::asio::write(IMU_port, boost::asio::buffer(IMU_init_cmd.c_str(), IMU_init_cmd.size()));
        // now the IMU should be ready

        sensorThreads.push_back(new boost::thread(testIMUThread, IMU_port));
        sensorThreadCount++;
    }

    // get the COM port handle for the ARDUINO board with GPS sensor
    boost::asio::io_service ARDUINO_io;
    boost::asio::serial_port ARDUINO_port(ARDUINO_io);
    ARDUINO_port.open(ARDUINO_COM_PORT);
    if (!ARDUINO_port.is_open()) {
        cerr << "Failed to connect to ARDUINO." << endl;
    }
    else {
        ARDUINO_port.set_option(boost::asio::serial_port_base::baud_rate(ARDUINO_BAUD_RATE));
        // now the ARDUINO w/GPS sensor should be ready

        sensorThreads.push_back(new boost::thread(testGPSThread, ARDUINO_port));
        sensorThreadCount++;
    }

    for (int i = 0; i < sensorThreadCount; i++) {
        sensorThreads[i]->join();
        delete sensorThreads[i];
    }
}
上述代码不编译,而是生成以下内容(在MSVC2010中):
Error 11 Error C2248:“boost::asio::basic\u io\u object::basic\u io\u object”:无法访问在类“boost::asio::basic\u io\u object”中声明的私有成员C:\boost\u 1\u 51\u 0\boost\asio\basic\u serial\u port.hpp

这个错误消息对我没有帮助,至少对我来说,因为我还没有找到根本原因。我错过了什么

谢谢你的帮助


编辑:解决方案(感谢Sam Miller)

使用按引用传递(即
boost::ref()

main()
been中

sensorThreads.push_back(new boost::thread(testIMUThread, boost::ref(IMU_port)));
sensorThreads.push_back(new boost::thread(testIMUThread, boost::ref(ARDUINO_port)));
然后对workhorse和thread函数进行修改

std::string readCOMLine(boost::asio::serial_port &port, std::string requestDataCmd) {
    char c;
    std::string s;
    boost::asio::write(port, boost::asio::buffer(requestDataCmd.c_str(), requestDataCmd.size()));
    while(true) {
        boost::asio::read(port, boost::asio::buffer(&c,1));
        switch(c) {
            case '\r': break;
            case '\n': return s;
            default: s += c;
        }
    }
}
void testIMUThread(boost::asio::serial_port &port) {
    while(true) { cout << readCOMLine(port, "#f") << endl; }
}
void testGPSThread(boost::asio::serial_port &port) {
    while(true) { cout << readCOMLine(port, "r") << endl; }
}
线程的功能是这样的

sensorThreads.push_back(new boost::thread(testIMUThread, &IMU_port));
sensorThreads.push_back(new boost::thread(testIMUThread, &ARDUINO_port));
void testIMUThread(boost::asio::serial_port *port) {
    while(true) { cout << readCOMLine(port, "#f") << endl; }
}
void testGPSThread(boost::asio::serial_port *port) {
    while(true) { cout << readCOMLine(port, "r") << endl; }
}
这两种解决方案都符合我的目的


谢谢

boost::asio::serial\u port
对象是不可复制的

你应该传一封推荐信

sensorThreads.push_back(new boost::thread(testIMUThread, boost::ref(IMU_port)));
还是指针

sensorThreads.push_back(new boost::thread(testIMUThread, &IMU_port));

下面是一个演示这两种方法的示例。

boost::asio::serial\u port
对象是不可复制的

你应该传一封推荐信

sensorThreads.push_back(new boost::thread(testIMUThread, boost::ref(IMU_port)));
还是指针

sensorThreads.push_back(new boost::thread(testIMUThread, &IMU_port));

这里有一个演示这两种方法的示例。

嘿,山姆,谢谢你的回复。我最初解决这个问题的尝试之一是传递指针
&IMU\u port
,但这需要我更改使用指针的代码(即
asio::write(port,buffer)
变成
port->write_some(buffer)
)。我猜我在那里也做错了什么,因为我也不能让它工作。不过,通过你的例子,我发现了这两种方法。非常感谢。嘿,山姆,谢谢你的回复。我最初解决这个问题的尝试之一是传递指针
&IMU\u port
,但这需要我更改使用指针的代码(即
asio::write(port,buffer)
变成
port->write_some(buffer)
)。我猜我在那里也做错了什么,因为我也不能让它工作。不过,通过你的例子,我发现了这两种方法。非常感谢。
sensorThreads.push_back(new boost::thread(testIMUThread, boost::ref(IMU_port)));
sensorThreads.push_back(new boost::thread(testIMUThread, &IMU_port));