выпуск Boost последовательный порт несколько открывать и закрывать на окнах - PullRequest
0 голосов
/ 12 апреля 2019

Я создаю библиотеку последовательного порта, которая работает в Windows и Linux.Поэтому я выбрал Boost в качестве кроссплатформенной библиотеки.Я успешно создал библиотеку.Теперь, когда я интегрировал эту библиотеку с существующим проектом, я столкнулся с проблемой ниже.

Приложение открывает и закрывает последовательный порт несколько раз, в Linux моя библиотека работает гладко, нет проблем с множественным открытием и закрытием.Когда я запустил то же самое в Windows, закрытие нескольких открытых начал выдавать сообщение об отказе в доступе.

  1. Открыть - Успех
  2. Задержка
  3. Закрыть - Успех
  4. Задержка
  5. Открыть - Успех
  6. Задержка
  7. Закрыть - Успех
  8. Задержка
  9. Открыть - доступ запрещен
  10. Открыть - доступ запрещен
  11. Открыть - доступ запрещен

В Linux Выше проблемы нет

Код для открытия

bool SerialPort::ComOpen(char *com_port_name, int nBaudrate, parity /*nParity*/, stop_bits /*nStopBits*/, flow_control /*nDataBits*/){

boost::system::error_code error_code;

if (m_port)
{
    std::cout << "error : port is already opened..." << std::endl;
    return false;
}
try
{
    m_port = serial_port_ptr(new boost::asio::serial_port(m_io_service));
    if (m_port)
    {
        m_port->open(com_port_name, error_code);
    }
    else
    {
        std::cout << "serial_port_ptr : Port creation failed " << std::endl;
        return false;
    }
}
catch (...)
{
    std::clog << boost::current_exception_diagnostic_information() << std::endl;
}

if (error_code)
{
    std::cout << "error : m_port->open() failed : com_port_name  = " << com_port_name << " : message : " << error_code.message() << std::endl;
    return false;
}
// option settings...
m_port->set_option(boost::asio::serial_port_base::baud_rate(nBaudrate));
m_port->set_option(boost::asio::serial_port_base::character_size(8));
m_port->set_option(boost::asio::serial_port_base::stop_bits(boost::asio::serial_port_base::stop_bits::one));
m_port->set_option(boost::asio::serial_port_base::parity(boost::asio::serial_port_base::parity::none));
m_port->set_option(boost::asio::serial_port_base::flow_control(boost::asio::serial_port_base::flow_control::hardware));

boost::thread t(boost::bind(&boost::asio::io_service::run, &m_io_service));
m_native_file_handle = m_port->native_handle();
async_read_some_();
return true;}

код для закрытия

void SerialPort::ComClose(){
boost::mutex::scoped_lock lock(m_serial_mutex);
boost::system::error_code error_code_cancel , error_code_close;
try
{
    if (m_port)
    {
        m_port->cancel(error_code_cancel);
        if (error_code_cancel)
        {
            std::cout << "error : m_port->cancel() failed " << error_code_cancel.message() << std::endl;
        }
        m_port->close(error_code_close);
        if (error_code_close)
        {
            std::cout << "error : m_port->close() failed " << error_code_close.message() << std::endl;
        }           
        m_port.reset();
        m_io_service.stop();
        m_io_service.reset();
        m_port = NULL;
    }
}
catch (...)
{
    std::clog << boost::current_exception_diagnostic_information() << std::endl;
}

}

...