Bonjour
J'utilise un Tx et un Rx en 433 mhz, ils fonctionnent (transmettent de la BF).
j'ai utilisé un exemple classique et tel qu'il est ça envoie et ça reçoit.
Donc les modules sont bons.
Maintent, j'ai fait le code suivant et j'ai l'impression que ça émet mais je n'ai rien en sortie.
Où est l'erreur ? ça fait deux jours qu e j'essaye tout sans trouver !
Merci !
Sur des Uno:
Voici le TX:
//simple Tx on pin D12
#include <VirtualWire.h>
char *flag;
int vallue;
void setup() {
Serial.begin(9600);
pinMode(A1,INPUT);
pinMode(7,OUTPUT);
pinMode(13,OUTPUT);
vw_set_ptt_inverted(true);
vw_set_tx_pin(12);
vw_setup(4000);// speed of data transfer Kbps
}
void loop()
{
vallue = analogRead(A1);
if (vallue < 500)
{
*flag='1' ;
vw_send((uint8_t *)*flag, strlen(*flag));
vw_wait_tx(); // Wait until the whole message is gone
Serial.println("ok");
digitalWrite(13,'1');
delay(2000);
}
Et voici le Rx:
//simple Rx on pin D12
#include <VirtualWire.h>
void setup() {
vw_set_ptt_inverted(true); // Required for DR3100
vw_set_rx_pin(12);
vw_setup(4000); // Bits per sec
vw_rx_start(); // Start the receiver PLL running
Serial.begin(9600);
pinMode(5, OUTPUT);
}
void loop()
{
uint8_t buf[VW_MAX_MESSAGE_LEN];
uint8_t buflen = VW_MAX_MESSAGE_LEN;
if (vw_get_message(buf, &buflen)) // Non-blocking
{
if (buf[1] == '1')
{
Serial.println("ok ");
digitalWrite(5, 1);
delay(1000);
}
if (buf[1] == '0')
{
Serial.println("nop");
digitalWrite(5, 0);
delay(200);
}
}
}
quand vous faites cela vous allouez de la mémoire pour un pointeur mais rien pour ce qui est pointé. Donc quand vous faites
*flag='1' ;
ça écrit n'importe où en mémoire....
et l'envoi est pas correct non plus vw_send((uint8_t *)*flag, strlen(*flag));
vous demandez de prendre le contenu pointé par le pointeur, dites que c'est une adresse et ensuite vous essayez de calculer la longueur d'une hypothétique chaine de caractère (strlen attend une cString terminée par un caractère nul) comme taille...
faites un char flag; comme ça il a la mémoire allouée pour 1 octet, puis l'affectation est simple flag = '1'; et l'envoi est simple aussi vw_send((uint8_t *)&flag, sizeof flag);
on passe l'adresse de notre variable et sa taille en octets
j'ai pas lu plus loin, mais ça devrait expliquer un certain nombre de soucis...
Bonjour JML
Merci de votre réponse, que j'ai mise en place tout de suite. En effet, il semble que ça émette et en tous cas j'ai compris que j'avais confondu en quelque sorte la boîte avec ce qu'il devait y avoir dedans et à quel endroit.
Ceci posé, le Rx ne reçoit rien. il reste sur le message 'nop' pour me dire qu'il ne reçoit pas le contenu de la boîte, le char flag.
J'ai lu votre tuto sir les pointeurs, il est instructif, merci.
merci de vos lumières !