Закрытие boost :: asio :: serial_port с ожиданием read_async_some - PullRequest
4 голосов
/ 12 марта 2012

Я подключаю read_async_some() вызовы к асинхронному чтению с последовательного порта.В какой-то момент мне нужно отменить асинхронное чтение с использованием и обнаружить этот факт в связанных обработчиках.Из документации для cancel() я ожидал сделать это, просто проверив error_code, переданный моим обработчикам:

Эта функция вызывает все незавершенные асинхронные операции чтения или записичтобы завершить немедленно, и обработчикам отмененных операций будет передано сообщение об ошибке boost::asio::error::operation_aborted.

Однако, когда я пытаюсь это сделать, мои обработчики вызываются с ошибкой invalid_argument вместо ожидаемой operation_aborted ошибка.Вот минимальный пример, который воспроизводит проблему с помощью ptty для эмуляции последовательного порта:

void handle(boost::system::error_code const& error, size_t count)
{
    std::cout << "error_code = " << error.message() << std::endl;
}

int main(int argc, char **argv)
{
    std::fstream fs("/dev/ttyp0", std::ios::in | std::ios::ate);
    boost::asio::io_service io;
    boost::asio::serial_port serial(io, "/dev/ttyp0");

    std::vector<uint8_t> buffer(1);
    serial.async_read_some(boost::asio::buffer(buffer),
        boost::bind(&handle,
                    boost::asio::placeholders::error,
                    boost::asio::placeholders::bytes_transferred
        )
    );

    boost::thread thread(boost::bind(&boost::asio::io_service::run, &io));
    serial.cancel();
    thread.join();
    fs.close();
}

По крайней мере для меня вывод этой программы error_code = Invalid argument.Может кто-нибудь объяснить, почему я не получаю поведение, описанное в документации?

1 Ответ

4 голосов
/ 12 марта 2012

Nevermind. В случае, если кто-то столкнется с той же проблемой, проблема заключалась в использовании pttys для тестирования. Как оказалось, pttys не работает должным образом при использовании для асинхронного ввода, и boost::asio указывает на эту проблему с сообщением об ошибке выше.

Я смог решить эту проблему, создав симулированный шлейф последовательного порта с socat. В этой записи блога .

есть хорошие инструкции.
...