【问题标题】:boost::asio::serial_port set RTS DTSboost::asio::serial_port 设置 RTS DTS
【发布时间】:2015-06-03 11:21:36
【问题描述】:

我有一个串口设备,我想在通信过程中控制 RTS 和 DTR 信号。基本上整个通信都是基于这两个信号。有没有办法在 linux 下使用 boost::asio::serial_port 实现来做到这一点。有什么方法可以让 boost 使用的底层结构来控制这两个信号?

我在 boost/asio/impl/serial_port_basis.ipp 下找到了

boost::system::error_code serial_port_base::flow_control::load(
const BOOST_ASIO_OPTION_STORAGE& storage, boost::system::error_code& ec)
{
#if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__)
...
#else
  if (storage.c_iflag & (IXOFF | IXON))
  {
    value_ = software;
  }
# if defined(_BSD_SOURCE)
  else if (storage.c_cflag & CRTSCTS)
  {
    value_ = hardware;
  }
# elif defined(__QNXNTO__)
  else if (storage.c_cflag & IHFLOW && storage.c_cflag & OHFLOW)
  {
    value_ = hardware;
  }
# endif
  else
  {
    value_ = none;
  }
#endif
  ec = boost::system::error_code();
  return ec;
}

boost 还定义了 #define BOOST_ASIO_OPTION_STORAGE termios

【问题讨论】:

  • 你可以别看了,Boost只包装了驱动程序的握手控制。自己控制它们需要特定于平台的后备代码。

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


【解决方案1】:

对 native_handle 说实话很容易。 我就是这样解决的。

#include <sys/ioctl.h>
....

:::Constructor:::
{
  //config for my device
  serialPort.open(port);
  serialPort.set_option(serial_port::baud_rate(9600));
  serialPort.set_option(serial_port::parity(serial_port::parity::even));
  serialPort.set_option(serial_port::character_size(serial_port::character_size(8)));
  serialPort.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
  serialPort.set_option(serial_port::flow_control(serial_port::flow_control::none));
  fd = serialPort.native_handle(); // fd is of typ int
}

void setRTS(bool enabled
    //int fd = serialPort.native_handle();
    int data = TIOCM_RTS;
    if (!enabled)
        ioctl(fd, TIOCMBIC, &data);        
    else
        ioctl(fd, TIOCMBIS, &data);
}

void setDTR(bool enabled)
{
    //int fd = serialPort.native_handle();
    int data = TIOCM_DTR;
    if (!enabled)
        ioctl(fd, TIOCMBIC, &data);        // Clears the DTR pin
    else
        ioctl(fd, TIOCMBIS, &data);        // Sets the DTR pin
}

【讨论】:

    【解决方案2】:

    flow_control 没有帮助吗? 您可以使用 serial_port::native_handle() 并使用本机操作系统功能

    【讨论】:

    • 并尝试在 ioctl 上查看,也许这是您在 linux 上需要的内容
    • 不,我必须根据要发送到设备的数据将它们设置为 0 和 1。是否可以使用 ioctl 和 boost 中的 native_handle()?
    • 你可能会做这样的事情 int setDTR(unsigned short level) { int status; if (ioctl(fd, TIOCMGET, &status) == -1) { perror("setDTR(): TIOCMGET");返回0; } 如果(级别)状态|= TIOCM_DTR;否则状态 &= ~TIOCM_DTR; if (ioctl(fd, TIOCMSET, &status) == -1) { perror("setDTR: TIOCMSET");返回0; } 返回 1;其中 fd 是 asio::serial.nativeHandle()
    猜你喜欢
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-01
    • 2012-03-28
    • 1970-01-01
    相关资源
    最近更新 更多