【问题标题】:Boost ASIO Serial Write Hex values提升 ASIO 串行写入十六进制值
【发布时间】:2016-04-14 15:16:42
【问题描述】:

我正在使用 ubuntu 通过串行端口与设备通信。所有消息都必须是十六进制值。我已经在 Windows 环境中使用白蚁测试了通信设置,并且得到了我期望的响应。但是在使用 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 中进行设置以使其正确发送吗?

【问题讨论】:

  • “十六进制值”是什么意思?你确定uint8_t hexValue = ...;这行是正确的吗?
  • @MikeCAT 我希望将像 {0,1,...E,F} 这样的十六进制值作为二进制数据传递。所以是的,看起来我的转换不正确。但是,下面提供工作转换的人以及将其写入串行端口的方式。
  • 一个字节(8 位)由两个十六进制数字组成,而不是一个。你确定吗?

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


【解决方案1】:

看起来您确实想发送与您在message拥有的十六进制编码文本相对应的二进制数据。

有很多方法可以剥那只猫的皮。我个人会从解码整个消息开始。这将始终减少十六进制编码大小的消息。因此,如果您愿意,您可以就地执行此操作。

来自an older answer的简单介绍:

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;
}

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

std::string binary_msg = hex2bin(message);
serialPort.write_some(boost::asio::buffer(binary_msg));

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

【讨论】:

  • 你能解释一下这个函数到底在做什么吗?
【解决方案2】:

您似乎忘记了用于实例化 serial_port 的 io_service。 serial_port 默认构造函数有 2 个参数 io_service 和端口名称

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2015-08-22
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多