Sari la conținut
ELFORUM - Forumul electronistilor

Prelucrare date achizitionate


Mircea

Postări Recomandate

Salut, am nevoie, va rog, de un pic de ajutor. Nu e un proiect pe bani, pur si simplu vreau sa ajut pe cineva sa faca o masuratoare pe o perioada de 24h.

Am facut un circuit care citeste 3 valori de tensiuni si le inregistreaza pe un card SD (format FAT32).

 

Asa arata felul in care le salvez in fisierul TXT:

Xax;  Yax;  Zax;  EOL;   4 928;   4 939;   5 905;  EOL;   4 927;   4 939;   5 907;  EOL;   4 

928;   4 939;   5 906;  EOL;   4 929;   4 939;   5 906;  EOL;   4 928;   4 939;   5 906;  EOL;  

 4 930;   4 939;   5 906;  EOL;   4 929;   4 939;   5 908;  EOL;   4 936;   4 939;   5 907;  

EOL;   4 929;   4 938;   5 906;  EOL;   4 927;   4 939;   5 908;  EOL;   4 928;   4 939;   5 

905;  EOL;   4 931;   4 939;   5 908;  EOL;   4 929;   4 939;   5 908;  EOL;     

 

Eu as vrea sa le am aranjate asa, ca apoi sa fac un import CSV (o sa fac un macro probabil) cat sa le pun frumos in Excel si sa fac alte calcule cu ele.

Xax;  Yax;  Zax;  EOL;   
4 927;   4 938;   5 903;  EOL;   
4 927;   4 938;   5 906;  EOL;   
4 928;   4 938;   5 907;  EOL;   
4 928;   4 939;   5 906;  EOL;   
4 928;   4 939;   5 907;  EOL;   
4 928;   4 938;   5 906;  EOL; 

 

In ciuda cunostintelor mele in Basic, ma preseaza o masuratoare de trebuie sa o fac Joia asta, si timpul imi lipseste. Ma strofoc eu cu VBA-ul, dar poate cineva stie deja cum se face sa cauti un anume text (EOL in exemplul meu) si sa dai CR (Enter) cat sa treaca pe randul urmator.

 

Exista si varianta 2, unde incerc sa le scriu direct pe linii si coloane. Pe coloane stiu sa le inregistrez, pe linii nu am gasit nimic in Mikrobasic (IDE-ul folosit).

Astea-s procedurile utilizate:

' Open to write/append some text in the Data1.txt file
sub procedure SDCard_open_append()
    fName = "Data1.txt"
    fileHandle = FAT32_Open(@fName, FILE_APPEND_F32)
end sub
' Write some text in the Data1.txt file
sub procedure SDCard_add_data()
' Write some date in the Data1.txt file
    m = FAT32_Write(fileHandle, @buffer, 3)
    buffer = ";  "
' Write some date in the Data1.txt file
    m = FAT32_Write(filehandle, @buffer, 3)
end sub

' Close the Data1.txt file
sub procedure SDCard_save_close()
' Close the file Data1.txt
    m = FAT32_Close(fileHandle)
end sub

Procedura SDCard_open_append() creaza fisierul Data1.txt, daca nu exista deja, si-l deschide pentru adaugare date (text).

 

Procedura SDCard_add_data() adauga textul de l-am depus in buffer, apoi adauga ; si 2 spatii dupa fiecare data inregistrata.

 

Procedura SDCard_save_close() salveaza si inchide cardul SD.

 

Asa fac scrierea pe card, de exemplu ce este la inceputul operatiei de scriere. Apoi, copiez continutul ADC-urilor in buffer si scriu pe card.

  SDCard_open_append()
  buffer = "Xax"
  SDCard_add_data()
  Delay_ms(10)
  buffer = "Yax"
  SDCard_add_data()
  Delay_ms(10)
  buffer = "Zax"
  SDCard_add_data()
  Delay_ms(10)
  buffer = "EOL"
  SDCard_add_data()
  Delay_ms(10)
  SDCard_save_close()

 

Multumesc pentru orice sugestie. Prelucrare fisier TXT (se poate salva in CSV) sau modificare cod Mikrobasic.

 

Adaug si fisierul nativ TXT.

DATA1.TXT

Editat de Mircea
Link spre comentariu
  • Răspunsuri 45
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    19

  • Mircea

    15

  • merck

    6

  • modoran

    3

Top autori în acest subiect

Ca sa ordonezi dupa TAB-uri un text, trebuie ca dupa fiecare numar sa pui horizontal TAB (09h)

Ca sa treaca pe randul urmator, in loc de TAB trebuie pusi 2 octeti: 0Dh si 0Ah. Primul este CR (carriage return) iar al doilea LF (NL line feed, new line).

Un astfel de text copiat cu Ctrl+C si pus in Excel, se ordoneaza automat pe linii si coloane.

 Programul ar trebui modificat sa inscrie pe card datele ordonate si corect din prima. Ar ocupa si mai putin loc.

 

In textul tau in loc de punct zecimal ai 00h (NUL).

