Процесс открытия COM-порта - асинхронный. вы не дожидаетесь открытия и сразу пытаетесь считать данные. В прямом варианте, думаю, на on('read') подключено только вызов usb_rx();. В случае таймера порт также успевает открыться.