here's the rx code:
```py
        rx_queue = asyncio.Queue()
        async def read_os():
            while True:
                packet = filter_packet(await os_iface.recv())
                self.logger.debug("os->usb packet=<%s>", dump_hex(packet))
                await rx_queue.put(packet)
        async def write_usb():
            buffer = []
            while True:
                try:
                    if not buffer:
                        packet = await rx_queue.get()
                    else:
                        packet = rx_queue.get_nowait()
                    buffer.append(struct.pack(">H", len(packet)))
                    buffer.append(packet)
                except asyncio.QueueEmpty:
                    await usb_iface.write(b"".join(buffer))
                    await usb_iface.flush()
                    buffer.clear()
```