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);
}
}
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!!
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);
@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
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:
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