Трудно сказать, какова точная причина в вашем случае, но практика показывает, что вам часто нужно отключить 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;
}
, т.е. е. если по какой-либо причине CloseHandle()
не удается (или зависает), внутреннему значению дескриптора не присваивается значение INVALID_HANDLE_VALUE
и is_open()
всегда будет возвращать true
.
Чтобы обойти это, отметьте is_open()
сразу после close()
'ing, и если он вернет true
, уничтожьте весь экземпляр boost::asio::serial_port
и создайте его снова.