Advertisement
raffaelegriecoit
Nov 20th, 2024
26
0
Never
This is comment for paste FRANCO
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 1. Verifica dei dati grezzi ricevuti
  2. Aggiungi un debug per stampare una parte dei dati grezzi ricevuti. Modifica il codice nella parte principale del ciclo:
  3.  
  4. matlab
  5. Copia codice
  6. if dataPort.NumBytesAvailable > 0
  7. % Leggi i dati dal radar
  8. rawData = read(dataPort, dataPort.NumBytesAvailable, 'uint8');
  9.  
  10. % Debug: stampa i primi byte dei dati grezzi
  11. disp("Dati grezzi ricevuti (primi 20 byte):");
  12. disp(rawData(1:min(20, end))); % Mostra solo i primi 20 byte
  13.  
  14. % Parsing dei dati
  15. parsedData = parseRadarData(rawData);
  16.  
  17. % Visualizzazione dati
  18. visualizeRadarData(parsedData);
  19. end
  20. 2. Conferma della parola magica
  21. 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:
  22.  
  23. matlab
  24. Copia codice
  25. magicWord = [2 1 4 3 6 5 8 7]; % Modifica questo valore se differente
  26. 3. Bufferizzazione dei dati
  27. 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:
  28.  
  29. Implementazione del buffer
  30. Modifica il ciclo principale per accumulare i dati grezzi in un buffer:
  31.  
  32. matlab
  33. Copia codice
  34. % Buffer per accumulare dati grezzi
  35. buffer = uint8([]);
  36.  
  37. while true
  38. if dataPort.NumBytesAvailable > 0
  39. % Leggi i nuovi dati e aggiungili al buffer
  40. newRawData = read(dataPort, dataPort.NumBytesAvailable, 'uint8');
  41. buffer = [buffer; newRawData];
  42.  
  43. % Mantieni solo gli ultimi 8192 byte (ad esempio, per evitare overflow)
  44. if length(buffer) > 8192
  45. buffer = buffer(end-8191:end);
  46. end
  47.  
  48. % Debug: stampa la lunghezza del buffer
  49. disp("Lunghezza buffer:");
  50. disp(length(buffer));
  51.  
  52. % Parsing dei dati
  53. parsedData = parseRadarData(buffer);
  54.  
  55. % Visualizzazione dati
  56. visualizeRadarData(parsedData);
  57. end
  58. pause(0.05); % Per evitare sovraccarichi di CPU
  59. end
  60. 4. Sincronizzazione della parola magica
  61. Aggiorna la funzione parseRadarData per gestire il buffer correttamente:
  62.  
  63. matlab
  64. Copia codice
  65. function parsedData = parseRadarData(rawData)
  66. % Definisci la struttura dei dati parsati
  67. parsedData = struct('x', [], 'y', [], 'z', [], 'velocity', []);
  68.  
  69. % Definisci la parola magica per sincronizzare i pacchetti
  70. magicWord = [2 1 4 3 6 5 8 7];
  71. magicWordBytes = length(magicWord);
  72.  
  73. % Cerca la parola magica nei dati grezzi
  74. startIdx = [];
  75. for i = 1:(length(rawData) - magicWordBytes + 1)
  76. if all(rawData(i:i+magicWordBytes-1) == magicWord)
  77. startIdx = i;
  78. break;
  79. end
  80. end
  81.  
  82. % Se la parola magica non viene trovata, esci dalla funzione
  83. if isempty(startIdx)
  84. disp("Parola magica non trovata.");
  85. return;
  86. end
  87.  
  88. % Estrai l'header del frame
  89. frameHeaderLength = 40; % Lunghezza dell'header del frame in byte
  90. if startIdx + magicWordBytes + frameHeaderLength > length(rawData)
  91. warning('Dati insufficienti per l\'header del frame.');
  92. return;
  93. end
  94. frameHeader = rawData(startIdx + magicWordBytes : startIdx + magicWordBytes + frameHeaderLength - 1);
  95.  
  96. % Estrai il numero di TLV nel frame
  97. numTLVs = typecast(uint8(frameHeader(35:38)), 'uint32');
  98.  
  99. % Imposta il puntatore all'inizio dei TLV
  100. pointer = startIdx + magicWordBytes + frameHeaderLength;
  101.  
  102. % Processa ciascun TLV
  103. for tlvIdx = 1:numTLVs
  104. % Verifica che ci siano abbastanza dati per il TLV
  105. if pointer + 8 > length(rawData)
  106. warning('Dati insufficienti per l\'header del TLV.');
  107. return;
  108. end
  109.  
  110. % Leggi l'header del TLV
  111. tlvType = typecast(uint8(rawData(pointer:pointer+3)), 'uint32');
  112. tlvLength = typecast(uint8(rawData(pointer+4:pointer+7)), 'uint32');
  113. pointer = pointer + 8; % Salta l'header del TLV
  114.  
  115. if pointer + tlvLength > length(rawData)
  116. warning('Dati insufficienti per il TLV.');
  117. return;
  118. end
  119.  
  120. % Processa il TLV in base al tipo
  121. switch tlvType
  122. case 1 % Punti rilevati
  123. % Numero di punti rilevati
  124. numDetectedPoints = (tlvLength - 8) / 16; % 16 byte per punto
  125. if numDetectedPoints > 0
  126. % Estrai i dati dei punti
  127. pointData = rawData(pointer:pointer + numDetectedPoints * 16 - 1);
  128. pointData = typecast(uint8(pointData), 'single');
  129. pointData = reshape(pointData, [4, numDetectedPoints]);
  130.  
  131. % Assegna i dati parsati alla struttura
  132. parsedData.x = pointData(1, :);
  133. parsedData.y = pointData(2, :);
  134. parsedData.z = pointData(3, :);
  135. parsedData.velocity = pointData(4, :);
  136. end
  137. % Aggiungi altri casi per altri tipi di TLV se necessario
  138. otherwise
  139. % TLV non supportato
  140. warning('Tipo di TLV non supportato: %d', tlvType);
  141. end
  142.  
  143. % Aggiorna il puntatore alla fine del TLV corrente
  144. pointer = pointer + tlvLength - 8; % Sottrai 8 byte dell'header del TLV
  145. end
  146. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement