Перенаправление буферов

В разделе Приём данных встречался следующий пример:

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) обычным образом».

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