write method

  1. @override
Future<void> write(
  1. List<int> bytes
)
override

Transmit a raw byte sequence.

Implementation

@override
Future<void> write(List<int> bytes) async {
  if (!isOpen) {
    throw StateError('LibserialportSerialTransport not open');
  }
  final buf = malloc<Uint8>(bytes.length);
  try {
    for (var i = 0; i < bytes.length; i++) {
      buf[i] = bytes[i] & 0xFF;
    }
    var remaining = bytes.length;
    var offset = 0;
    while (remaining > 0) {
      final written = _bindings.spNonblockingWrite(
        _port!, buf + offset, remaining,
      );
      if (written < 0) {
        throw StateError('sp_nonblocking_write failed: rc=$written');
      }
      if (written == 0) {
        // Yield so the caller can retry; libserialport's non-blocking
        // path returns 0 when the OS buffer is full.
        await Future<void>.delayed(const Duration(milliseconds: 1));
        continue;
      }
      remaining -= written;
      offset += written;
    }
  } finally {
    malloc.free(buf);
  }
}