Subject:
|
Re: comunicazione infrarossi RCX
|
Newsgroups:
|
lugnet.org.it.itlug
|
Date:
|
Thu, 22 Feb 2007 10:43:15 GMT
|
Viewed:
|
2424 times
|
| |
| |
In lugnet.org.it.itlug, Silvio Oliviero wrote:
> avete qualche codice di esempio x la comunicazione di dati tra due rcx?
>
> non so come procedere con l'nqc (non so come ricavare l'input della porta
> infrarossi o trasmettere l'output)..
Ecco qualche esempio:
Per prima cosa io di solito definisco delle costanti che attribuiscono ai vari
codici un significato, in modo che il codice risulti più leggibile:
#define MSG_NONE 0
#define MSG_BLOCKED_LEFT 1
#define MSG_BLOCKED_RIGHT 2
...
Mandare un messaggio è la cosa più semplice del mondo:
SendMessage(MSG_BLOCKED_RIGHT);
Leggere un messaggio richiede qualche riga di più:
if (Message()=MSG_BLOCKED_LEFT)
{
// fai qualcosa qui...
}
else if (Message()=MSG_BLOCKED_RIGHT)
{
// fai qualcos'altro qui...
}
// ripulisci la variabile interna relativa all'ultimo messaggio letto
ClearMessage();
Per casi semplici questo è più che sufficiente. Se invece voui gestire una
conversazione asincrona, in cui i due RCX che comunicano si mandano più messaggi
in tempi piuttosto rapidi, devi struttura il tuo codice con un task dedicato
alla lettura dei messaggi e una coda di memorizzazione, da cui poi il codice
principale andrà ad attingere. Altrimenti rischi che nel tempo in cui esegui le
istruzioni relative ad un primo messaggio ne arrivi un secondo che va perso.
#define MAX_MSGS 5
int msg_count, msg[MAX_MSGS]; // lo stack dei messaggi
int cur_msg; // il messaggio corrente
task message_monitor()
// scansione messaggi in arrivo
{
while (true)
{
pop_msg();
if (Message()>0)
{
push_msg(Message());
ClearMessage();
}
}
}
void push_msg(int m)
// memorizza un messaggio nello stack dei messaggi
{
if (msg_count<MAX_MSGS)
{
msg[msg_count] = m;
msg_count++;
}
}
Il codice principale, quando è pronto per elaborare un messaggio, lo preleverà
dalla coda:
void pop_msg()
// preleva il primo messaggio dallo stack
{
if (msg_count>0)
{
msg_count--;
cur_msg = msg[msg_count];
}
else
{
cur_msg = MSG_NONE;
}
}
// ... dentro il task principale ...
while (true)
{
if (cur_msg=MSG_BLOCKED_LEFT)
{
// fai qualcosa qui
}
else if (cur_msg=MSG_BLOCKED_RIGHT)
{
// fai qualcos'altro qui
}
...
}
Infine, in caso di comunicazione incerta, quando non sei certo al 100% che tutti
i messaggi arrivano, dovresti implementare un protocollo di acknowledgement, in
cui il ricevente, dopo aver avuto un messaggio, invia un apposito di messaggio
di "ricevuto". L'RCX che invia, se entro un certo tempo non riceve questo
messaggio di acknowledgement, rimanda il messaggio precedente.
In altri casi, quando chi riceve deve eseguire una azione che può richiedere
molto tempo, è bene prevedere nel protocollo di scambio anche un messaggio di
"tutto fatto". Questo è tipico delle architetture master/slave, in cui un RCX
principale ne usa un'altro per compiti subordinati. Il master manda un messaggio
di richiesta, lo slave esegue l'azione e poi manda un "ok" per dire al master
che ha finito.
HTH
Ciao
Mario
|
|
Message has 1 Reply: | | Re: comunicazione infrarossi RCX
|
| "Mario Ferrari" <mario.ferrari@edis.it> ha scritto nel messaggio (...) grazie 1000 per gli esempi, appena posso mi metto a provare e poi ti dico ovviamente il doppio rcx mi serve per partecipare alla gara robotica e gestire piu' sensori/motori ecc (...) (18 years ago, 22-Feb-07, to lugnet.org.it.itlug)
|
Message is in Reply To:
| | comunicazione infrarossi RCX
|
| avete qualche codice di esempio x la comunicazione di dati tra due rcx? non so come procedere con l'nqc (non so come ricavare l'input della porta infrarossi o trasmettere l'output).. Grazie Silvio (18 years ago, 21-Feb-07, to lugnet.org.it.itlug)
|
4 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
This Message and its Replies on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|