Plot dati provenienti da dsPIC

di il
5 risposte

Plot dati provenienti da dsPIC

Buon pomeriggio a tutti voi, vorrei chiedervi aiuto per il seguente problema:
Ho scritto un programma su dsPIC Microchip e adesso voglio eseguire il plot di alcune variabili, allo scopo mi sono scritto del codice per inviare i dati sulla seriale già convertiti in codice ASCI. Tali dati vengono correttamente inviati e visualizzati su Real Term, dove posso anche salvarli su un file .text da elaborare in seguito con matlab, pero' vorrei fare qualcosa di più 'serio' quindi avere un plot con Matlab in modo continuo allo scorrere del tempo.
Per fare questo ho letto diversi post presenti sul forum riguardanti l'impostazione della seriale con Matlab pero' quando provo ad eseguire l'istruzione fopen(s) Matlab si chiude, avete idea di quale potrebbe esser il problema?
Grazie a chiunque voglia aiutarmi un saluto

5 Risposte

  • Re: Plot dati provenienti da dsPIC

    Aggiornamento: Adesso sono riuscito ad aprire la seriale (non so' perchè prima non riuscissi) ma non ho idea di come procedere per un plotting in real time.
  • Re: Plot dati provenienti da dsPIC

    Qual è il problema? Acquisire i dati o plottarli?

    [*] Hai provato ad usare fscanf? https://uk.mathworks.com/matlabcentral/answers/64765-fscanf-question-with-arduino
    [*] hai settato hold on?

    Dovresti pubblicare il codice che hai scritto; diversamente è difficile immaginare quale possa essere il problema.
  • Re: Plot dati provenienti da dsPIC

    Ciao ask_raf allora attualmente riesco a comunicare con la seriale, nel senso che vedo che quando la interrogo con fscanf questa mi ritorna valori diversi ad ogni chiamata. Ma per fare il plot dei dati ottenuti dalla seriale devo prima riconvertirli in interi o float visto che arrivano come stringhe dal mio dspic?
  • Re: Plot dati provenienti da dsPIC

    Allora il banale codice scritto è il seguente:

    s=serial('COM3');
    set(s,'BaudRate',9600);
    fopen(s);
    for i=1:1:1000
    dati(i)=fscanf(s,'%d');
    end

    Succede che a volte il for lo finisce tutto e mi carica il vettore dati, se lo lancio in un altro momento
    capita che si puo' bloccare prima di averlo caricato tutto. Insospettito da questo comportamento sono
    andato a raccogliere i campioni in un file .txt attraverso RealTerm scoprendo che effettivamente ogni tot campioni
    scrive una schifezza (tipo j4), e quindi giustamente Matlab mi da' un errore di non corrispondenza tra quello che si aspetta in
    dati(i) e quello che gli arriva. Come si puo' ovviare o meglio scartare queste acquisizioni errate che non permettono al vettore dati di
    caricarsi completamente?
  • Re: Plot dati provenienti da dsPIC

    Non ho modo di verificare se funzioni, ma potresti provare a:
    - leggere i dati come "stringhe" di caratteri
    - provare a convertirli in "numeri" con la funzione "str2num"
    - se la stringa non contiene un dato numerico "valido" (es. 'j4' come hai scritto nella domanda), "str2num" ritorna un array vuoto ([])
    - potresti quindi verificare l'output di "str2num": se l valore non è un array vuoto, inserisci il valore nel vettore "dati"

    Qualcosa del tipo:
    
    % Inizializzazione del vettore di output
    cnt=0;
    % Loop di acquisizione dati
    for i=1:1:1000
       % Lettura dei dati come "stringa di caratteri"
       tmp=fscanf(s,'%s');
       % Tentativo di convesione in valore numerico"
       n_tmp=srt2num(tmp);
       % Verifica del valore convertito
       if(~isempty(n_tmp))
          % Incremento del contatore
          cnt=cnt+1;
          % Inserimento del valore numerico nel vettore di output
          dati(cnt)=n_tmp
       else
          % Stampa nella CommandWindow un messagio quando viene letto un valore
          % non valido
          disp(['Il valore ' tmp ' letto nella iterazione # ' num2str(i) ' non è valido'])
       end
    end
    
    Volendo, quando viene letto un dato "non valido", potresti anche inserire nel vettore "dati" "NaN" o un valore particolare (es. -999) in modo da tracciare questi casi.
    
    % Definizione del valore rappresentativo dei dati non validi
    % not_a_number=-999;
    not_a_number=NaN;
    % Loop di acquisizione dati
    for i=1:1:1000
       % Lettura dei dati come "stringa di caratteri"
       tmp=fscanf(s,'%s');
       % Tentativo di convesione in valore numerico"
       n_tmp=srt2num(tmp);
       % Verifica del valore convertito
       if(~isempty(n_tmp))
          % Inserimento del valore numerico nel vettore di output
          dati(i)=n_tmp
       else
          % Stampa nella CommandWindow un messagio quando viene letto un valore
          % non valido
          disp(['Il valore ' tmp ' letto nella iterazione # ' num2str(i) ' non è valido'])
          % Inserimento di un valore "particolare" nel varrore di output
          dati(i)=not_a_number
       end
    end
    
    Un'alternativa, potrebbe essere quella di utilizzare "try - catch" per intercettare l'errore ed agire di conseguenza.
Devi accedere o registrarti per scrivere nel forum
5 risposte