запутался при получении данных от последовательного порта - PullRequest
0 голосов
/ 15 февраля 2012

Я столкнулся с проблемой, которая заняла у меня слишком много времени, но без ее решения. Поэтому я очень хочу, чтобы вы мне помогли.

У меня есть приложение, созданное с помощью c # wpf, и оно связывается с духовками через последовательный порт.

рамка, которую мне нужно отправить, имеет следующую форму: [EOT] (GID) (UID) (Temp) [ENQ] gid uid: идентификатор группы и идентификатор устройства (адрес машины). (eof), (enq): создает сообщение. (темп) означает: дайте мне значение температуры.

может ответить единственный компьютер с тем же адресом (архитектура подчиненного устройства).

форма ответного сообщения: [STX] (Temp) <DATA> [ETX]. поле содержит только значение температуры STX начальный текст. etx конец текста.

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

Итак, вкратце ситуация такова:
-Я отправляю данные в печи.
- Я получил данные.
- Я не могу решить, какая печь ответила.
пожалуйста, у любого есть идея. PS: работаю с протоколом: EI-BISYNCH eurotherm EuroTherm

При необходимости: Диаграммы последовательности EI-Bisynch ASCII

Ответы [ 3 ]

1 голос
/ 16 февраля 2012

В этих условиях типичным решением является:

  1. Отправка запроса на текущее устройство
  2. Ожидание ответа в течение определенного времени ожидания
    • Если мыответ получен в течение тайм-аута, устройство ответило.
    • Если мы не получили ответ, устройство отключено, отметьте его как таковое.
  3. Переключиться наследующее устройство, перейдите к 1

По сути, вы должны иметь возможность обернуть в цикл код, описанный здесь: Обеспечение связи через асинхронный последовательный порт

То естьпример, который работает с AutoResetEvent.Одна из многопоточности .Net, позволяющая синхронизировать потоки (потоки, отправляющие запрос в цикле, и потоки, получающие сообщение в цикле)

1 голос
/ 15 февраля 2012

В этих ситуациях машина, к которой вы обратились, отвечает (или, по крайней мере, считается, что она). Один мастер - несколько подчиненных. Значение: -

  • Мастер -> Эй, # 1, скажи мне свой темп -> # 1, сэр! ДА СЭР! 23 градуса!
  • Мастер -> Привет # 2 ...

Идея, что никакой другой раб не ответит. По соглашению протокола.

Довольно сложно сделать что-либо, кроме системы такого типа на последовательном порту.

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

0 голосов
/ 16 февраля 2012

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

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