sendRawFrame method
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]}');
}
}