Безопасно ли читать и писать на последовательный порт одновременно через разные потоки?



Безопасно ли одновременно читать и записывать на последовательный порт через разные потоки (один поток чтения и один поток записи)? Будет ли необходимо добавить блокировку вокруг чтения / записи в каждом потоке?

555   3  

3 ответов:

Из документации SerialPort:

Все открытые статические (Общие в Visual Basic) члены этого типа потокобезопасны. Все члены экземпляра не гарантируют потокобезопасности.

Поскольку чтение и запись не статичны, они не будут потокобезопасны. Это очень плохая идея, в любом случае, так как класс SerialPort поддерживает внутренние буферы для вас.

Вам потребуется синхронизировать ввод-вывод с последовательным портом.

Чтение и запись в последовательный порт "одновременно" из разных потоков-это стандартный способ обработки сообщений последовательного порта: один поток обрабатывает чтение, а другой-запись. Допустимый.

Существует ряд последовательных устройств, которые асинхронно передают данные на главную машину, но при этом позволяют передавать команды на само устройство: такие устройства, как сканеры штрих-кодов, сканеры тегов и камеры.

Проблемы?

Проблемы возникают, когда вы пытаетесь синхронизировать ваше сообщение с устройством и обратно.

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

Резюме

В общем, я бы предложил иметь только одну дополнительную нить это обрабатывает все чтение данных порта и запускает события, такие как DataReceived и выполняет все ваши записи из основного потока.

Я бы ожидал, что конкретный случай, который вы описываете, с 1 потоком чтения и 1 потоком записи будет безопасным.

Каналы чтения и записи на аппаратном обеспечении предназначены для использования полного дуплекса, и программное обеспечение должно быть разработано для поддержки этого тоже.
И хотя я не смог найти явного утверждения об этом, пример на странице MSDN для SerialPort также записывает из основного потока, в то время как он читает на другом. Без блокировки.

Comments

    Ничего не найдено.