2012-02-14 5 views
0

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

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

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

Единственная машина, которая имеет тот же адрес, может ответить (основная ведомая архитектура).

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

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

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

При необходимости: EI-Bisynch ASCII Sequence Diagrams

+0

Ну, вы знаете, кому вы отправили запрос, так что если отправитель не идентифицируется в ответе, кажется, единственный ход действий - дождаться ответа перед отправкой нового запроса. –

+0

@ 500 - Внутренняя ошибка сервера: проблема в том, что я посылаю всем, из цикла. и некоторые машины могут быть в автономном режиме или отключены, поэтому они не могут ответить – user1202382

+0

SerialPort.PortName соответствует машине. –

ответ

1

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

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

В принципе, вы должны быть в состоянии обернуть в петлю код, описанный здесь: Providing Asynchronous Serial Port Communication

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

+0

ну, спасибо, ребята, за то, что я поддерживаю
Я решаю эту проблему :) – user1202382

1

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

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

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

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

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

+0

+1: Обратите внимание, что если OP использует версию MODBUS RTU, то все подчиненные ответы должны включать в себя ведомый адрес, данные и контрольные суммы. – NotMe

+0

@ Keith Nicholas: не могли бы вы дать еще несколько объяснений или кода. потому что я на самом деле не эксперт по mvvm. @ Chris Lively: нет мы используем ELbisynch – user1202382

0

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

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