В настоящее время мне поручено разработать программный модуль для связи с контроллером шагового двигателя. Проект написан на 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 Я действительно очень торопился, я реализовал первое решение, которое пришло мне в голову. Но есть ли способ сделать это лучше? Теперь устройство, с которым я общаюсь, более сложное, чем предыдущее, поэтому, если есть способ, как сделать это лучше, я бы хотел сделать это именно так.
Используется ли символ «новой строки» после каждого сообщения, которое вы можете использовать цикл while (running) (в фоновом потоке) для чтения данных и запускать сообщение, полученное после каждого «сообщения». – CodingBarfield
Вы хотите, чтобы связь была синхронной или асинхронной? В вашем коде «Response = ... SendMessage (...)» похоже, что вы блокируете до получения ответа? –
Это синхронное общение. Сообщение должно быть строго однопоточным. – Biggles