paquetes Xbee que dan valores incorrectos

0

Estoy intentando extraer datos de muestras analógicas de un paquete xbee que están presentes en los bytes 20 y 21. Sin embargo, después de extraerlos en el monitor de serie, el valor de basura que se recibe resulta incorrecto.

Aquí está la salida que recibo en el monitor serie:

Primera columna- lsb Segunda columna - msb El código para extraer datos se ve así:

if(Serial.available()>21){

if(Serial.read==0x7e){

for(int i=1;i<19;i++){

byte discard=Serial.read();
}

int analogMSB=Serial.read();

int analogLSB=Serial.read();

int analogReading=analogLSB+(analogMSB*256);

Cuando calculo lsb + msb * 256 para lo anterior, también recibo valores negativos que no son deseables. Por favor, dígame cómo puedo solucionar este problema.

    
pregunta Vineet Kaushik

2 respuestas

1

Si te quejas de los números negativos, entonces no estás contabilizando correctamente la aritmética firmada en lugar de la no firmada. Asegúrese de convertir todos los valores a int sin signo, e imprímalos como int sin firmar, para cubrir todo el rango de 16 bits.

unsigned int x = (unsigned int)lsb + (unsigned int)msb * 256;
printf("%u\n", x);

También hay algunos otros consejos para la solución de problemas, como "¿estás seguro de que estas son las compensaciones correctas?" y "¿estás seguro de que tienes el orden de bytes correcto", pero comencemos con lo primero que está mal en tu publicación? , primero!

    
respondido por el Jon Watte
0

Veo que estás buscando 0x7E al inicio de un paquete que implica que estás usando el modo API. No ha mencionado el módulo XBee en particular, pero creo que la estructura del paquete es bastante común entre los modelos y aquí hay algunas referencias de la hoja de datos del último módulo que utilicé:

Escapar de caracteres

  

Al enviar o recibir un marco de datos UART, deben escaparse (marcarse) valores de datos específicos para que no interfieran con la secuencia del marco de datos. Para escapar de un byte de datos interferentes, inserte 0x7D y sígalo con el byte que se escapará XOR’d con 0x20.

Bytes de datos que deben escaparse:

  • 0x7E - Delimitador de cuadros
  • 0x7D - Escape
  • 0x11 - XON
  • 0x13 - XOFF

El propósito de esto es que 0x7E solo ocurra como el delimitador de cuadros. Si eso y los otros caracteres mencionados aparecen dentro de los datos, se escaparán, por lo que terminará con dos caracteres en el flujo de datos. Su código actual asume una longitud de paquete fija y ese no será el caso cuando un carácter de escape esté presente en los datos.

Además, su código no se sincronizará bien cuando el paquete no sea de los 21 bytes que espera, por lo que probablemente esté terminando con datos aleatorios donde espera la lectura del ADC.

En mi caso, escribí una máquina de estados que manejaba las cosas un personaje a la vez. Reajusté un búfer cuando se recibió 0x7E y usé varios booleanos para mantener un registro de si el siguiente carácter era uno escapado o no, y usé otras variables para realizar un seguimiento del progreso del paquete y si estaba completo o no.

Mi código era para un procesador diferente y un poco diferente de cómo lo harías en un Arduino, pero podría darte un indicador en la dirección correcta. Además, he encontrado el xbee-arduino y, aunque nunca lo he usado, parece que maneja la API El lado del modo de las cosas para ti.

    
respondido por el PeterJ

Lea otras preguntas en las etiquetas