Mircea Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 (editat) 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 Iunie 30, 2021 de Mircea Link spre comentariu
cimitavita Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 (editat) 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 Iunie 30, 2021 de cimitavita Link spre comentariu
Mircea Postat Iunie 30, 2021 Autor Partajează Postat Iunie 30, 2021 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
Liviu M Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 Tunătorule, ai încercat cu "\n" în loc de "EOL"? Link spre comentariu
Mircea Postat Iunie 30, 2021 Autor Partajează Postat Iunie 30, 2021 Da, incercat si nu merge. In C ar merge (am gasit nspe exemple), pe UART ar merge. Link spre comentariu
modoran Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 Ce treaba ar avea limbajul de programare utilizat cu datele scrise efectiv ? Ceva nu-i in regula. Link spre comentariu
Liviu M Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 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
Liviu M Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 Ca să fim siguri - scrii și ghilimelele, da? Adica buffer = "\n " Link spre comentariu
Mircea Postat Iunie 30, 2021 Autor Partajează Postat Iunie 30, 2021 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
Liviu M Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 (editat) Și nu-i suficient să-l formatez editorul de texte când deschizi fișierul pe calculator? Editat Iunie 30, 2021 de Liviu M Link spre comentariu
Mircea Postat Iunie 30, 2021 Autor Partajează Postat Iunie 30, 2021 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
Liviu M Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 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
Mircea Postat Iunie 30, 2021 Autor Partajează Postat Iunie 30, 2021 O sa incerc asta, sa vad cum merge. Link spre comentariu
merck Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 (editat) 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 Iunie 30, 2021 de merck Link spre comentariu
merck Postat Iunie 30, 2021 Partajează Postat Iunie 30, 2021 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum