Formas eficientes de buscar datos de inicio y procesamiento -- performance campo con c camp codereview Relacionados El problema

Efficient ways of looking for start-key and processing data


0
vote

problema

Español

Esta pregunta es un seguimiento de mi Anterior pregunta.

Estoy trabajando con alguna comunicación inalámbrica en Arduino.

979797 es la dirección del transmisor. He escrito el siguiente código para verificar la dirección primero antes de procesar los datos. Mi principal preocupación es la velocidad de la computación.

  void printBuffer(const uint8_t *serialBuffer) {   //print contents of buffer   for (int i = 0; i<100; i++)      Serial.println(serialBuffer[i]); //remove the print in binary option to decode }  void processBytes(const uint8_t value) {    static uint8_t serialBuffer[bufferSize]; //buffer to hold values   static unsigned int startPosition=0;    if(startPosition < bufferSize)   {     serialBuffer[startPosition] = value;      startPosition++;   }    else   {     printBuffer(serialBuffer);     startPosition = 0;   }  }//end of processBytes void loop() {     //check if data is available in serial buffer   while(RX.available())   {     //check for start key     address(RX.read())     //process data     for(int i = 0; i< 68; i++)         processBytes(RX.read());   }    } void address(const uint8_t value) {   int counter = 0;   int newVal = value;   while(value == 97 && counter < 3)   {     counter++;     newVal = RX.read();   } }   

El paquete de datos solo tiene los siguientes componentes: Tecla de inicio (979797) y 68 bytes de datos (carga útil). No hay clave de terminación. Además, el transmisor transmite un byte a la vez. Por lo tanto, cada valor recibido es inferior a 256. Por lo tanto, por lo que estoy guardando los datos en una matriz uint8_t [].

Ejemplo de datos posibles:

  97 97 97 (68 bytes of random positive integers all less than 256) 97 97 97   

Aparte del método address() , la mayor parte de ella fue prestada de gammon < / a>. aquí es la página de referencia de los comandos de Arduino que estoy usando. ¿Hay alguna forma en que puedo optimizar este cálculo?

Original en ingles

This question is a follow up from my previous question.

I am working with some wireless communication in Arduino.

979797 is the address of the transmitter. I have written the following code to check the address first before processing the data. My main concern is speed of computation.

void printBuffer(const uint8_t *serialBuffer) {   //print contents of buffer   for (int i = 0; i<100; i++)      Serial.println(serialBuffer[i]); //remove the print in binary option to decode }  void processBytes(const uint8_t value) {    static uint8_t serialBuffer[bufferSize]; //buffer to hold values   static unsigned int startPosition=0;    if(startPosition < bufferSize)   {     serialBuffer[startPosition] = value;      startPosition++;   }    else   {     printBuffer(serialBuffer);     startPosition = 0;   }  }//end of processBytes void loop() {     //check if data is available in serial buffer   while(RX.available())   {     //check for start key     address(RX.read())     //process data     for(int i = 0; i< 68; i++)         processBytes(RX.read());   }    } void address(const uint8_t value) {   int counter = 0;   int newVal = value;   while(value == 97 && counter < 3)   {     counter++;     newVal = RX.read();   } } 

The data packet just has the following components: start key (979797) and 68 bytes of data(payload). There is no termination key. Also, the transmitter transmits one byte at a time. Thus, each value received is less than 256. Hence why I am saving the data into a uint8_t[] array.

Example of possible data:

97 97 97 (68 bytes of random positive integers all less than 256) 97 97 97 

Other than the address() method, most of it was borrowed from Gammon. Here is the reference page for the arduino commands I am using. Are there ways I can optimize this computation?

     

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

todavía problemático

El código aún tiene los siguientes problemas:

  1. elif x%2 != 0 and y%2 == 0: if z%2 != 0: return '0' elif x%2 == 0 and y%2 != 0: if z%2 != 0: return '0' elif x%2 == 0 and y%2 ==0: if z%2 == 0: return '0' elif x%2 != 0 and y%2 != 0: if z%2 == 0: return '0' 4 está configurado pero no se usa:
  elif x%2 != 0 and y%2 == 0:         if z%2 != 0:                 return '0' elif x%2 == 0 and y%2 != 0:         if z%2 != 0:                 return '0' elif x%2 == 0 and y%2 ==0:         if z%2 == 0:                 return '0' elif x%2 != 0 and y%2 != 0:         if z%2 == 0:                 return '0' 5  

debe ser:

  elif x%2 != 0 and y%2 == 0:         if z%2 != 0:                 return '0' elif x%2 == 0 and y%2 != 0:         if z%2 != 0:                 return '0' elif x%2 == 0 and y%2 ==0:         if z%2 == 0:                 return '0' elif x%2 != 0 and y%2 != 0:         if z%2 == 0:                 return '0' 6  
  1. Suponiendo que el flujo de byte sigue el protocolo, 99887776655443317 se comerá el primer byte del mensaje. En otras palabras, el byte siguiendo el encabezado elif x%2 != 0 and y%2 == 0: if z%2 != 0: return '0' elif x%2 == 0 and y%2 != 0: if z%2 != 0: return '0' elif x%2 == 0 and y%2 ==0: if z%2 == 0: return '0' elif x%2 != 0 and y%2 != 0: if z%2 == 0: return '0' 8 se desechará. Esto, a su vez, hará que el procesador de mensajes coma un byte de la siguiente sección de dirección.

  2. No hay un mecanismo de recuperación para si el flujo de byte se detiene después del protocolo. La función elif x%2 != 0 and y%2 == 0: if z%2 != 0: return '0' elif x%2 == 0 and y%2 != 0: if z%2 != 0: return '0' elif x%2 == 0 and y%2 ==0: if z%2 == 0: return '0' elif x%2 != 0 and y%2 != 0: if z%2 == 0: return '0' 9 no busca un encabezado, simplemente regresa en ausencia de un encabezado.

Reescribe

Sugiero esta reescritura:

  elif (x + y + z) % 2 == 0:     return '0' 0  
 

Still problematic

The code still has the following issues:

  1. newVal is set but not used:
    while(value == 97 && counter < 3) 

should be:

    while(newVal == 97 && counter < 3) 
  1. Assuming the byte stream follows the protocol, address() will eat the first byte of the message. In other words, the byte following the 97 97 97 header will be discarded. This will in turn cause the message processor to eat one byte of the next address section.

  2. There is no recovery mechanism for if the byte stream stops following the protocol. The address() function doesn't look for a header, it just returns in the absence of a header.

Rewrite

I suggest this rewrite:

void loop(void) {         // Check if data is available in serial buffer     while (RX.available()) {         // Search for start key         FindStartKey();         // Process data         for(int i = 0; i < 68; i++)             processBytes(RX.read());     }    }  void FindStartKey(void) {     int counter = 0;      do {         if (RX.read() == 97)             counter++;         else             counter = 0;     } while (counter < 3); } 
 
 

Relacionados problema

14  Representación de OpenGL ACTUPTAR  ( Opengl instanced rendering ) 
Tengo una configuración de representación muy básica de OpenGL ANDRANCT, que está compilando y funcionando, sin embargo, es super lento, y aunque pasé días de...

2  Mejora de la función que compara dos cadenas  ( Improving function that compares two strings ) 
Estoy aprendiendo C y he hecho esta función muy simple para comparar dos cuerdas. Me gustaría saber cómo se puede mejorar: int match(char* string1, char* s...

1  Imprima todos los tamaños posibles de subsecuencias de cadena en C  ( Print out all possible sizes of subsequences of string in c ) 
Por ejemplo, dada una cadena "abcdefghijk", quiero que mi función se imprima: a, b, c, d, e, f, g, h, i, j, k. ab, bc, cd, de, ef, fg, gh, hi, ij, jk ab...

4  Juego de Runas: Versión 3  ( Game of runes version 3 ) 
He escrito una versión muy revisada y desarrollada de la juego de runas . Los cambios principales se enumeran: Convertir runas para usar maldiciones. ag...

6  Palindrome más largo en una matriz  ( Longest palindrome in an array ) 
Soy nuevo en la programación, y creo que este código podría mejorarse. ¿Alguna sugerencia? 'done'0 ...

12  Codificación de árbol binario  ( Binary tree encoding ) 
Implementé una solución a este desafío de codificación en el código de golf. Tengo experiencia decente con C / C ++, pero ha sido un tiempo desde que los us...

5  Cola de bloqueo con la exactitud de la lista doblemente vinculada  ( Lock free queue with doubly linked list correctness ) 
Necesito una cola de bloqueo que se implementa mediante la lista doblemente vinculada. es mi código correcto? ¿Hay algún error? ¿Hay alguna mejoras a realiz...

38  Sundoku Solver en C  ( Sudoku solver in c ) 
Tuve este código que miente, así que pensé que sometería esto como mi primer intento de una Fin de semana: desafío . Preferiría si las revisiones contenían s...

2  Función para borrar un carácter en una cadena  ( Function to erase a character in a string ) 
void chrrem (char arr[], size_t len, size_t pos) { memmove(arr + pos, arr + (pos + 1), (len - pos) + 1); } Se supone que es simplemente rápido. Borra...

4  C Socket Parte-1  ( C socket part 1 ) 
En mis intentos en curso de convertirse en un mejor escritor de blog, tengo algunos códigos más que necesitan revisar. Fuente completa: https://github.com/...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos