Свойство .esctype

Назначение:Определяет для выбранного последовательного порта (выбор выполняется через ser.num), включено ли распознавание последовательных escape-последовательностей и, если да, какого типа последовательность нужно распознавать.
Тип:Enum (pl_ser_esctype, byte)
Диапазон значений:
  • 0 - PL_SER_ET_DISABLED (по умолчанию): распознавание последовательных escape-последовательностей отключено.
  • 1 - PL_SER_ET_TYPE1: распознаются escape-последовательности типа 1.
  • 2 - PL_SER_ET_TYPE2: распознаются escape-последовательности типа 2.
См. также:Режим UART, Настройки последовательного порта

Подробности

Escape-последовательность - это особое сочетание символов во входящих данных, принимаемых последовательным портом. Escape-последовательности распознаются только в режиме UART (ser.mode = 0 - PL_SER_MODE_UART).

Когда обнаруживается escape-последовательность, генерируется событие on_ser_esc и последовательный порт отключается (ser.enabled = 0 - NO). Если распознавание включено, оно работает, даже когда используется замыкание буферов (см. свойство ser.redir). Ниже описаны оба типа escape-последовательностей.

Тип 1

Escape-последовательность типа 1 состоит из трёх идущих подряд escape-символов (ASCII-код escape-символа задаётся свойством ser.escchar). Чтобы последовательность была распознана, перед каждым из escape-символов должна быть пауза не менее 100 мс:

...предыдущие данные<--100ms-->E.C.<--100ms-->E.C.<--100ms-->E.C.

Если пауза перед очередным escape-символом превышает 100 мс, этот символ считается частью escape-последовательности и в буфер приёма (RX) не записывается. Если пауза перед очередным escape-символом меньше 100 мс, он считается обычным символом данных и сохраняется в буфере приёма (RX). Кроме того, счётчик escape-символов сбрасывается, и последовательность нужно начинать заново. Следующий пример иллюстрирует один важный момент (escape-символы показаны как «<»). Допустим, последовательный порт принимает такую строку:

ABC<--100ms--><<--100ms--><<DE

Перед первыми двумя escape-символами в этом примере была правильная пауза, поэтому они были засчитаны как часть escape-последовательности и в буфер не сохранились. Перед третьим escape-символом правильной паузы не было, поэтому он был воспринят как символ данных и сохранён в буфере. В буфер приёма (RX) записано следующее:

ABC<DE

Побочный эффект, на который указывает этот пример: первые два escape-символа потеряны - они не вошли в успешную escape-последовательность (так как она не была завершена) и не были сохранены в буфере.

Тип 2

Escape-последовательность типа 2 не привязана ко времени. Она состоит из escape-символа (задаётся свойством ser.escchar), за которым идёт любой символ, кроме escape-символа. Чтобы принять символ данных, ASCII-код которого совпадает с кодом escape-символа, последовательный порт должен получить этот символ дважды. В буфер приёма (RX) при этом будет записан один символ.

Следующая последовательность будет распознана как escape-последовательность (если текущий escape-символ - не «D»):

ABC<D

В последовательности ниже два идущих подряд escape-символа будут восприняты как данные (в буфер приёма (RX) попадёт только один такой символ):

ABC<<

Исходный материал Tibbo обновлён 9 августа 2022Оригинал на docs.tibbo.com · Сообщить об ошибке