Advertisement
This is comment for paste
FRANCO
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 1. Verifica dei dati grezzi ricevuti
- Aggiungi un debug per stampare una parte dei dati grezzi ricevuti. Modifica il codice nella parte principale del ciclo:
- matlab
- Copia codice
- if dataPort.NumBytesAvailable > 0
- % Leggi i dati dal radar
- rawData = read(dataPort, dataPort.NumBytesAvailable, 'uint8');
- % Debug: stampa i primi byte dei dati grezzi
- disp("Dati grezzi ricevuti (primi 20 byte):");
- disp(rawData(1:min(20, end))); % Mostra solo i primi 20 byte
- % Parsing dei dati
- parsedData = parseRadarData(rawData);
- % Visualizzazione dati
- visualizeRadarData(parsedData);
- end
- 2. Conferma della parola magica
- La parola magica predefinita è [2 1 4 3 6 5 8 7], ma potrebbe differire. Consulta la documentazione del radar (ad esempio, per IWR6843AOP) per verificare il valore corretto. Se necessario, aggiorna la definizione della parola magica:
- matlab
- Copia codice
- magicWord = [2 1 4 3 6 5 8 7]; % Modifica questo valore se differente
- 3. Bufferizzazione dei dati
- I dati ricevuti dalla porta seriale potrebbero arrivare in pacchetti spezzati, il che significa che la parola magica potrebbe non essere presente all'inizio di ogni pacchetto. Usa un buffer per accumulare i dati:
- Implementazione del buffer
- Modifica il ciclo principale per accumulare i dati grezzi in un buffer:
- matlab
- Copia codice
- % Buffer per accumulare dati grezzi
- buffer = uint8([]);
- while true
- if dataPort.NumBytesAvailable > 0
- % Leggi i nuovi dati e aggiungili al buffer
- newRawData = read(dataPort, dataPort.NumBytesAvailable, 'uint8');
- buffer = [buffer; newRawData];
- % Mantieni solo gli ultimi 8192 byte (ad esempio, per evitare overflow)
- if length(buffer) > 8192
- buffer = buffer(end-8191:end);
- end
- % Debug: stampa la lunghezza del buffer
- disp("Lunghezza buffer:");
- disp(length(buffer));
- % Parsing dei dati
- parsedData = parseRadarData(buffer);
- % Visualizzazione dati
- visualizeRadarData(parsedData);
- end
- pause(0.05); % Per evitare sovraccarichi di CPU
- end
- 4. Sincronizzazione della parola magica
- Aggiorna la funzione parseRadarData per gestire il buffer correttamente:
- matlab
- Copia codice
- function parsedData = parseRadarData(rawData)
- % Definisci la struttura dei dati parsati
- parsedData = struct('x', [], 'y', [], 'z', [], 'velocity', []);
- % Definisci la parola magica per sincronizzare i pacchetti
- magicWord = [2 1 4 3 6 5 8 7];
- magicWordBytes = length(magicWord);
- % Cerca la parola magica nei dati grezzi
- startIdx = [];
- for i = 1:(length(rawData) - magicWordBytes + 1)
- if all(rawData(i:i+magicWordBytes-1) == magicWord)
- startIdx = i;
- break;
- end
- end
- % Se la parola magica non viene trovata, esci dalla funzione
- if isempty(startIdx)
- disp("Parola magica non trovata.");
- return;
- end
- % Estrai l'header del frame
- frameHeaderLength = 40; % Lunghezza dell'header del frame in byte
- if startIdx + magicWordBytes + frameHeaderLength > length(rawData)
- warning('Dati insufficienti per l\'header del frame.');
- return;
- end
- frameHeader = rawData(startIdx + magicWordBytes : startIdx + magicWordBytes + frameHeaderLength - 1);
- % Estrai il numero di TLV nel frame
- numTLVs = typecast(uint8(frameHeader(35:38)), 'uint32');
- % Imposta il puntatore all'inizio dei TLV
- pointer = startIdx + magicWordBytes + frameHeaderLength;
- % Processa ciascun TLV
- for tlvIdx = 1:numTLVs
- % Verifica che ci siano abbastanza dati per il TLV
- if pointer + 8 > length(rawData)
- warning('Dati insufficienti per l\'header del TLV.');
- return;
- end
- % Leggi l'header del TLV
- tlvType = typecast(uint8(rawData(pointer:pointer+3)), 'uint32');
- tlvLength = typecast(uint8(rawData(pointer+4:pointer+7)), 'uint32');
- pointer = pointer + 8; % Salta l'header del TLV
- if pointer + tlvLength > length(rawData)
- warning('Dati insufficienti per il TLV.');
- return;
- end
- % Processa il TLV in base al tipo
- switch tlvType
- case 1 % Punti rilevati
- % Numero di punti rilevati
- numDetectedPoints = (tlvLength - 8) / 16; % 16 byte per punto
- if numDetectedPoints > 0
- % Estrai i dati dei punti
- pointData = rawData(pointer:pointer + numDetectedPoints * 16 - 1);
- pointData = typecast(uint8(pointData), 'single');
- pointData = reshape(pointData, [4, numDetectedPoints]);
- % Assegna i dati parsati alla struttura
- parsedData.x = pointData(1, :);
- parsedData.y = pointData(2, :);
- parsedData.z = pointData(3, :);
- parsedData.velocity = pointData(4, :);
- end
- % Aggiungi altri casi per altri tipi di TLV se necessario
- otherwise
- % TLV non supportato
- warning('Tipo di TLV non supportato: %d', tlvType);
- end
- % Aggiorna il puntatore alla fine del TLV corrente
- pointer = pointer + tlvLength - 8; % Sottrai 8 byte dell'header del TLV
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement