Первое, что нужно помнить при работе с портом - это то что, чтение и запись должны быть в разных циклах.
Работа с портом очень проста на самом деле.
Для корректной работы очень рекомендую использовать оператор Case. Он позволяет каждое новое условие обрабатывать в следующем цикле.
Теперь к делу. Немного об операторе CASE:
PHP код:
Инструкция CASE
C помощью CASE можно нескольким различным значениям целочисленной переменной сопоставить различные инструкции.
Синтаксис:
CASE <Var1> OF
<Value1>: <Instruction 1>
<Value2>: <Instruction 2>
<Value3, Value4, Value5>: <Instruction 3>
<Value6 .. Value10>: <Instruction 4>
...
<Value n>: <Instruction n>
ELSE <ELSE instruction>
END_CASE;
Если переменная <Var1> имеет значение <Value i>, то выполняется инструкция <Instruction i>
Если <Var1> не принимает ни одного из указанных значений, то выполняется <ELSE Instruction>.
Чтобы одна и та же инструкция выполнялась при различных значениях переменной <Var1>, необходимо перечислить эти значения через запятую.
Чтобы одна и та же инструкция выполнялась для целого диапазона значений, необходимо указать начальное и конечное значения, разделенные двумя точками.
Пример:
CASE INT1 OF
1, 5: BOOL1 := TRUE;
BOOL3 := FALSE;
2: BOOL2 := FALSE;
BOOL3 := TRUE;
10..20: BOOL1 := TRUE;
BOOL3:= TRUE;
ELSE
BOOL1 := NOT BOOL1;
BOOL2 := BOOL1 OR BOOL2;
END_CASE
Теперь поговорим о портах.
1) Необходимо сформировать посылку.
Посылка может быть строкой определенного формата или заданной последовательностью байт.
Самое главное на этом этапе - расчет контрольной суммы. Она есть практически у всех устройств, она позволяет защитить отсылаемые команды от помех и предотвратить передачу ложной информации.
2) Далее команду нужно отослать. Делаете запись в порт. Не зависимо от того какой вы библиотекой будете пользоваться - UNM или SysLibCom все команды записи возвращают число отправленных байт.
Данную команду необходимо выполнять до тех пор, пока возвращаемое число байт не сравняется с длиной команды.
Как только число байт будет верным необходимо запустить таймер. Данный таймер нужен, для того, чтобы задать время ожидания ответа.
3) Теперь начинаем опрос порта. Каждый цикл команда чтения порта возвращает число принятых байт. Если за цикл ни чего не пришло число байт будет равняться 0.
С этого момента начинается все самое интересное. В зависимости от навыков программирования, можно сходу анализировать информацию, которая приходит в порт. Но я рекомендую собирать принятую информацию в некоторый буфер и работать с буфером.
После выполнения команды чтения порта опрашиваем таймер. Если он еще не закончил работу необходимо анализировать принятую информацию. Это зависит от конкретного протокола и ваших потребностей.
Если таймер закончил работу, а ответа нет или он не той длины или он не того содержания, или CRC не корректная ответ считается ошибочным. Сбрасываем таймер, чистим буфер, переходим в начало программы.
Если ответ пришел раньше чем закончил работу таймер переходим в стадию расшифровки.
Инога очень полезно делать паузы между запросами, чтобы не перегружать интерфейс.