我正在使用 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 中设置一些东西才能使其正确发送吗?
看起来您确实想发送binary与您的十六进制编码文本相对应的数据have in message
.
给猫剥皮的方法有很多种。我个人会从解码整个消息开始。这将始终减少十六进制编码的消息大小。因此,如果您愿意,您可以就地执行此操作。
一个简单的取自较旧的答案 https://stackoverflow.com/questions/18906027/missing-punctuation-from-c-hex2bin/18906270#18906270:
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 http://www.boost.org/doc/libs/1_60_0/doc/html/boost_asio/reference/write.html在一个组合操作中写入整个消息。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)