Pages: 1 [2]   Go Down
Author Topic: Como separar int o long en bytes  (Read 5034 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 1
Posts: 48
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola Juantreras, intenta probar con el siguiente código en el emisor:
Code:
unsigned int micontadorpulsos=1550;   //la variable que aumento cada vez que recibo un pulso nuevo
byte byte_bajo;
byte byte_alto;
void setup() {

  Serial.begin(9600);
}

void loop(){
  byte_bajo=micontadorpulsos & 255;
  byte_alto=(micontadorpulsos >> 8 ) & 255;
 
  Serial.print('S', BYTE);
  Serial.print(byte_bajo,BYTE);
  Serial.print(byte_alto,BYTE);
  Serial.print('F', BYTE);
  delay (2000);
}

Y el siguiente en el lado del receptor:
Code:
byte byte_bajo;
byte byte_alto;
unsigned int contadorPulsos;

void setup() {
  Serial.begin(9600);
}

void loop() {
  //Compruebo si han llegado datos por el puerto serie
  if (Serial.available() > 0) {
    //Si el dato que ha llegado es S significa que comienza la transmisión
    //del contador de pulsos.
    if (Serial.read() == 'S') {
      byte_bajo = Serial.read(); //Leo el byte_bajo del puerto serie
      byte_alto = Serial.read(); //Leo el byte_alto del puerto serie
      contadorPulsos = ((byte_alto << 8) && (byte_bajo)); //Junto todo en una variable
      Serial.read(); //Como el protocolo envia una F la leo y en este caso la
                      //desecho porque no la necesito para nada
    }
  }
}

En este caso las tramas se envían con un protocolo como ha dicho Igor_R que es Sbyte_bajobyte_altoF.

Espero que te pueda ayudar.

Saludos chato_sat

Logged

0
Offline Offline
Edison Member
*
Karma: 16
Posts: 1579
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo unico que:
contadorPulsos = ((byte_alto << 8 ) && (byte_bajo));
deberia ser una OR, no una AND. Y de operaciones bitwise => http://arduino.cc/en/Reference/BitwiseAnd  (quieres sumar la parte alta a la baja).
&& devuelve true or false (es una operacion logica que devuelve boolean). Es diferente "&" que "&&".
Y es bueno comprobar que llegaba una F a lo ultimo ( para eso te "curras" el protocolo... smiley-wink ) y asi validar que puedes "confiar" que has recibido bien los datos.



 smiley-grin

« Last Edit: February 14, 2011, 04:20:49 am by Igor R » Logged


0
Offline Offline
Full Member
***
Karma: 0
Posts: 200
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Para el caso de leer o escribir en EEPROM busca las funciones:
http://www.arduino.cc/playground/Code/EEPROMWriteAnything

No se por que no están "de serie" en arduino.
Logged

Madrid
Offline Offline
Newbie
*
Karma: 1
Posts: 22
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bueno chicos ,primero un saludo para todos,disculpar la tardanza en contestar, he estado muy liado.Bueno al lío ,efectivamente, Igor, el código funciono perfectamente pero no con && si no con | como decías , además el implementar ese sencillo protocolo da un control "total" sobre el flujo de datos, me ha venido de perlas para otra parte del proyecto que se dedica a recopilar datos y que no acababa de ir como debiera, así es que ha sido un "math" en toda regla.
Bien ahora , ya solo por culturilla general ¿que diferencia hay entre esta expresión? :RPM = ( Wire.receive()<<8) +Wire.receive(); y esta otra: RPM = ((byte_alto << 8) | (byte_bajo)); por supuesto a parte de que una es usada en comunicación I2c y la otra en Serial.
Gracias a todos
 

Logged

Offline Offline
Edison Member
*
Karma: 23
Posts: 1375
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

mmm, ninguna smiley-cool
Logged

Mercadillo electrónico. Kit iniciación a Arduino, shield LCD a color y más cosas!

Venezuela
Offline Offline
Full Member
***
Karma: 0
Posts: 124
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola buenos me remiti a este post por otr de can bus y que iso referencia el colega igor bueno en fin paso a decirle que he notado todo un algoritmo matemadico para separar byte pero nose si fue que lo olvidaron o no lo han visto o usado nunca pero existen los comando lowByte() y highByte().

en la referencia hay informacion necesaria para esto ahora lo explico a mi manera ejemplo se tiene una variable word como ya he visto en sus ejemplo;
word dato=0x45f2;

para separar esa variable de 16 bit basta con usar los comando que les mensiones es decir:
Para el byte alto se usa highByte(dato) y para el bajo lowByte(dato)
de manera ejemplo:
byte alto=0;
byte bajo=0;
 entonce;

alto=highByte(dato);
bajo=lowByte(dato);
donde alto=0x45 y bajo=0xf2

caso contario si se quiere unir dos byte se usa los mismo comando pero de esta manera;
highByte(dato)=0x45; y lowByte(dato)=0xf2;
ya  con eso la variable dato ahora toma el valor 0x45f2.

Saludos y espero haberme hecho entender.
Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 53
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola, una forma sencilla es apuntar el dato (da igual que sea int, long, etc.) por un puntero a byte (o a char, que en el fondo, es lo mismo):

// Dato almacenado en un int.
int iDato = 5494;   //  (por ejemplo.....)

// Puntero a char (o a byte), para manejar el dato recibido, byte a byte.
char *pDato = (char *) &iDato;

// Ahora, cada uno de los bytes lo puedes leer así:
// Sin olvidarse que el int mide solo dos bytes.

byte Byte_01 =  pDato[0];

byte Byte_02 =  pDato[1];


// Esto es asi porque el puntero a char apunta a datos de un byte de longitud.


« Last Edit: August 16, 2011, 04:53:31 am by Valen » Logged

Pages: 1 [2]   Go Up
Jump to: