From 3b60c26fa702de62bd83d39a73914425f37db958 Mon Sep 17 00:00:00 2001 From: "quentin.perret" Date: Thu, 7 Apr 2022 17:31:01 +0200 Subject: [PATCH] b2hd.c finished --- .gitignore | 4 +- .vscode/settings.json | 6 +++ C Script/b2hd | Bin 0 -> 17160 bytes C Script/b2hd.c | 45 ++++++++++++++++++++++ C Script/b2hd.h | 16 ++++++++ Traitement-FFT.py | 77 ++++++++++++++++++++++++++++++++++++++ fftFramboisier.py | 85 ------------------------------------------ hextodec.c | 67 --------------------------------- hextodec.exe | Bin 44413 -> 0 bytes 9 files changed, 147 insertions(+), 153 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 C Script/b2hd create mode 100644 C Script/b2hd.c create mode 100644 C Script/b2hd.h create mode 100644 Traitement-FFT.py delete mode 100644 fftFramboisier.py delete mode 100644 hextodec.c delete mode 100644 hextodec.exe diff --git a/.gitignore b/.gitignore index c126aa6..82c75b8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ *.TXT -*.png \ No newline at end of file +*.png +*.exe +*.csv \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f8a0582 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "C_Cpp.errorSquiggles": "Disabled", + "files.associations": { + "time.h": "c" + } +} \ No newline at end of file diff --git a/C Script/b2hd b/C Script/b2hd new file mode 100644 index 0000000000000000000000000000000000000000..576322dc15b2391ba9a056c9fad822257a9fcd63 GIT binary patch literal 17160 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 +#include +#include +#include +typedef struct { + uint8_t octet1; + uint8_t octet2; + uint8_t octet3; + uint8_t octet4; +} quartet; +int64_t millis() +{ + struct timespec now; + timespec_get(&now, TIME_UTC); + return ((int64_t) now.tv_sec) * 1000 + ((int64_t) now.tv_nsec) / 1000000; +} \ No newline at end of file diff --git a/Traitement-FFT.py b/Traitement-FFT.py new file mode 100644 index 0000000..5347b63 --- /dev/null +++ b/Traitement-FFT.py @@ -0,0 +1,77 @@ +import numpy as np +#import matplotlib.pyplot as plt + +import struct + +#"C:\Users\quent\OneDrive\Bureau\ENSC\TransD\Framboisier\02400001.TXT" +#! /usr/bin/env python3 +# -*- coding: UTF-8 -*- + +AllRes = [[],[],[],[],[],[],[],[]] + +link = "02400007.TXT" + +f = open(link , "rb")#ouvertuture du fichier txt traiter + +while True: + # Lecture 26 octets dans le fichier + record = f.read(26) + if len(record) != 26: + break; + #compteur += 1 + # Test si on est sur la ligne de #####... + if record[:18] == b'#################\n': + # Lit le complement et reconstitue l'enregistrement + complement = f.read(18) + record = record[18:] + complement + + # Ajoute un octet null tous les 3 octets a partir du 2ème caractère jusqu'à l'avant dernier + record_4x8_octets = bytearray() + print(record_4x8_octets) + i=1; + while i<25: + record_4x8_octets.append(record[i]) + if i % 3 == 0: + record_4x8_octets.append(0) # Tous les 3 octets, on en ajoute un null + i += 1 + + # Converti l'enregistrement (tableau de bytes) en 8 entiers signés + resultat_fois256 = struct.unpack('>iiiiiiii', record_4x8_octets) + + # Divise les résultats par 256 pour recadrer les 3 octets à gauche en conservant le signe + resultat = [] + for i in range(len(resultat_fois256)): + res = resultat_fois256[i] // 256 * 20 + AllRes[i].append(res) + + + f.close()#fermeturedu fichier txt + +"""fig, (ax1, ax2) = plt.subplots(2, 1) #Création de la figure à 2 plots + +Fe = 250000 #Fréquence d'échantillonage +tstep = 1 / Fe #Time spacing +y = AllRes[0][:] #Signal renvoyé par le premier capteur +N = len(y) #nb de points +t = np.linspace(0, (N-1) * tstep, N) #Tableau des temps + +#Légende du plot 1 +ax1.set_ylabel('Tension (nV)') +ax1.set_xlabel('Time (s)') +ax1.set_title("Tension renvoyée par le capteur 1 en fonction du temps") + +#Légende du plot 2 +ax2.set_xlabel('Fréquence (Hz)') +ax2.set_ylabel('Amplitude') +ax2.set_title("Spectre des fréquences du signal renvoyé par le capteur 1") + +#calcul de la FFT +sp = np.fft.fft(y,Fe) +f = np.fft.fftfreq(Fe,tstep) #axe des abscisses: fréquence + +#Définition des courbes des plots +ax1.plot(t,y) +ax2.plot(f,abs(sp)) + +#Lancement de l'affichage du plot +plt.show()""" \ No newline at end of file diff --git a/fftFramboisier.py b/fftFramboisier.py deleted file mode 100644 index 67c8c14..0000000 --- a/fftFramboisier.py +++ /dev/null @@ -1,85 +0,0 @@ -import numpy as np -import matplotlib.pyplot as plt - -import struct - -#"C:\Users\quent\OneDrive\Bureau\ENSC\TransD\Framboisier\02400001.TXT" -#! /usr/bin/env python3 -# -*- coding: UTF-8 -*- - -AllRes = [[],[],[],[],[],[],[],[]] -for i in range(31,34): #choix des fichiers ouvert (utilisation d'un chemin relatif) - compteur = 0 - if i < 10: #suivant si le fichier fini par un nombre inférieur ou supérieur à 10 on complète notre lien soit par "0"+i soit par i - complement_link = "0" + str(i) - else: - complement_link = str(i) - link = "Framboisier/024000" + complement_link +".TXT" - - f = open(link , "rb")#ouvertuture du fichier txt traiter - - while True: - # Lecture 26 octets dans le fichier - record = f.read(26) - if len(record) != 26: - break; - #compteur += 1 - # Test si on est sur la ligne de #####... - if record[:18] == b'#################\n': - # Lit le complement et reconstitue l'enregistrement - complement = f.read(18) - record = record[18:] + complement - - # Ajoute un octet null tous les 3 octets a partir du 2ème caractère jusqu'à l'avant dernier - record_4x8_octets = bytearray() - i=1; - while i<25: - record_4x8_octets.append(record[i]) - if i % 3 == 0: - record_4x8_octets.append(0) # Tous les 3 octets, on en ajoute un null - i += 1 - - # Converti l'enregistrement (tableau de bytes) en 8 entiers signés - resultat_fois256 = struct.unpack('>iiiiiiii', record_4x8_octets) - - # Divise les résultats par 256 pour recadrer les 3 octets à gauche en conservant le signe - resultat = [] - for i in range(len(resultat_fois256)): - res = resultat_fois256[i] // 256 * 20 - AllRes[i].append(res) - - #a la fin de chaque fichier de mesure en trouve une série de 19 zéros écrit par le capteur - for i in range(19): #cette boucle permet de retirer les 19 zéros du signal - for j in range(8): - AllRes[j].pop() - - f.close()#fermeturedu fichier txt - -fig, (ax1, ax2) = plt.subplots(2, 1) #Création de la figure à 2 plots - -Fe = 250000 #Fréquence d'échantillonage -tstep = 1 / Fe #Time spacing -y = AllRes[0][:] #Signal renvoyé par le premier capteur -N = len(y) #nb de points -t = np.linspace(0, (N-1) * tstep, N) #Tableau des temps - -#Légende du plot 1 -ax1.set_ylabel('Tension (nV)') -ax1.set_xlabel('Time (s)') -ax1.set_title("Tension renvoyée par le capteur 1 en fonction du temps") - -#Légende du plot 2 -ax2.set_xlabel('Fréquence (Hz)') -ax2.set_ylabel('Amplitude') -ax2.set_title("Spectre des fréquences du signal renvoyé par le capteur 1") - -#calcul de la FFT -sp = np.fft.fft(y,Fe) -f = np.fft.fftfreq(Fe,tstep) #axe des abscisses: fréquence - -#Définition des courbes des plots -ax1.plot(t,y) -ax2.plot(f,abs(sp)) - -#Lancement de l'affichage du plot -plt.show() \ No newline at end of file diff --git a/hextodec.c b/hextodec.c deleted file mode 100644 index 52a0f90..0000000 --- a/hextodec.c +++ /dev/null @@ -1,67 +0,0 @@ -#include -#include -#include - -typedef struct { - uint8_t octet1; - uint8_t octet2; - uint8_t octet3; - uint8_t octet4; -} quartet; - -int main ( int argc, char **argv) -{ - printf("start main"); - int i; - char buff[26]; - char buff2[18]; - int32_t values[8]; - uint32_t valbin[8]; - quartet value; - FILE* test = fopen("02400001.TXT","r"); - if(test == NULL){ - printf("File NULL"); - return 1; - } - if(!test){ - printf("File opening failed"); - return 1; - } - printf("\nbefore while"); - while (fread(&buff, 26, 1, test)) { //stdin à la place de test de basetest - /*buff[25] = '\0';*/ - if (strncmp(buff, "#################\n", (size_t)18) == 0) { - if (!(fread(&buff2, 18, 1, test))) { // stdin here too - fprintf(stderr, "Erreur lesture après ###...#"); - return(1); - } else { - /*buff2[17] = '\0';*/ - strncpy(buff, &buff[18], 8); - strncpy(&buff[8], buff2, 18); - } - } - i = 3; - value.octet1 = buff[3*i+1]; - value.octet2 = buff[3*i+2]; - value.octet3 = buff[3*i+3]; - value.octet4 = 0; - /*memcpy(&values[i], &value, sizeof(quartet));*/ - - valbin[i] = buff[3*i+1]*256*256*256 + buff[3*i+2]*256*256 + buff[3*i+3]*256; - memcpy(&values[i], &valbin[i], sizeof(int32_t)); - if (value.octet1 & 0b10000000) { - printf("Valeur negative trouvee: %02x %02x %02x %d\n", value.octet1, value.octet2, value.octet3, values[i]); - } - - printf("%02x %02x %02x %d", value.octet1, value.octet2, value.octet3, values[i]/256); // stdout au début du printf - -/* - for (i=1; i<25; i++) { - fprintf(stdout, "%02x ", buff[i]); - } - -*/ - printf("\n"); - } - // printf("\nend"); -} diff --git a/hextodec.exe b/hextodec.exe deleted file mode 100644 index c09a8e5569a5bc5c4a1cf851aa1d2c70690487dd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44413 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