Envoi de numéros avec accusés
Ici, nous voyons un autre couple de programmes : cette fois, le maître envoie des nombres avec SendRemoteNumber(conn, queue, numbre) et cesse d'attendre les accusés de l'esclave; que si l'esclave est à l'écoute et envoi l'accusé, le maître continue en envoyant le message suivant. Les esclaves reçoivent simplement le numéro avecReceiveRemoteNumber(queue, clear, number) et envoie l'accusé avec SendResponseNumber. Vos programmes maître-esclave doivent avoir un code commun pour les accusés de réception, personnelement, je choisis la valeur 0xFF hexadecimale.
Le maître envoie des nombres aléatoires et attend les accusés esclaves; chaque fois qu'il reçoit un accusé de réception avec le bon code, la variable ack doit être réinitialisée, faute de quoi le maître continuera à envoyer sans nouveaux accusés, car la variable est nulle.
L'esclave vérifie en permanence la boîte aux lettres et, si elle n'est pas vide, affiche la valeur lue et envoie un accusé de réception au maître. Au début du programme, j'ai choisi d'envoyer un accusé de réception sans la lecture des messages pour débloquer le maître, en fait, sans cette astuce, si le programme maître est lancé en premier, il serait mort, même si nous lançons un esclave plus tard. De cette façon, les premiers messages peuvent se perdre, mais vous pouvez démarrer des programmes maître et esclave à différents moments, sans risque d'accrochage.
//MAÎTRE
#define BT_CONN 1
#define OUTBOX 5
#define INBOX 1
#define CLEARLINE(L) \
TextOut(0,L," ");
sub BTCheck(int conn){
if (!BluetoothStatus(conn)==NO_ERR){
TextOut(5,LCD_LINE2,"Error");
Wait(1000);
Stop(true);
}
}
task main(){
int ack;
int i;
BTCheck(BT_CONN);
TextOut(10,LCD_LINE1,"Master sending");
while(true){
i = Random(512);
CLEARLINE(LCD_LINE3);
NumOut(5,LCD_LINE3,i);
ack = 0;
SendRemoteNumber(BT_CONN,OUTBOX,i);
until(ack==0xFF) {
until(ReceiveRemoteNumber(INBOX,true,ack) == NO_ERR);
}
Wait(250);
}
}
//ESCLAVE
#define BT_CONN 1
#define OUT_MBOX 1
#define IN_MBOX 5
sub BTCheck(int conn){
if (!BluetoothStatus(conn)==NO_ERR){
TextOut(5,LCD_LINE2,"Error");
Wait(1000);
Stop(true);
}
}
task main(){
int in;
BTCheck(0);
TextOut(5,LCD_LINE1,"Slave receiving");
SendResponseNumber(OUT_MBOX,0xFF); //unblock master
while(true){
if (ReceiveRemoteNumber(IN_MBOX,true,in) != STAT_MSG_EMPTY_MAILBOX) {
TextOut(0,LCD_LINE3," ");
NumOut(5,LCD_LINE3,in);
SendResponseNumber(OUT_MBOX,0xFF);
}
Wait(10); // pause (optionnelle)
}
}
Dostları ilə paylaş: |