C ++ открывает общий последовательный порт с CreateFile - PullRequest
0 голосов
/ 15 февраля 2012

В настоящее время я пытаюсь реализовать класс считывателя последовательного порта с помощью Windows (уже реализован класс с использованием Boost, хочу учесть возможность того, что платформа может не иметь Boost).

Кажется, что все работает хорошо, за исключением того, что когда я тестирую свое устройство чтения последовательного порта Windows (исполняемый файл) с помощью моего устройства записи последовательного порта Boost (отдельный исполняемый файл), средство записи выдает исключение, запрещающее доступ. В противном случае считыватель работает, так как кажется, что он читает все, что находится на последовательном порту, вплоть до того момента, когда писатель больше не может писать.

Неважно, запускается ли устройство записи первым или читатель запускается первым: как только устройство чтения открывает порт для чтения, устройство записи больше не может записывать в этот порт.

Я пытался установить разные аргументы в методе CreateFile (), но пока безрезультатно, я ожидаю, что следующий фрагмент кода будет работать, но это не так.

m_serial = CreateFile(
    m_port, 
    GENERIC_READ, 
    FILE_SHARE_WRITE, 
    0, 
    OPEN_EXISTING, 
    FILE_ATTRIBUTE_NORMAL, 
    0);

Код писателя может быть неактуальным, но в любом случае он здесь:

void writeLine(std::string line) 
{
    boost::asio::io_service io;
    boost::asio::serial_port serial(io, m_port);

    serial.set_option(boost::asio::serial_port_base::baud_rate(m_rate));

    boost::asio::write(serial, boost::asio::buffer(line.c_str(), line.size()));

}

И. What () для boost :: system :: system_error:

open: Access is denied

Есть идеи?

Я посмотрел здесь: http://www.robbayer.com/files/serial-win.pdf (отличная статья, но не заходит так далеко) и http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx - похоже, это должен быть аргумент dwShareMode, но я не могу его получить рабочий.

Редактировать: Я должен упомянуть, что я использую этот эмулятор последовательного порта http://www.eterlogic.com/Products.VSPE.html, который вполне может быть причиной моих бед, если это так, то это не имеет значения. Эмулятор работает должным образом при использовании моего Boost reader с моим Boost Writer (из двух отдельных исполняемых файлов).

1 Ответ

0 голосов
/ 21 февраля 2012

Я могу понять, почему сейчас не было ответов. Для записи, аргументы для открытия последовательного порта были в порядке. Проблема заключалась в том, что я пытался открыть один и тот же порт для каждого чтения, не закрывая его, поэтому я просто оставил его открытым до тех пор, пока не закончу с ним.

...