La lectura desde UART parece sobrescribirse mientras está en el búfer

0

Estoy leyendo el envío de datos a un PIC32MX7xx usando UART. Los marcos de datos tienen 6 bytes de longitud, sin excepción.

El problema al que me estoy enfrentando es que cuando hay 6 bytes en espera de lectura y envío otros 6 bytes demasiado rápido, el PIC se bloquea.

Estoy leyendo los bytes en paquetes de 6 y los estoy escribiendo en un búfer para colocarlos en una red CAN (pero eso no es importante).

typedef struct {
    WORD id;
    DWORD data;
} WiFiRXPacket;

BYTE *WiFiRXTemp = NULL;
WiFiRXPacket* WiFiRXBuffer = NULL;
int RXelements = 0;                         
int RXallocated = 0; 

void TCPReceiving()
{
    int dataAmount = 0;
    int i = 0;
    int j = 0;
    dataAmount = DataRdyUART1();

    if(dataAmount != 0)
    {
        WiFiRXTemp = (BYTE *) malloc(6 * sizeof(BYTE));
        if(WiFiRXTemp)
        {

            while(i<6)
            {
                WiFiRXTemp[i] = getcUART1();
                i++;
            }

            WiFiRXPacket packet;
            packet.id = ((WORD)WiFiRXTemp[j]) << 8;
            packet.id += ((WORD)WiFiRXTemp[j + 1]);

            if (packet.id != 0)
            {
                packet.data = ((DWORD)WiFiRXTemp[j + 2]) << 24;
                packet.data += ((DWORD)WiFiRXTemp[j + 3]) << 16;
                packet.data += ((DWORD)WiFiRXTemp[j + 4]) << 8;
                packet.data += ((DWORD)WiFiRXTemp[j + 5]);

                PutInTXBuffer(packet.id, (QWORD)packet.data);   // Send the received command back for confirmation
            }
        }
    }
    free(WiFiRXTemp);                   // Deallocate the buffers memory
    WiFiRXTemp = NULL;                  // Re-initialize the buffer
}

¿Alguien tiene una idea de por qué sucede esto?

    
pregunta Delusion

2 respuestas

2

Lo más probable es que su búfer FIFO en su UART esté simplemente lleno (solo tiene 8 niveles de profundidad). La sección 21.7.2 del Manual de referencia de la familia PIC32 dice:

  

Si el FIFO está lleno y se recibe un nuevo carácter en el   Se establece el registro UxRSR, el bit de error de saturación, OERR (UxSTA < 1 >). los   palabra en el registro UxRSR no se mantiene, y las transferencias posteriores a la   Los FIFO de recepción se inhiben siempre que se establezca el bit OERR. El usuario   debe borrar el bit OERR en el software para permitir que se realicen más datos   recibido.

Por qué esto podría causar que el PIC se "bloquee" es difícil de decir a partir de la información que ha proporcionado. Tal vez entra en un controlador de interrupción que no está correctamente definido.

    
respondido por el fm_andreas
0

Similar a lo que decía @fm_andreas, podría ser su FIFO y que su búfer está simplemente lleno. No estoy seguro de lo que significa "bloquear", pero tuve una instancia similar en la que estaba enviando demasiados datos demasiado rápido con un FIFO de 4 niveles.

Quizás pueda devolver un comando al host diciendo "Ya he terminado", lo que indica que ha procesado todos los datos en el búfer, o simplemente puede agregar un retraso antes de transmitir más datos. Dependiendo de su velocidad en baudios, puede calcular cuánto tiempo se tarda en transmitir todos los bits, y posiblemente agregar un poco más de retraso para tener en cuenta la sobrecarga requerida para leer y borrar el búfer.

    
respondido por el efox29

Lea otras preguntas en las etiquetas