Перенаправление буферов
В разделе Приём данных встречался следующий пример:
sub on_ser_data_arrival
ser.setdata(ser.getdata(ser.txfree))
ser.send
end sub
Этот пример показывает, как отправить из буфера передачи (TX) все данные, поступающие в буфер приёма (RX), всего двумя строками кода. Каким бы быстрым ни был этот приём, все данные всё равно проходят через ваш код Tibbo BASIC/C, хотя вы никак их не обрабатываете (не изменяете, не анализируете).
Гораздо более эффективный и продвинутый способ - техника под названием перенаправление буфера (замыкание буферов). При замыкании буферов данные принимаются не в буфер приёма (RX) вашего последовательного порта, а напрямую в буфер передачи (TX) другого объекта, который должен эти данные отправить. Это может быть объект ser. (тот же порт или другой), объект sock. и так далее.
Чтобы использовать замыкание буферов, вызовите метод ser.redir и укажите буфер, в который нужно перенаправить данные. После этого событие on_ser_data_arrival вообще не генерируется, потому что данные идут прямо в указанный буфер передачи (TX). Как только данные попадают в этот буфер, они автоматически фиксируются для отправки.
Метод ser.redir работает, только если последовательный порт закрыт (ser.enabled = 0 - NO) в момент выполнения этого метода. Поэтому имеет смысл проверять результат выполнения ser.enabled, как в примере ниже:
sub on_sys_init
if ser.redir(PL_REDIR_SER)= PL_REDIR_SER then
'redirection succeeded
else
'redirection failed (perhaps, the port is opened?)
end if
end sub
Выигрыш в производительности от замыкания буферов огромен благодаря двум факторам:
- Во-первых, данные не обрабатываются программно, поэтому виртуальная машина (VM) вообще не задействована.
- Во-вторых, принимаемые данные попадают прямо в буфер передачи (TX), из которого они отправляются, так что в памяти копируется меньше.
Конечно, с этими данными вообще ничего нельзя сделать - вы просто прокачиваете их насквозь. Но очень часто именно это и нужно! Кроме того, escape-последовательности по-прежнему можно обнаруживать.
Чтобы остановить перенаправление, используйте ser.redir(0), что означает «принимать данные в буфер приёма (RX) обычным образом».