Recibir conjunto de bytes por puerto serie.

Buenas tardes,

Estoy intentando enviar un conjunto de bytes a mi arduino mega por puerto serie.

Por ejemplo:

Si envío byte 1 = 3 y byte 2 = 0 lo que equivaldría en binario a 00000000 00000011.

Mi arduino recibe byte 1 = 51 ( 3 en codigo ASCII) y byte 2 = 48 ( 0 en código ASCII).
Una vez que recibo esos dos bytes yo los quiero convertir a entero, es decir obtendría un 3. Pero al recibir el valor en código ASCII lo que me convierte a entero son los dos valores ASCII lo que estaría mal.

Buscando información encontré lo siguiente:
caracter2= Serial.read()- '0';
Pero si por ejemplo envío un 1200 en decimal, es decir byte 1 = 176, byte 2 = 4 no me funcionaría correctamente.

¿Alguien puede ayudarme? Llevo días buscando una solución y ya no sé si es que es imposible.

Muchas gracias.

const size_t dataLength = 10;
int data[dataLength];
int dataIndex = 0;
byte caracter1, caracter2;

void setup()
{
  Serial.begin(115200);
} 
 
 
void loop()
{ 

   while (Serial.available()>= sizeof(data[0])){
    
     caracter1= Serial.read()- '0'; //Recibimos primer byte
     caracter2= Serial.read()- '0'; //Recibimos segundo byte
     data[dataIndex]= byteToInt(caracter1, caracter2); //Convertimos los bytes recibidos a entero.
     delay(10);
     dataIndex++;

   } 

   
   if(data[0] == 2) Serial.print("primero" ); 
   else if(data[0]== 3)Serial.print("segundo" );
   else if(data[0]== 4)Serial.print("tercero" );
    
} 
 
uint16_t byteToInt(byte byte1, byte byte2)
{
   return (uint16_t)byte2 << 8 | (uint16_t)byte1;
}

Falta un dato importante ,desde donde envias los bytes??

Por lo de ahora tengo un pequeño programa en c# con un botón. Cuando pulso el botón, envío el valor de la variable CodigoOperacion (que la voy variando yo a mano para ir probando que funciona con distintos valores) al arduino en dos bytes.

Por lo de ahora no tengo mucho más, es la primera vez que me lanzo a intentar comunicar el arduino con c#. En un futuro, me gustaría enviar más bytes con otros datos, por eso la idea de los bytes. Se que podría intentar enviar datos como cadenas de texto y separarlos por ";" pero creo que es más eficiente así.

public Form1()
 {
         InitializeComponent();
          // Abrir puerto mientras se ejecute la aplicación.
         if (!serialPort1.IsOpen)
         {
                try
                {
                    serialPort1.Open();
                }
                catch (System.Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
          }

         serialPort1.DataReceived += new SerialDataReceivedEventHandler(Recepcion);
        }


//Recibimos los datos que envía arduino al PC por el puerto serie.
private void Recepcion(object sender, SerialDataReceivedEventArgs e) {
            
            int tamano = serialPort1.BytesToRead;
            byte[] buffer = new byte[tamano];
            serialPort1.Read(buffer,0, tamano);
 }

//Enviamos datos desde el PC al arduino.
private void btnBytes_Click(object sender, EventArgs e)
{
            int CodigoOperacion = 2;

            char[] data = new char[] {  Convert.ToChar(CodigoOperacion)};            


            byte[] mBuffer;
            mBuffer =  Encoding.Unicode.GetBytes(data); 
            serialPort1.Write(mBuffer, 0, mBuffer.Length);

        }

Aqui tienes un ejemplo https://www.luisllamas.es/comunicar-arduino-con-c/ .Para recoger valores numericos ,repasa el metodo Serial.parseInt() Serial - Arduino Reference