Свойство .esctype
| Назначение: | Определяет для выбранного последовательного порта (выбор выполняется через ser.num), включено ли распознавание последовательных escape-последовательностей и, если да, какого типа последовательность нужно распознавать. |
| Тип: | Enum (pl_ser_esctype, byte) |
| Диапазон значений: |
|
| См. также: | Режим 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<<