2011-02-07 2 views
3

В настоящее время мне поручено разработать программный модуль для связи с контроллером шагового двигателя. Проект написан на C#, у меня есть dll C++ для связи с контроллером. Связь выполняется через последовательный порт. Я планирую написать весь фрагмент на C#, импортировав необходимые методы DllImport. Ключевой метод выглядит примерно так:Схема построения последовательной связи

ComSendReceive(pHandle, bufferIn,sizeBufferIn,bufferOut,ref bufferOut) 

Есть несколько типов сообщений:

  • Вы отправить сообщение и планирующим подтверждение (не то же самое для каждого сообщения, иногда это хорошо, иногда это ПОЛНЫЙ т.д. .
  • вы отправить сообщение и получить сообщение - вы можете получить сообщение об ошибке или данные (например GET_CONTROLLER_ID)
  • Несколько других типов

Конечно, мне нужно контролировать связь для тайм-аутов.

Мой вопрос: есть ли какой-либо «шаблон дизайна» для решения этой проблемы? Я уверен, что это довольно распространенная проблема, которую многие разработчики уже решили.

Чтобы внести свой вклад немного - я имел дело с подобной проблемой в моей последней работе, и я решил это так:

Я имел класс общаться с портом Com и классом AT_message с кучей перегруженных конструкторов:

class AT_Message 
{ 
    public bool DoResponseCheck; 
    public string ExpectedResponse; 
    public AT_COMMAND command; 
    public string data; 
    public bool AddCarriageReturn; 
    ... 

    //Plenty of ctors 
} 

class UnfriendlyInterface 
{ 
    Response SendMessage(AT_Message msg) 
    { 
     //Communicates directly with C++ dll, send message, check timeouts etc.... 
    } 
} 

И я имел класс основное приложение было сообщающийся с, он имел дружественные методы человека, как

class FriendlyInterface 
{ 
    bool AutodetectPortAndOpenComm(); 

    Result AnalyzeSignal(byte[] buffer) 
    { 
     Response response = UnfriendlyInterface.SendMessage(new Message(AT_Command.PrepareForSignal, (doResponseCheck)true, ExpectedResponse.Ok,Timeout.short); 
     Response response = UnfriendlyInterface.SendMessage(new Message(buffer,(doResponseCheck)false,Timeout.long); 

     //.... Other steps 
    } 

    //... other methods 

} 

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

+0

Используется ли символ «новой строки» после каждого сообщения, которое вы можете использовать цикл while (running) (в фоновом потоке) для чтения данных и запускать сообщение, полученное после каждого «сообщения». – CodingBarfield

+0

Вы хотите, чтобы связь была синхронной или асинхронной? В вашем коде «Response = ... SendMessage (...)» похоже, что вы блокируете до получения ответа? –

+0

Это синхронное общение. Сообщение должно быть строго однопоточным. – Biggles

ответ

0

Это похоже на образец фасада учебника. Ответ на все это заключается в том, чтобы инкапсулировать ваши варианты. Например, попробуйте создать общий интерфейс для команд, которые дают подтверждение, и написать код клиента для использования этого интерфейса. Затем конкретные типы могут решить, как интерпретировать различные подтверждения в единый сигнал (Ok = Complete = Good или что-то еще)

Вот хорошая статья о facade pattern. Также смотрите wikipedia article.

Смежные вопросы