Problema recibiendo comandos de un teclado mediante RS 232

Hola amigos, estoy haciendo unas pruebas con un teclado que debo conectar mediante RS 232 a un Arduino UNO. Segun los datos que me mando el fabricante, el teclado envia a una velocidad de 9600, tramas de 8 bits y 1 bit de stop. Al presionar cada tecla se envia el numero en Hexadecimal como muestro a continuacion:
1=0x31
2 =0x32
3 =0x33
4 =0x34
5 =0x35
6 =0x36
7 =0x37
8 =0x38
9 =0x39
10 =0x40
pero hasta ahora solo recibo datos incoherentes, es decir por ejemplo si presiono el cualquier tecla el monitor serial me muestra siempre como si hubiera recibido un ⸮
, lo cual me hace sospechar de q no se esta recibiendo la trama de bits completa
Aqui adjunto el firmware que he estado utilizando para tratar de recibir la secuencia

#include <SoftwareSerial.h>
SoftwareSerial RS(7,6);    //Rx,Tx del RS-232
String frase = "";
int num;
void setup()   {
   Serial.begin(9600);
   RS.begin(9600);
   Serial.println("RS-232 listo para recibir...");
}

void loop(){
   while (RS.available()){
      char caracter = RS.read();
      Serial.println(caracter);
      frase.concat(caracter);
      delay(3);
     
   }
   if (frase != ""){
      Serial.println(frase);
      num= frase.toInt();
      frase = "";
      Serial.println(num);
   }
}

Mil gracias de antemano

Comandos desde un teclado en RS232? Si es RS232 y no tienes un módulo RS232 a TTL o sea a 5V entonces puedes quemar tu puerto serie del arduino.
RS232 tiene niveles +-9 como minimo y en general antes eran +-12V
Un teclado dices con salida RS232, que raro!!

si el teclado da la salida con RS232, de hecho a la salida tiene un MAX 232, yo le puse un conversor 232 a TTL

Primero podrías probar el teclado con un programa tal como TestSerial? es gratuito y podrás ver si realmente manda eso a esa velocidad, bits y parada.
comtestserial

Algunos dispositivos serie que dicen que trabajan a 8 bits realmente trabajan a 7 por lo que el char que lo recibe intenta poner:

      char caracter = RS.read();
      character = character & 0x7f;  //añadir filtro 7 bits
      Serial.println(caracter);

Esto es por probar.
Saludos.

@DanX3 de hecho el teclado tenia un problema de hardware, lo acabo de cambiar por otro y funciona correctamente por tanto mi codigo se reduce enormemente, pero ahora me surge otro problema: como puedo hacer la conversion de formato HEX q es como me estan llegando los datos a un entero decimal para poder trabajar con ese valor? adjunto el codigo

#include <SoftwareSerial.h>
SoftwareSerial RS(7,6);    //Rx,Tx del RS-232
String frase = "";
int num;
void setup()   {
  
   Serial.begin(9600);
   RS.begin(9600);
 
   Serial.println("RS-232 listo para recibir...");
}




void loop(){
   while (RS.available()){
     char caracter = RS.read()-'0';
       Serial.print("mostrando el numero en decimal: ");
       Serial.println(caracter,DEC);
        Serial.print("mostrando el numero en hexadecimal: ");
       Serial.println(caracter,HEX);    //// cuando lo muestro en formato HEX es que me devuelve el valor correcto
        
      if (caracter>15)
      {caracter=caracter-6;
        }
        
          if (caracter==-35)
          {caracter='R';}
          if (caracter==-21)
          {caracter='C';
          }
      Serial.println(caracter);
   
      delay(3);
     
      
   }


   
 
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Busca una tabla ASCII y verás que todo lo que recibes esta ahi documentado.
Si recibes "0" y lo muestras en decimal verás 48 y de ahi todos los demás números
En Hexa 48 es 0x30
Asi tiense 0x30 en hexa 48 en decimal y "0" en ASCII

image
En esta tabla los valores estan en decimal a izquierda y ASCII a derecha.

Entonces solo cuando eliges presentarlo es como lo verás.
Nada que convertir o muy poco.
En tu ultimo código ya has hecho las conversiones

      char caracter = RS.read()-'0';
       Serial.print("mostrando el numero en decimal: ");
       Serial.println(caracter,DEC);
        Serial.print("mostrando el numero en hexadecimal: ");
       Serial.println(caracter,HEX);

@rvinaso
No es lo mismo 0x0 (en hexadecimal) que '0'.
'0' hace referencia al caracter ASCII "0" que es el 48. Mira la tabla que ha puesto @Surbyte
Si tu ya le restas 48 aqui:

 char caracter = RS.read()-'0';

Lo que es un '0' lo conviertes en un 0x00 hexadecimal.
te saldría si no lo haces un 0x32 (0x32 hexadecimal es 48 en decimal).
En tu primer post comentabas que:

1=0x31
2 =0x32
3 =0x33
4 =0x34
5 =0x35
6 =0x36
7 =0x37
8 =0x38
9 =0x39
10 =0x40

es lo que te daba el resultado del teclado pero ahora veo que intentas buscar una 'R'.
Yo no haría la conversión de quitar '0' y asi obtienes el valor y caracter de la tecla en cuestión.
¿Qué pasa si pulsas 'R' y haces un serial.println(caracter) sin haberle quitado el '0'?
así puedes comparar directamente

if (caracter =='R') {
...
}