很难说您的具体原因是什么,但实践表明您经常需要禁用RTS
串行端口的灵敏度。
RTS
是真实RS-232
接口上的引脚,当另一侧的设备打开时打开。
serial_port::read_some
调用查看此信号的底层Windows API
函数。
由于您没有真正的RS-323
设备,因此您需要依赖此信号的驱动程序仿真,这可能是错误的(不幸的是经常出现)。
要禁用它,请serial_port::set_option(DCB)
使用RTSControl
set to调用RTS_CONTROL_DISABLE
。
如果close()
你的手柄没有帮助,它可能是一个问题boost
。源代码close()
如下所示:
boost::system::error_code close(implementation_type& impl,
boost::system::error_code& ec)
{
if (is_open(impl))
{
if (!::CloseHandle(impl.handle_))
{
DWORD last_error = ::GetLastError();
ec = boost::system::error_code(last_error,
boost::asio::error::get_system_category());
return ec;
}
impl.handle_ = INVALID_HANDLE_VALUE;
impl.safe_cancellation_thread_id_ = 0;
}
ec = boost::system::error_code();
return ec;
}
,即如果CloseHandle()
由于某种原因失败(或挂起),则内部句柄值不会分配给INVALID_HANDLE_VALUE
并且is_open()
将始终返回true
。
要解决这个问题,请在'ingis_open()
之后立即检查,如果它返回,则销毁整个实例并再次创建它。close()
true
boost::asio::serial_port