很难说您的具体原因是什么,但实践表明您经常需要禁用RTS串行端口的灵敏度。
RTS是真实RS-232接口上的引脚,当另一侧的设备打开时打开。
serial_port::read_some调用查看此信号的底层Windows API函数。
由于您没有真正的RS-323设备,因此您需要依赖此信号的驱动程序仿真,这可能是错误的(不幸的是经常出现)。
要禁用它,请serial_port::set_option(DCB)使用RTSControlset 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()trueboost::asio::serial_port