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.