boost::asio::serial_port 设置 RTS DTS
boost::asio::serial_port set RTS DTS
我有一个串口设备,想在通讯过程中控制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
flow_control 没有帮助吗?
您可以使用 serial_port::native_handle() 并使用原生 OS 函数
对 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
}
我有一个串口设备,想在通讯过程中控制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
flow_control 没有帮助吗? 您可以使用 serial_port::native_handle() 并使用原生 OS 函数
对 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
}