[SOLUCIONADO] Una función

Hola a todos,
Tengo un problema, para mi grande problema, ya que soy una patata programando….
Tengo un programa, basado en Windows y necesito “coger” los datos que envía por Usb.
Lo datos que envía son estos:
chr(255) startbyte
chr(1) slave id
chr(1) output
chr(crc) a crc8 of slave id and output
Me gustaría poder leer estos datos (esencialmente salve id y output), asignarlos a unas variables para después poder… digamos enviarlos a los pine de arduino.
Mi problema es que no se como hacerlo, me he ido leyendo y probando muchos códigos, pero no lo he conseguido
Os agradecería una ayuda.
Gracias de antemano.

no esperes que te vayamos a ayudar haciendote el código ...

que soy una patata programando….

Aprende, no hay otra manera.

entra en el primer post Consejos para hacer un correcto uso de los foros

http://arduino.cc/forum/index.php/topic,71446.0.html

y por

http://arduino.cc/playground/Es/Es

mira mi firma.

ademas, pon el código con el que estes trabajando y que todavia no te funciona

Hola Sergegsx
el código con el que estoy trabajando es
int ledPin = 12;
char* val = "0";

void setup()
{
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
}

void loop(){
if ( Serial.available()>0){

val[0]=Serial.read();
val[1]=Serial.read();
val[2]=Serial.read();
val[3]=Serial.read();
int a = atoi(val);
Serial.println(a);
digitalWrite(12,a);
}
}

pero....

Desde Windows, simplemente leyendo el puerto serie virtual, deberia de ser trivial en cualquier lenguaje, Pascal, C, etc.

Hola, os explico lo que quiero hacer.
Tengo un programa, PyroIgnitionControl_V1.3.1; es un programa para “piromusicales”.
Con este programa se “carga” un motivo musical, se le añaden salidas y tiempos y al iniciar el Show envía, por medio de "PyroTronic.dll" estos datos (esto son relativo a la salida1 del box 1)
chr(255) startbyte
chr(1) slave id
chr(1) output
chr(crc) a crc8 of slave id and output
Lo que querría hacer es recoger estos datos y usarlo para decir a arduino, cuando el box es igual a 1 y output es igual a 1, envía la señal a pin x de arduino1; cuando el box es igual 2 y output es igual a 1, envía la señal a pin x de arduino2.
Creo que así es un poco más claro lo que quiero hacer.
Un saludo

Pues ningun problema !!, lees los datos, y envias las conclusiones a los Arduinos por los diferentes puertos, los Arduinos los leen (en los ejemplos del apartado de comunicaciones se ve como recibe el Arduino) y acabaremos.

Tomas las decisiones con if o switch y tema cerrado!!!

Doy por supuesto que estas usando "PyroTronic.dll" y que utilizando alguna de sus funciones consigues copia de los datos que se estan transmitiendo o estan disponibles.

Jacinto54:
Pues ningun problema !!, lees los datos, y envias las conclusiones a los Arduinos por los diferentes puertos,

es lo que no se hacer... :blush:

Que ilu, con lo que me gusta a mi la pirotecnia. Tengo que decir que llevo polvora en mi sangre, pero literal porque me queme con una carcasa hace muchos años.
Bueno como veo que has empezado con el codigo voy ayudarte un poco, como dice el @SrDongato hay gente que le tiene mucha cara y quiere que le hagan el programa.
Veo que la estructura de la trama es
chr(255) startbyte
chr(1) slave id
chr(1) output
chr(crc) a crc8 of slave id and output

Lo mas importante es controlar el CRC, asi sabemos que el mensaje ha llegado bien y no tiene ningun error.

Mirate el proyecto de jpmzometa, hay muchas cosas que sirven para lo que quieres hacer inclusive el control del checksum.
http://sites.google.com/site/jpmzometa/arduino-mbrt

Te dejo también otro CRC

CRC16_Modbus_Arduino.pde (597 Bytes)

Hola peptro,

Mejor que declares un val con lugar suficiente para la cadena que vayas a meterle (los 4 bytes más el cero final):

char val[5];

val[0]=Serial.read();
val[1]=Serial.read();
val[2]=Serial.read();
val[3]=Serial.read();

// Y al final le pones el carácter 0
val[4]= '\0' ;

int a = atoi(val);

Para peptro

A ver que me aclare, que no sabes hacer???

Usar la DLL? obtener los datos que envia tu programa? enviarlos al Arduino???

Porque no se si te estoy respondiendo a lo que preguntas.

Jacinto54:
Para peptro

A ver que me aclare, que no sabes hacer???

Usar la DLL? obtener los datos que envia tu programa? enviarlos al Arduino???

Porque no se si te estoy respondiendo a lo que preguntas.

Hola Jacint54
Con arduino quiero leer los datos que envia un programa. los dato que envia este programa son
chr(255) startbyte
chr(1) slave id
chr(1) output
chr(crc) a crc8 of slave id and output
y después quiero usarlo usarlo para decir a arduino, cuando el box es igual a 1 y output es igual a 1, envía la señal a pin x de arduino1; cuando el box es igual 2 y output es igual a 1, envía la señal a pin x de arduino2.

debes ..

leer del puerto serrie --> en los ejemplos del IDE puedes ver como se hace

leer 3 bytes a partir del byte que sea igual a 255

hacer varios If con esos datos y segun valga 1 o 0 activar una salida o no

imagino que tendras que hacer alguna cuenta con el ultimo bye CRC para saber si has recibido todo bien.

esto no tiene complicacion

repito, no te vamos a hacer el codigo

Si desde Arduino quieres leer lo que envia el programa, es lo que te dice DonGato, hay ejemplos en el propio IDE, es lo que te comentaba, una serie de IFs o un SWITCH, y adelante, es trivial y no reviste mayor complejidad.

Gracias a todos.
Un saludo

Al final he conseguido solucionar el problema.
Gracias a todos de nuevo.

si no pones como este post no sirve para el futuro.
para que otros puedan beneficiarse del tiempo que emplearon los usuarios en ayudarte a ti, y tu propio tiempo investigandolo, pon como lo solucionaste y así aprendemos todos.
ver mi firma.

Tienes toda la razón, aquí está el código

#define setTempoVd 50
int esclavo;
int salida;
unsigned char rxByte = 0;
unsigned char rxConta = 0;
unsigned char CRC8 = 0;
unsigned char txrxSet =0;
char i = 0;
unsigned long tempoStop=0;
void setup(){
Serial.begin(9600);
}
void loop(){
if (Serial.available() > 0) Decode();
if (txrxSet == 1) if (tempoStop< millis()){
txrxSet = 0;
}
}
void Decode(){
tempoStop= millis() + setTempoVd;
txrxSet = 1;
rxByte= Serial.read();
if (rxByte== 0xFF && rxConta ==0){
CRC8=0;
rxConta++;
}
else if (rxConta == 1){
CRC_8(rxByte);
esclavo = rxByte;
rxConta++;
}
else if (rxConta == 2){
CRC_8(rxByte);
salida = rxByte;
rxConta++;
}
else if (rxConta == 3){
if (CRC8 ==rxByte){
}
rxConta=0;
}
}
void CRC_8(unsigned char b){
for(char i = 0; i < 8; b = b >> 1, i++){
if((b ^ CRC8) & 1) CRC8 = ((CRC8 ^ 0x18) >> 1) | 0x80;
else CRC8 = (CRC8 >> 1) & ~0x80;
}
}

Gracias peptro.