あなたの場合の正確な理由を言うのは難しいですが、実際にはRTS
、シリアルポートの感度を無効にする必要があることがよくあります。
RTS
RS-232
反対側のデバイスがオンのときにオンになる、実際のインターフェイスのピンです。
serial_port::read_some
Windows API
このシグナルを参照する基になる関数を呼び出します。
実際のRS-323
デバイスを持っていないため、この信号のドライバ エミュレーションに依存する必要がありますが、これには問題がある可能性があります (残念ながら、多くの場合そうです)。
serial_port::set_option(DCB)
無効にするには、RTSControl
set toで呼び出しRTS_CONTROL_DISABLE
ます。
close()
ハンドルを 'ing しても問題が解決しない場合は、 に問題がある可能性があります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
ます。
これを回避するには、'ing のis_open()
直後に確認し、 が返された場合は、 のインスタンス全体を破棄し、再度作成します。close()
true
boost::asio::serial_port