(SOLUCIONADO)Enviar dato hexadecimal por el puerto serie

Hola quiero enviar #define ID 0x00A1 por el puerto serie pero no soy capaz de que me pinte eso, lo que consigo pintar es A1 mediante Serial.print(ID,HEX), los ceros no aparecen, ¿como puedo hacer que pinte 00A1? Gracias

Necesitas convertirlo primero en cadena de texto:

#include <stdio.h>

#define ID 0x00A1

void setup() 
{
  int variable = ID;
  char texto[16];

  Serial.begin(9600);
  
  sprintf(texto, "%04X", variable);
  Serial.println(texto);
}

void loop() 
{
}

Muchas gracias me fue de lujo. Saludos.

De nada, Jorge

PD: Modifica el título a (SOLUCIONADO)

Hola compañeros.

Acabo de registrarme hace unos dias que intento ir aprendiendo programacion y electronica en arduino XD

El caso es que tengo un problema parecido. La solucion que has jorgepl no entiendo ni papa jeje.

Bien el caso es que quiero controlar un equipo por entrada rs232. Tengo un conversor ttl a rs232 con el max232 sus condensadores y demás.

Estos son los comandos basicos que quiero mandar.
ascci hex
Power On ~ P N CR 7Eh 50h 4Eh 0Dh
Power Off ~ P F CR 7Eh 50h 46h 0Dh

Este es el codigo que he intentado hacer manda comando power on espera 1 min y apaga luego vuelve a esperar 3 min para encender.

Si conecto el usb con el pc con el serial monitor todo bien aparece ~PN cambio de linea ~PN

En cambio el dispositivo no responde

int led = 13;

void setup()
{
pinMode(led, OUTPUT);     
Serial.begin(9600);    // configura el puerto serie a 9600bps
}
void loop()
{
Serial.println("~PN");
digitalWrite(led, HIGH);   
delay(1000); 
Serial.println("~PN"); //power on

digitalWrite(led, LOW); 
delay(1000); 
digitalWrite(led, HIGH);   
delay(60000); //espera 1 min
digitalWrite(led, LOW);
Serial.println("~PF"); //Power off
delay(180000); //espera 3 min para volver a encender.
}

Si podeis aclararme si hay algun fallo de programa o me pongo a mirar hard en principio pin rx y tx estan bien conectados .
El pinaje del dispositivo no esta claro si pin2-pin3 es rx o tx he probado intercambiandolos.

Gracias por vuestro tiempo

Saludos

nekonos:
El caso es que tengo un problema parecido.

La verdad es que yo no le veo mucho parecido :slight_smile:

En cuanto al código, no hace exactamente lo que dices, de hecho, manda 2 veces el comando “Power on” con 1 segundo de tiempo entre ambos comandos. Por lo demás, debe funcionar según tus especificaciones

Como no dices que es lo que intentas controlar por puerto serie, no podemos saber si has conectado bien o no, ni por qué no te funciona.

Hola jorge Gracias por tu rapida respuesta. Mira si soy novato que pense que tenia relacion.

Efectivamente manda 2 veces power on, me exprese mal.

Estoy haciendo pruebas con un proyector usa pin 2 rx 3 tx y 5 gnd. aqui el protocolo no es el mismo modelo pero los comandos son iguales.

El conversor que tengo es como este la version 5v

Conecto pin 0 rx a rx0 pin 1 tx a tx0

alientacion +vcc a 5v ( da suficiente amperaje) gnd con gnd

Salidas conectadas al rs2320 ahi tengo una duda porque hay un +vcc que no conecto no se si hace falta.

En principio en serial monitor funciona ok ¿puede ser algun tema del comando que se mande en ascci o hex?

Por cierto uso placa arduino uno.

Saludos

nekonos:
En principio en serial monitor funciona ok ¿puede ser algun tema del comando que se mande en ascci o hex?

ASCII es la representación en forma de carácter del valor hexadecimal que estás mandando, es decir, que cuando mandas ‘P’, lo que realmente estás mandando es 0x50.

Supongo que antes de ponerte con el arduino, has probado la conexión por hyperterminal que ponen en el documento del protocolo para verificar que funciona desde el PC, ¿verdad? Así te aseguras que la conexión por RS232 del proyector funciona y además verás como son los comandos que hay que enviar y la respuesta que da el proyector por puerto serie.

¿Cómo conectas el driver 232 al proyector? ¿Has cruzado Rx y Tx? También estaría bien que comprobases que el driver funciona correctamente: puenteando Rx y Tx en el conector RS232-0 y mediante otro programa en arduino (utilizando softserial.h) en el que envías datos y compruebas que recibes lo mismo que envías (has puenteado Rx y Tx).

En el código no estás enviando el caracter CR. En el monitor cambia de línea porque la propia consola le tienes dicho que ponga una nueva línea. Edito: error mío, sí lo estás enviando puesto que usas la instrucción println()

Solucionado.

Error de pinaje y configuracion del proyector resulta que estaba configurado para recibir comandos por ethernet en vez de rs232.

A veces lo mas elemental no te das cuenta.

Gracias :grin:

Jovenes arduineros, me pueden ayudar?

Estoy tratando de enviar un hexadecimal a un esclavo que funciona mediante modbus rs485, el hexadecimal es el siguiente: 0x01 direccion del esclavo 0x03 funcion de modbus 0x04 primer registro de datos 0x0E ultimo registro de datos 0x00 0x04 numero de datos 0x24 crc 0xFA crc

se supone que al enviar este hexadecimal el esclavo me responde con la informacion que tiene almacenada en los registros correspondientes. Me podrían hechar la mano con esto? soy nuevo en el asunto y tengo poca nocion, me imagino que hay que crear una variable que contenga el hexadecimal que voy a enviar y otra para almacenar la respuesta del esclavo.