Maximizing data rate by adjusting codes and code rates