From 3439300b0d3b4d21d1a2d93181696546f7f5cb19 Mon Sep 17 00:00:00 2001 From: Samuel Date: Sat, 24 Jan 2026 21:35:08 +0100 Subject: [PATCH] Copie du message dans une structure semble fonctionnel --- Readme.md | 27 ++++++++++++++++++++++++++- main.c | 44 ++++++++++++++++++++++++++++++++++++++------ messagerie.c | 2 +- messagerie.h | 17 +++++++++++++++++ 4 files changed, 82 insertions(+), 8 deletions(-) diff --git a/Readme.md b/Readme.md index cbe3ef5..75001e9 100644 --- a/Readme.md +++ b/Readme.md @@ -1,4 +1,29 @@ Projet modèle pour le Rpi Pico (RP2040) ======================================= -Ce projet est un example pour le RPI Pico, tentant d'être le plus prêt à l'emploi possible. +Code pour travailler sur la communication USB, côté device. + +Méthode de test +--------------- +* Ouvrir un terminal pour lire les données reçues en désactivant l'écho + + `stty -F /dev/ttyACM1 -echo` + + `cat /dev/ttyACM0` +* Ouvrir un terminal pour envoyer les données. Contrôle de la LED avec : + + `echo -e "\xFF\xFF\x06rD\x00\x01\x06\x00" > /dev/ttyACM1` + + ou + + `echo -e "\xFF\xFF\x06rD\x00\x01\x36\x00" > /dev/ttyACM1` + +* Tester la réception de la position + + `echo -e "\xFF\xFF\x11rP\x00\x0C\x01\x01\x01\x01\x05\x05\x05\x05\x09\x09\x09\x09\x00" > /dev/ttyACM1` + +Difficultés rencontrées +----------------------- + +En testant avec Linux, le terminal peut manger certains caractères lorsqu'il les reçoit (0x11, 0x12 et 0x13). +Le type message_t contient trop de champs, il faut supprimer les champs inutiles en s'assurant qu'il n'y a pas d'utilisation de ces champs. \ No newline at end of file diff --git a/main.c b/main.c index ff57bb0..5c16fdf 100644 --- a/main.c +++ b/main.c @@ -27,7 +27,9 @@ void envoie_donnees(char * donnees, uint16_t length){ } } - +/// @brief Fonction pour envoyer une structure +/// @param donnees données à envoyer +/// @param size taille des données void envoie_structure(const void * donnees, size_t size){ const unsigned char *byte; // Entête du message : debut @@ -75,7 +77,7 @@ void main(void) message_binaire[9]= 0; - printf(">Device 1 - demarrage\n"); + struct message_applicatif_t message_applicatif; @@ -90,8 +92,15 @@ void main(void) int nb_ech = 10; int taille_morceau = 60; int nb_message=0; + float f; stdio_init_all(); sleep_ms(5000); + + printf(">Device 1 - demarrage\n"); + printf("struct float:%d\n", sizeof(f)); + printf("struct message applicatif:%d\n", sizeof(message_applicatif)); + + gpio_init(PICO_DEFAULT_LED_PIN); gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT); gpio_put(PICO_DEFAULT_LED_PIN, 0); @@ -104,7 +113,7 @@ void main(void) while(1){ - + /* if(get_absolute_time() - temps_message_detection > MESSAGE_TIMEOUT_US){ start_time_us = get_absolute_time(); envoie_structure(&message_requete_detection, sizeof(message_requete_detection) ); @@ -113,7 +122,7 @@ void main(void) //printf(">temps_emission:%lld\n", current_time_us - start_time_us); } - start_time_us = get_absolute_time(); + start_time_us = get_absolute_time();*/ communication_reception_message(); if(messagerie_message_disponible()){ @@ -130,15 +139,38 @@ void main(void) // données[1]: id de la carte // données[2]: 1er registre // données[3 à tailles_données -1]: valeurs + + printf("type:%d %c\n", message.type, message.type); + printf("id_carte:%d %c\n", message.id_carte, message.id_carte); + for(int i=0; i< 4;i++){ + printf("%x ", message.donnees[i]); + } + printf("\n"); + memcpy(&message_applicatif, message.donnees, message.taille_donnees); + + printf("id_carte:%d %c\n", message_applicatif.id_carte, message_applicatif.id_carte); + printf("commande:%d %c\n", message_applicatif.commande, message_applicatif.commande); + printf("add_reg:%d\n", message_applicatif.adresse_registre); + printf("taille_donnee:%d\n", message_applicatif.taille_donnees); + + if(message_applicatif.id_carte == USB_ID_PROPULSION){ + printf("registre:%d\n", message_applicatif.adresse_registre); + if(message_applicatif.adresse_registre == REG_PROPULSION_POSITION){ + printf("x:%x, y:%x, rot:%x\n", message_applicatif.donnees_applicative.msg_propulsion_position.position_x_mm, + message_applicatif.donnees_applicative.msg_propulsion_position.position_y_mm, + message_applicatif.donnees_applicative.msg_propulsion_position.orientation_rad); + } + } + id_carte = message.donnees[1]; registre = message.donnees[2]; if(id_carte == 'D'){ temps_message_detection = get_absolute_time(); if(message.donnees[4] > 0 && message.donnees[4] < 30){ - //printf(">LED ON\n"); + printf(">LED ON\n"); gpio_put(PICO_DEFAULT_LED_PIN, 1); }else{ - //printf(">LED OFF\n"); + printf(">LED OFF\n"); gpio_put(PICO_DEFAULT_LED_PIN, 0); } } diff --git a/messagerie.c b/messagerie.c index df64305..fc71b85 100644 --- a/messagerie.c +++ b/messagerie.c @@ -23,4 +23,4 @@ void messagerie_put_message(struct message_t message){ message_liste[index_message] = message; index_message = index_message + 1; } -} \ No newline at end of file +} diff --git a/messagerie.h b/messagerie.h index 6eec6fc..fa081f9 100644 --- a/messagerie.h +++ b/messagerie.h @@ -1,13 +1,16 @@ #include "pico/stdlib.h" +#include "messages_propulsion.h" #define MESSAGE_TIMEOUT_US 2000 +// Attention l'ordre de déclaration est important !! On fait de la copie de donnée en faisant confiance à cet ordre ! struct message_t{ uint8_t type; // 'd' pour demande, 'r' pour une réception de données, 'w' pour écrire des données, '>' pour des logs uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C) uint8_t adresse_registre; // Adresse du registre lu uint8_t taille_donnees; uint8_t donnees[255]; + }; struct message_requete_t{ @@ -17,6 +20,20 @@ struct message_requete_t{ uint8_t taille_donnees; }; +struct message_applicatif_t{ + uint8_t commande; + uint8_t id_carte; // Identifiant de la carte (on reprend les adresses I2C) + uint8_t adresse_registre; // Adresse du registre lu + uint8_t taille_donnees; + union{ +#ifdef MESSAGE_PROPULSION_H + struct msg_propulsion_position_t msg_propulsion_position; +#endif + + }donnees_applicative; + +}; + bool messagerie_message_disponible(); struct message_t messagerie_get_message();