Я создаю библиотеку последовательного порта, которая работает в Windows и Linux.Поэтому я выбрал Boost в качестве кроссплатформенной библиотеки.Я успешно создал библиотеку.Теперь, когда я интегрировал эту библиотеку с существующим проектом, я столкнулся с проблемой ниже.
Приложение открывает и закрывает последовательный порт несколько раз, в Linux моя библиотека работает гладко, нет проблем с множественным открытием и закрытием.Когда я запустил то же самое в Windows, закрытие нескольких открытых начал выдавать сообщение об отказе в доступе.
- Открыть - Успех
- Задержка
- Закрыть - Успех
- Задержка
- Открыть - Успех
- Задержка
- Закрыть - Успех
- Задержка
- Открыть - доступ запрещен
- Открыть - доступ запрещен
- Открыть - доступ запрещен
В 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;
}
}