Bonjour tt le monde ,
j'essai de faire communiquer ma raspy avec mon arduino uno. En gros mon arduino est connecté a 3 capteur et je veux que ma raspberry recupere les données des trois capteurs une par une pour faire un traitement la dessus. La connexion est faite par le port USB et j'utilise coté raspy un programme en C pour l'uart.
L'objectif est que :
Raspy envoie "US1" pour ultrason 1 et l'arduino lui retourne la valeur de l'ultrason 1 ( 3 byte exemple 435).
Cependant j'ai un problème de synchro lorsque arduino répond. Coté Raspy je recois les 3 bytes soit 2 bytes ou 1 bytes ( en gros ca varie).
Si quelqu'un a une idée pour synchroniser ça je suis preneur . Merci d'avance
j'ai lu le tuto il est très intérressent cependant il traite que du coté arduino. Moi je reçois bien sur l'arduino, c'est la réponse de l'arduino que je ne parviens pas a lire convenablement sur la raspberry ( soit je recois la réponse en entier soit je ne lis que la moitié ... et des fois je ne lis rien du tout )
Mon problème se situe au niveau de la reception je crois ( en C pr l' uart ):
int rx_length = read (fd, (void*)rx_buffer, 255).
Quand j'ouvre le port /dev/ttyACM0 sans le mode O_NDELAY=> le programme reste la à attendre des donnée et n'en sort pas.
Quand j'ouvre le port en mode O_NDELAY il sort immédiatemment et rx_lenght < 0
voici le code pr plus de précision
int fd = -1;
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY);
if (fd != -1){
// Read up to 255 characters from the port if they are there
unsigned char rx_buffer[256];
int rx_length = read(fd, (void*)rx_buffer, 255);
if (rx_length < 0){
//An error occured
printf("UART RX error\n");
}
else if (rx_length == 0){
//No data waiting
}
else
{
//Bytes received
rx_buffer[rx_length] = '\0';
printf("%i bytes read : %s\n", rx_length, rx_buffer);
}
}
Je viens aussi de commander un arduino dans le but de communiquer avec mon raspberry (qui ferra office de serveur web)
uart = usb ?
pour ma part je communiquerai que par du php je pense.
L'arduino enverra toute les minutes l'état des capteurs au raspberry qui enregistrera en base de donnée.
ok, je pense que pour une utilisation via une page web l'usb est préférable non?
Auriez vous un schéma explication votre connexion entre l'arduino et le Rpi?
merci d'avance
dadycoke:
j'ai lu le tuto il est très intérressent cependant il traite que du coté arduino. Moi je reçois bien sur l'arduino, c'est la réponse de l'arduino que je ne parviens pas a lire convenablement sur la raspberry ( soit je recois la réponse en entier soit je ne lis que la moitié ... et des fois je ne lis rien du tout )
Mon problème se situe au niveau de la reception je crois ( en C pr l' uart ):
int rx_length = read (fd, (void*)rx_buffer, 255).
Quand j'ouvre le port /dev/ttyACM0 sans le mode O_NDELAY=> le programme reste la à attendre des donnée et n'en sort pas.
Quand j'ouvre le port en mode O_NDELAY il sort immédiatemment et rx_lenght < 0
voici le code pr plus de précision
int fd = -1;
fd = open("/dev/ttyACM0", O_RDWR | O_NOCTTY);
if (fd != -1){
// Read up to 255 characters from the port if they are there
unsigned char rx_buffer[256];
int rx_length = read(fd, (void*)rx_buffer, 255);
if (rx_length < 0){
//An error occured
printf("UART RX error\n");
}
else if (rx_length == 0){
//No data waiting
}
else
{
//Bytes received
rx_buffer[rx_length] = '\0';
printf("%i bytes read : %s\n", rx_length, rx_buffer);
}
}
Le morceau de code sortie de son contexte ne permet pas de juger s'il fonctionne ou non. Ce qu'il faut bien voir c'est que les caractères que tu envoies par l'arduino arrivent relativement lentement par rapport à la vitesse ou ton code est exécuté. Donc si tu attends 3 caractères par exemples il faudrait faire une boucle d'attente non bloquante. Tu boucles sur le read jusqu'à avoir 3 caractères dans le buffer ou si un hors temps s'est écoulé.
"Ce qu'il faut bien voir c'est que les caractères que tu envoies par l'arduino arrivent relativement lentement par rapport à la vitesse ou ton code est exécuté."
@fdufnews : Tu a tout a fait raison sur ce point. Je vais essayer de boucler sur le read et je vous tiendrais au courant
voila j'utilise le meme code de la derniere fois qui m'a permis de recuperer 3 octet sur une répnse envoyé par d'arduino
en utilisant une boucles sur le read jusqu'à avoir 3 caractères dans le buffer sans utilisé un hors temps ( donc mon programme rest la a attendre une réponse d'arduino qui vient jamais )
Mon probleme je crois savoir ou il se situe : c'est une question de timing entre arduino et raspy.
Quelqun aurai t il une astuce ?
Merci