c++ - Boost SerialPort 的意外结果

标签 c++ boost qt5

这是我第一次使用 boost,我确信我缺少一些简单的东西。我正在尝试通过串行端口发送 3 个字节的数据。有问题的三个字节是:

天=2; 月=1; 年=13;

使用下面的代码,只发送第一个字节。

io_service Link;
serial_port serial(Link);
serial.open("/dev/ttyUSB0");
if(serial.is_open())
{
    qDebug() <<"open";
    serial.set_option(serial_port_base::baud_rate(9600));
    //send data
    boost::array<int,3> array ={{day,month,year}};
    qDebug()<<serial.write_some(boost::asio::buffer(array,3));
    serial.close();
}

我要发送给的设备向我报告(十六进制)它收到的值。它获得值 0x02,0x00,0x00。现在调整代码,以便我可以将所有三个字节发送到我的设备:

io_service Link;
serial_port serial(Link);
serial.open("/dev/ttyUSB0");
if(serial.is_open())
{
    qDebug() <<"open";
    serial.set_option(serial_port_base::baud_rate(9600));
    //send data
    boost::array<int,1> array ={{day}};
    qDebug()<<serial.write_some(boost::asio::buffer(array,1));
    array={{month}};
    qDebug()<<serial.write_some(boost::asio::buffer(array,1));
    array={{year}};
    qDebug()<<serial.write_some(boost::asio::buffer(array,1));
    serial.close();
}

设备读取:0x02,0x01,0x0D。这感觉很不对,我想正确地使用这些库。我怀疑我没有正确使用boost的缓冲区和数组类,但我真的不知道。有什么想法吗?

最佳答案

您从未创建过包含您要发送的三个字节 的数据结构。您只创建了一个数据结构,其中包含您要发送的三个。您从来没有将这些值从您的计算机存储它们的格式转换为它们应该发送的有线格式。因此,如果您的代码确实有效,那完全是偶然的。

当然,您的计算机不会将整数存储为单个字节。如果是,你怎么能代表 300?所以它不会起作用。

boost::array<int,3> array ={{day,month,year}};
qDebug()<<serial.write_some(boost::asio::buffer(array,3));

第一行创建一个数据结构,其中包含您要发送的三个。第二行按原样发送那些,而没有将它们转换为应该通过网络发送的确切字节流。

如果您希望在串行端口上发送特定的字节流,则您的代码必须在某处组成确切的字节流并将其发送。

关于c++ - Boost SerialPort 的意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18937237/

相关文章:

multithreading - 为什么在 QThread(事件循环)之外调用 QTimer::start() 不会失败?

c++ - 如何在小部件上单击 "What' s“此”按钮时得到通知?

c++ - MFC中的OwnerDrawn控件

c++ - 为什么我可以在本地使用 CMake 提供的模块(特别是 CMakeDependentOption.cmake),但不能在 CI 或 Docker 上使用?

c++ - 使用 VS2012 安装 boost 1.52

c++ - 如何在 C++/Boost 中的特定时间唤醒

c++ - 如何指定要在用 C++ 编写的应用程序中使用的特定 NIC (boost asio)

c++ - 通过命令行为 Visual Studio 配置 QtPackage

c++ - 限制 Tesseract 的预处理

c++ - 将未知文件格式打印到屏幕