Прерывания последовательного порта и io.intenabled

Объект ser. использует линии прерывания вашего устройства в трёх случаях:

Тот же набор линий прерывания доступен вашему приложению через объект io., его свойства io.intnum и io.intenabled и событие io_on_int().

В зависимости от платформы использование линий прерывания объектом ser. и объектом io. может быть как независимым, так и взаимозависимым.

Платформы с независимой обработкой прерываний ser. и io.

На таких платформах линии прерывания можно включать и выключать (через io.intnum и io.intenabled), не нарушая работу последовательного порта. Например, если последовательный порт EM1000 работает в режиме Wiegand и использует линию прерывания 0 как линию W0&1in, вы можете включить эту линию прерывания в объекте io., затем выключить её, и работа последовательного порта не нарушится.

При этом использование линии прерывания последовательным портом не отражается в значении свойства io.intenabled.

Платформы с взаимозависимой обработкой прерываний ser. и io.

На некоторых платформах (например, TPP2) объект ser. открыто использует прерывания объекта io.. Правила таковы:

  • Когда последовательный порт включён и настроен так, что ему нужна линия прерывания (см. выше), соответствующая линия прерывания объекта io. показывает, что она включена (io.intenabled = 1 - ENABLED).
  • Если выключить последовательный порт или настроить его так, что линия прерывания не нужна, соответствующая линия прерывания выключится (io.intenabled станет 0 - DISABLED).
  • Попытка выключить эту линию прерывания (установить io.intenabled = 0 - DISABLED), пока она используется последовательным портом, не сработает, и линия останется включённой.

Тестовый код, показывающий разницу

Запустите приведённый ниже тестовый код на устройстве с независимыми прерываниями (например, EM1000) и на устройстве с взаимозависимыми прерываниями (например, EM2000).

sub on_sys_init()
   ser.num=0                              'for clarity
   ser.mode=PL_SER_MODE_WIEGAND               'this will require the use of the interrupt line 0
   ser.enabled=YES
   io.intnum=0                              'for clarity
   if io.intenabled=NO then
      sys.debugprint("Int line 0 appears disabled, even though the serial port 0 is using it.\x0D")
      sys.debugprint("Enabling the int line 0...\x0D")
      io.intenabled=YES                     'enable the line
   else
      sys.debugprint("Int line 0 is enabled -- this is because the serial port 0 is using it.\x0D")
   end if
   sys.debugprint("Now will try to disable the line...\x0D")
   io.intenabled=NO
   if io.intenabled=NO then
      sys.debugprint("The int line 0 was successfully disabled.\x0D")
   else
      sys.debugprint("The int line 0 is still enabled (ser. object is preventing this.\x0D")
      sys.debugprint("Disable serial port and try again...\x0D")
      ser.enabled=NO
      if io.enabled=NO then
         sys.debugprint("Now that the serial port is closed the int line is disabled.\x0D")
      else
         sys.debugprint("Hmmmm.... how did this happen.\x0D")
      end if
   end if
end sub

Вот вывод на панель Debug для EM1000:

Int line 0 appears disabled, even though the serial port 0 is using it.
Enabling the int line 0...
Now will try to disable the line...
The int line 0 was successfully disabled.

А вот для EM2000:

Int line 0 is enabled -- this is because the serial port 0 is using it.
Now will try to disable the line...
The int line 0 is still enabled (ser. object is preventing this.
Disable serial port and try again...
Now that the serial port is closed the line is disabled.
Исходный материал Tibbo обновлён 2 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке