Copie du message dans une structure semble fonctionnel
This commit is contained in:
parent
c724748232
commit
3439300b0d
27
Readme.md
27
Readme.md
@ -1,4 +1,29 @@
|
|||||||
Projet modèle pour le Rpi Pico (RP2040)
|
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.
|
||||||
44
main.c
44
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){
|
void envoie_structure(const void * donnees, size_t size){
|
||||||
const unsigned char *byte;
|
const unsigned char *byte;
|
||||||
// Entête du message : debut
|
// Entête du message : debut
|
||||||
@ -75,7 +77,7 @@ void main(void)
|
|||||||
|
|
||||||
message_binaire[9]= 0;
|
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 nb_ech = 10;
|
||||||
int taille_morceau = 60;
|
int taille_morceau = 60;
|
||||||
int nb_message=0;
|
int nb_message=0;
|
||||||
|
float f;
|
||||||
stdio_init_all();
|
stdio_init_all();
|
||||||
sleep_ms(5000);
|
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_init(PICO_DEFAULT_LED_PIN);
|
||||||
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
|
gpio_set_dir(PICO_DEFAULT_LED_PIN, GPIO_OUT);
|
||||||
gpio_put(PICO_DEFAULT_LED_PIN, 0);
|
gpio_put(PICO_DEFAULT_LED_PIN, 0);
|
||||||
@ -104,7 +113,7 @@ void main(void)
|
|||||||
|
|
||||||
|
|
||||||
while(1){
|
while(1){
|
||||||
|
/*
|
||||||
if(get_absolute_time() - temps_message_detection > MESSAGE_TIMEOUT_US){
|
if(get_absolute_time() - temps_message_detection > MESSAGE_TIMEOUT_US){
|
||||||
start_time_us = get_absolute_time();
|
start_time_us = get_absolute_time();
|
||||||
envoie_structure(&message_requete_detection, sizeof(message_requete_detection) );
|
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);
|
//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();
|
communication_reception_message();
|
||||||
|
|
||||||
if(messagerie_message_disponible()){
|
if(messagerie_message_disponible()){
|
||||||
@ -130,15 +139,38 @@ void main(void)
|
|||||||
// données[1]: id de la carte
|
// données[1]: id de la carte
|
||||||
// données[2]: 1er registre
|
// données[2]: 1er registre
|
||||||
// données[3 à tailles_données -1]: valeurs
|
// 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];
|
id_carte = message.donnees[1];
|
||||||
registre = message.donnees[2];
|
registre = message.donnees[2];
|
||||||
if(id_carte == 'D'){
|
if(id_carte == 'D'){
|
||||||
temps_message_detection = get_absolute_time();
|
temps_message_detection = get_absolute_time();
|
||||||
if(message.donnees[4] > 0 && message.donnees[4] < 30){
|
if(message.donnees[4] > 0 && message.donnees[4] < 30){
|
||||||
//printf(">LED ON\n");
|
printf(">LED ON\n");
|
||||||
gpio_put(PICO_DEFAULT_LED_PIN, 1);
|
gpio_put(PICO_DEFAULT_LED_PIN, 1);
|
||||||
}else{
|
}else{
|
||||||
//printf(">LED OFF\n");
|
printf(">LED OFF\n");
|
||||||
gpio_put(PICO_DEFAULT_LED_PIN, 0);
|
gpio_put(PICO_DEFAULT_LED_PIN, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,4 +23,4 @@ void messagerie_put_message(struct message_t message){
|
|||||||
message_liste[index_message] = message;
|
message_liste[index_message] = message;
|
||||||
index_message = index_message + 1;
|
index_message = index_message + 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
17
messagerie.h
17
messagerie.h
@ -1,13 +1,16 @@
|
|||||||
#include "pico/stdlib.h"
|
#include "pico/stdlib.h"
|
||||||
|
#include "messages_propulsion.h"
|
||||||
|
|
||||||
#define MESSAGE_TIMEOUT_US 2000
|
#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{
|
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 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 id_carte; // Identifiant de la carte (on reprend les adresses I2C)
|
||||||
uint8_t adresse_registre; // Adresse du registre lu
|
uint8_t adresse_registre; // Adresse du registre lu
|
||||||
uint8_t taille_donnees;
|
uint8_t taille_donnees;
|
||||||
uint8_t donnees[255];
|
uint8_t donnees[255];
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
struct message_requete_t{
|
struct message_requete_t{
|
||||||
@ -17,6 +20,20 @@ struct message_requete_t{
|
|||||||
uint8_t taille_donnees;
|
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();
|
bool messagerie_message_disponible();
|
||||||
struct message_t messagerie_get_message();
|
struct message_t messagerie_get_message();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user