提升ASIO串行写入十六进制值

时间:2016-04-14 15:16:43

标签: c++ boost serial-port boost-asio

我正在使用ubuntu通过串口与设备通信。所有消息都需要是十六进制值。我已经在Windows环境中使用termite测试了通信设置,我得到了我期待的响应。使用Boost时我无法得到任何回复:asio虽然。

以下是我设置串口的方法:

boost::asio::serial_port serialPort;
    serialPort.open(portNumber);
    serialPort.set_option(boost::asio::serial_port_base::baud_rate(baudRate));
    serialPort.set_option(boost::asio::serial_port_base::character_size(8));
    serialPort.set_option(boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one));
    serialPort.set_option(boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none));
    serialPort.set_option(boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::none));

  uint8_t hexValue = message.at(i) >= 'A' ? (message.at(i) - 'A' + 10) : message.at(i) - '0';
  serialPort.write_some(boost::asio::buffer(&hexValue, sizeof(uint8_t)));

那么我需要在ASIO中设置一些东西以使其正确发送吗?

2 个答案:

答案 0 :(得分:2)

看起来您真的想要发送 二进制 数据,这些数据与您在{{1}中拥有的十六进制编码文本相对应}。

有很多方法可以给那只猫上皮。我个人开始解码整个消息。这将始终减少十六进制编码大小的消息。如果你愿意,你可以在这里进行。

an older answer简单来看:

message

现在您只需将返回的字符串发送到串口:

std::string hex2bin(std::string const& s) {
    assert(s.length() % 2 == 0);

    std::string sOut;
    sOut.reserve(s.length()/2);

    std::string extract;
    for (std::string::const_iterator pos = s.begin(); pos<s.end(); pos += 2)
    {
        extract.assign(pos, pos+2);
        sOut.push_back(std::stoi(extract, nullptr, 16));
    }
    return sOut;
}

另请查看全局http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/reference/write.html以在一个组合操作中编写整个消息。

答案 1 :(得分:0)

你好像忘记了io_service来实现serial_port。 serial_port默认构造函数有2个参数io_service和端口名称