In loc de 0D0A ai 8 octeti: 20h 20h 45h 4Fh 4Ch 20h 20h 20h (  EOL   ) si din ce ai scris astea trebuie inlocuite cu 0D0A. Se poate face cu Word Office cu replace (Ctrl+H). Iei din text grupul ";  EOL;  " sau numai  EOL;  " cu copy il pui la "Find What" cu paste apoi pui sa fie inlocuit la "Replace with" cu ^p.

Inlocuirea se mai poate face si cu programul WinHex direct in hexa cu "Replace Hex Values" doar ca acolo trebuie sa scrii in hexa, din taste, octetii cautati si cu ce anume trebuie inlocuiti.

Editat de cimitavita
Link spre comentariu

Stiu ca e bine sa pui informatia in formatul potrivit de la inceput, insa nu vad inca cum. Textul EOL poate lipsi, l-am folosit doar ca sa am un element de delimitare vizual de linie pentru o prelucrare ulterioara.

 

Mikrobasic nu accepta 0D si 0A cand scrii cu FAT32_Write, in sensul ca nu le recunoaste ca fiind CR si LF. Si nu vad folosul sa le scriu ca text pe card, la ce mi-ar folosi?

 

Daca scrii

buffer = 0x0D

Mikrobasic nu intelege nimic, am incercat deja asta.

 

In UART merge ce-mi propui, insa as vrea sa nu stau cu laptopul conectat.

 

Ca un facut, nici VBA-ul nu imi e prieten in seara asta... Ii cer sa treaca pe randul doi cand gaseste "EOL" si refuza sa-l gaseasca. Mai incerc.

Sub Sort_data()
'
' Sort_data Macro
' Sort the data so after every text data EOL, jump on next row.
'
' Keyboard Shortcut: Ctrl+q
'
    Dim R As Integer
    Dim C As Integer
    Dim sDelim As String
    Dim sRaw As String
    Dim ReadArray() As String
    Dim Str1 As String
    Dim Str2 As String
    'Dim Check As Byte

    sDelim = ","     ' Set to vbTab if tab-delimited file

    Worksheets.Add
    Open "C:\...\Data\Data1.txt" For Input As #1
    R = 1
    Do While Not EOF(1)
        Line Input #1, sRaw
        ReadArray() = Split(sRaw, sDelim, 200000000, vbTextCompare)
      
            For C = 0 To UBound(ReadArray)
                Cells(R, C + 1).Value = ReadArray(C)
                Str1 = ReadArray(C)
                Str2 = "EOL"
                Check = StrComp(Str1, Str2, 1)
                If Check = 0 Then
                   R = R + 1
                End If
            Next C

    Loop
    Close #1

    Application.WindowState = xlNormal

End Sub

 

Link spre comentariu

Mircea, încearcă sa trimiți 3 caractere, ca funcția ta add cu 3 lucrează și poate contează. Adică "\n  " (<linie nouă > <pauză ><pauză >). 

Zic și eu, ca altfel, cum zice și modoran, nu-i treaba lui ce pui în string. 

Link spre comentariu

Da, caci altfel zice ca nu folosesc tipul bun. 

 

Daca pun buffer = "\r\ntextdorit" il scrie \r\ntextdorit pe card, ca orice text, nu trece pe linia urmatoare. 

Link spre comentariu

Și nu-i suficient să-l formatez editorul de texte când deschizi fișierul pe calculator? 

Editat de Liviu M
Link spre comentariu

Am mai zis, in loc de EOL pot pune orice. Cand Excel importa datele din fisierul text, apoi ce e text il considera text, ce sunt numere le formateaza ca numere. 

 

De exemplu 4 567 in format frantuzesc pentru 4 mii 567 il transform in 4,567 (format american). 

 

E ceva care imi scapa despre tratarea datelor in Excel. D-aia cer si ajutorul, poate cineva mai priceput stie cum se face. 

Link spre comentariu

Sorry, mai departe eu nu știu decât cu ocolișurile deja menționate - deschizi fișierul cu editor de texte (notepad++ e foarte bun) și înlocuiești EOL-ul tău cu linie nouă. Pentru asta, în fereastra replace, bifezi optionea regex (parcă) și îi dai sa înlocuiască EOL cu \n. 

Link spre comentariu

Tu ai:

sub procedure SDCard_add_data()
' Write some date in the Data1.txt file
    m = FAT32_Write(fileHandle, @buffer, 3)
    buffer = ";  "
' Write some date in the Data1.txt file
    m = FAT32_Write(filehandle, @buffer, 3)
end sub

Vezi daca merge asa:

char carr_ret_nl[]="\r\n"; //carriage return and new line

si apoi pui o linie dupa fiecare rand introdus:

FAT32_Write(fileHandle,carr_ret_nl,len_carr_ret_str); // send CR anf LF (new line) to write next data

 

Adica nu concatena textul de introdus cu \r\n ci apelezi inca o data FAT32_Write in care textul introdus sa fie doar \r\n

Editat de merck
Link spre comentariu

Ca daca la UART vrea asa:

UART_Write_Text("gigi");

UART_WRITE(CR);

 

Poate si la  FAT32_Write vrea la fel apel separat ca sa iti puna CR .

 

P.S. Nu mai pot edita mesajul anterior.

Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări