Recibir una cadena a través de Xbee en modo API

1

En mi pregunta anterior en este enlace , hice una pregunta sobre cómo usar minicom en linux para comunicarse entre dos Xbee's in API mode y obtuve la respuesta. Mientras intenté lo mismo con XCTU en Windows un lado y AVR + Xbee en el otro lado, pude comunicarme entre 2 Xbee .

En el lado de AVR, había escrito este código para recibir el char y almacenarlo en una cadena.

#include <yuktix.h>
#include <debug.h>
#include <uart2560.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <debug.h>

/*for sensor readings*/
#include <AVRI2C.h>
#include <spi.h>

//char Id;
//char cmd;
static char ch;
static char *frame;
static uint8_t index = 0;
int main(){

    init_processor();
    uart_init(0,B9600);
    uart_init(1,B9600);
    uart_init(2,B9600);

    for(int j = 0; j < 1000 ; j++)
        _delay_ms(1);

    uart_puts(0, " \r \nstarting Xbee Test \r \n");

    while(1){

    while(uart_available(2) > 0){
        KDEBUG("Inside uart_available");
        KDEBUG("\n");
        ch = uart_getc(2);
        uart_putc(0,ch);
        KDEBUG("Saving it in frame \n");
        *frame++ = ch;
        KDEBUG("saved in frame \n");
        //if(ch == '\');
        }
        KDEBUG("COming out of While loop");
       *frame = '
#include <yuktix.h>
#include <debug.h>
#include <uart2560.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <debug.h>

/*for sensor readings*/
#include <AVRI2C.h>
#include <spi.h>

//char Id;
//char cmd;
static char ch;
static char *frame;
static uint8_t index = 0;
int main(){

    init_processor();
    uart_init(0,B9600);
    uart_init(1,B9600);
    uart_init(2,B9600);

    for(int j = 0; j < 1000 ; j++)
        _delay_ms(1);

    uart_puts(0, " \r \nstarting Xbee Test \r \n");

    while(1){

    while(uart_available(2) > 0){
        KDEBUG("Inside uart_available");
        KDEBUG("\n");
        ch = uart_getc(2);
        uart_putc(0,ch);
        KDEBUG("Saving it in frame \n");
        *frame++ = ch;
        KDEBUG("saved in frame \n");
        //if(ch == '\');
        }
        KDEBUG("COming out of While loop");
       *frame = '%pre%'; 
        KDEBUG(frame);


   }
}
'; KDEBUG(frame); } }

Según mi respuesta a la última pregunta, recibo un char en el lado AVR. Como cada fotograma del modo API XBEE comienza con 7E , donde 7E es equivalente a ~ , lo estoy recibiendo, pero algunos de los caracteres eran ilegibles y los datos que envío en el marco API son totalmente legibles. Mi pregunta es

  1. ¿Cómo puedo almacenar el marco de API recibido en una cadena ya que mi código no parece funcionar?
  2. ¿Debería convertir la cadena en HEX a través de algún código binary_to_hex y luego analizarla, ya que necesito saber de qué dirección provienen estos datos, qué tipo de trama es, cuál es el número de bytes en el marco, de modo que después de excluir la dirección de origen, puedo sacar los datos.
  3. me estoy perdiendo algo. Los datos en el lado AVR siempre estarán en binario, pero ¿cómo puedo procesar los datos?
pregunta srj0408

1 respuesta

1

1) Debe inicializar frame como matriz y su longitud es la longitud máxima de trama que puede recibir. Ahora solo está haciendo un puntero que apunta a un lugar y luego escribe en bytes después de eso en la RAM y puede causar errores. ¡Si no viste errores solo tienes suerte!

2) Números es que los números 1 es lo mismo que (0b00000001) en binario que lo mismo que (0x01) en hexadecimal. Solo necesitas comparar como quieras. Por ejemplo, para comparar el byte de inicio, puede hacer una de las siguientes acciones:

if(frame[0] == 0x7E){
    // Here you are comparing with Hexadicimal
}

if(frame[0] == 126){
    // Here you are comparing with Decimal
}

if(frame[0] == 0b01111110){
    // Here you are comparing with Binary
}

Tenga en cuenta que cualquier condición de lo anterior tiene el mismo código de máquina en AVR. Usted solo representa el número para usted.

También tengo algunas notas sobre ese código:

1) ¿Por qué agrega la palabra clave static a ch , *frame , index ? No tiene ningún significado aquí.

2) Para frame es mejor ser unsigend char o uint8_t , ya que char solo es signed . intialize como array como uint8_t frame[10];

    
respondido por el Nasr

Lea otras preguntas en las etiquetas