Совместное использование одного ресурса (последовательного порта) между несколькими приложениями - PullRequest
2 голосов
/ 23 июля 2010

Мне нужно архитектурное руководство.Вот моя цель.

У меня есть часть роботизированного оборудования, которое выполняет несколько функций (то есть имеет несколько различных логических устройств).Для иллюстрации, скажем, это рука робота со сменными насадками.Аппаратное обеспечение имеет один последовательный порт, который используется для подключения к ПК, поэтому его можно контролировать различными приложениями.Сам рычаг и сменные насадки могут быть адресованы через один последовательный порт.

Мне нужно предоставить услугу, она предоставляет несколько интерфейсов.Интерфейсы могут называться примерно так:

IRobotArm
IGrabberAttachment
IDrillAttachment

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

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

Еще одно дополнительное требование: я буду работать в.NET / C #, но клиентские приложения вполне могут рассчитывать на использование интерфейса COM, поэтому решение должно работать с COM Interop.

Идеи, пожалуйста!

Ответы [ 2 ]

3 голосов
/ 23 июля 2010

Вам нужен один процесс контроллера, который фактически открывает последовательный порт и отправляет / получает данные.

Ваши библиотеки DLL, предоставляющие эти интерфейсы, должны взаимодействовать с процессом контроллера, а не напрямую с последовательным портом.

1 голос
/ 23 июля 2010

Если ваш процесс контроллера (часть, которая открывает / закрывает порт и осуществляет передачу и прием), доступен нескольким приложениям одновременно, вам потребуется установить некоторые механизмы синхронизации, в противном случае два приложения могут попытаться отправить сообщение одновременно , что может вызвать проблемы при разборе ответа от рук робота.

Предполагая, что у вас запущен один процесс или служба контроллера, вы можете просто использовать ключевое слово C # lock, как показано ниже (при условии простого протокола типа ASCII)

Это работает только в том случае, если контроллер находится в своем собственном процессе, ключевое слово «lock» не будет работать в перекрестном процессе. Также не забудьте утилизировать класс SerialPort при завершении работы.

    Object _access = new Object();
    SerialPort _port;

    public void Open()
    {
        lock( _port )
        {
            if( _port == null )
            {
                _port = new SerialPort("COM1", 9600, Parity.None, 8,StopBits.One );
                _port.Open();
                _port.NewLine = "\r";
            }
        }
    }

    public void Close()
    {
       // TBD
    }

    public string SendAndRecieve( string cmd )
    {
        String response;

        lock( _access )
        {
            // Assume port is already opened
            _port.WriteLine(cmd);
            response = _port.ReadLine();
        }

        return response;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...