sendRawFrame method

  1. @override
Future<Uint8List> sendRawFrame(
  1. Uint8List aduRequest
)
override

Send raw frame to the remote server

Implementation

@override
Future<Uint8List> sendRawFrame(Uint8List aduRequest) async {
  if (!isConnected) {
    await connect();
  }

  await _port.write(aduRequest);

  final function = aduRequest[1];
  final functionFail = (aduRequest[1] | 0x80) & 0xFF;
  final bytesToRead = _calculateResponseLength(aduRequest);

  // Add delay based on baud rate
  await Future.delayed(_calculateDelay(aduRequest.length + bytesToRead));

  // Read minimum length first
  final minData = await _port.read(rtuAduMinSize);

  if (minData[1] == function) {
    // Function is correct, read the rest
    if (bytesToRead > rtuAduMinSize) {
      final remaining = bytesToRead - minData.length;
      if (remaining > 0) {
        final restData = await _port.read(remaining);
        return Uint8List.fromList([...minData, ...restData]);
      }
    }
    return minData;
  } else if (minData[1] == functionFail) {
    // Error response, read 5 bytes total
    if (minData.length < _rtuExceptionSize) {
      final remaining = _rtuExceptionSize - minData.length;
      final restData = await _port.read(remaining);
      return Uint8List.fromList([...minData, ...restData]);
    }
    return minData;
  } else {
    throw Exception('modbus: unknown function code ${minData[1]}');
  }
}