很难说你的情况是什么原因,但实践表明你经常需要在串口上禁用RTS
灵敏度。
RTS
是真实的针脚RS-232
当另一侧的设备打开时,该接口处于打开状态。
serial_port::read_some
调用看起来在这个信号上的基础Windows API
函数。因为你没有真正的RS-323
设备,所以你需要依赖这个信号的驱动器仿真,这可能是错误的(不幸的是经常是这样)。
要禁用它,请调用serial_port::set_option(DCB)
并将RTSControl
设置为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;
}
,i。即如果CloseHandle()
由于某种原因(或挂起)失败,则内部句柄值不会被分配给INVALID_HANDLE_VALUE
,并且is_open()
将始终返回true
。
要解决这个问题,之后close()
“ING检查is_open()
,如果返回true
,破坏boost::asio::serial_port
整个实例,并重新创建它。
谢谢,我想试试 - 但不应在设备第一次打开时的读取也失败了呢? – VolkA 2009-02-12 13:48:55
当驾驶员说RTS关闭时,读取将失败。何时发生取决于驱动程序的实现。顺便说一句,当读取开始成功:重新启动,设备重新连接后,超时后? – Quassnoi 2009-02-12 13:53:00