Documente Academic
Documente Profesional
Documente Cultură
Asachi" Iai,
Facultatea de Automatic i Calculatoare
Proiect
Comunicaii n sisteme de conducere
TEMA 1
Studenti:
Marius-Cosmin Tuluceanu
Andrei-Razvan Talaluta
0
Cuprins
1. Tema proiectului..................................................................................................... 2
2. Protocolul Master-Slave......................................................................................... 3
3. Programul principal.............................................................................................. 4
5. Transmisia mesajelor............................................................................................ 7
1
1. Tema proiectului
Formatul mesajelor:
Adres HW Cod Surs (master) Lungime Date Suma de
destinaie funcie Destinaie (slave) control
1 octet 1 octet 1 octet 1 octet Lungime 1 octet
Obs.:
Cmpul adres destinaie va conine adresa nodului care va recepiona mesajul.
Cmpul cod funcie poate fi, dup caz:
o 0 mesaj de interogare (lungime date = 0) transmis de master ctre un nod
slave sau de slave ctre master, n lipsa altui mesaj util
o 1 mesaj de date mesaj care conine un text ASCII
Cmpul surs/destinaie va indica:
o pentru un mesaj de tip 1 transmis de nodul master sursa mesajului
o pentru un mesaj de tip 1 transmis de un nod slave destinaia final a mesajului
Cmpul lungime reprezint numrul de octei al cmpului de date;
Octetul din cmpul suma de control va fi calculat ca suma modulo 2 (XOR) a
tuturor octeilor din cmpurile anterioare.
Mesajul va fi transmis n format binar, octet cu octet, portului serial COM0.
2
2. Protocolul Master-Slave
3
3. Programul principal
4
Reset
receptie mesaj
Afisare meniu
gol nod=0(master)
Verificam bufferul
plin gol
nod++; buffer(nod)
Pune mesaj de interogare (POLL)
in buffer(nod)
=
nod:ID
pregatire buffer(nod)
nu
nod++;
transmite mesaj(nod)
da nod=5?
nod=0
afisare mesaj (pentru master)
nu
nod=5? nod++;
nu pregatire mesaj(nod)
adresa buffer
preia destinatia
reface meniu
5
4. Pregtirea mesajelor pentru transmisie
6
for(j=0;j<retea[i].bufbin.lng;j++)
{
sc+=retea[i].bufbin.date[j]; // ia in calcul datele
}
retea[i].bufbin.sc=sc; // stocheaza suma de control
}
ptr = retea[i].bufasc+1; // initializare pointer pe bufferul ASCII
// salt peste ':'
bin2ascii(retea[i].bufbin.adresa,ptr);// pune in bufasc adresa HW in ASCII
ptr+=2;
bin2ascii(retea[i].bufbin.functie,ptr);// pune in bufasc codul functiei
ptr+=2;
if(retea[i].bufbin.functie==MES) // daca este un mesaj de date (MES)
{
bin2ascii(retea[i].bufbin.destsrc,ptr); // pune in bufasc destsrc
ptr+=2;
bin2ascii(retea[i].bufbin.lng,ptr); // pune in bufasc lng date
ptr+=2;
for(k=0;k<retea[i].bufbin.lng;k++)
{
bin2ascii(retea[i].bufbin.date[k],ptr);// pune in bufasc datele
ptr+=2;
}
}
bin2ascii(retea[i].bufbin.sc,ptr);
ptr+=2;
*ptr++=0x0D;
*ptr=0x0A;
}
7
Fig.5 - Schema bloc a functiei de pregatire a mesajului
5. Transmisia mesajelor
8
ptr++;
ACC=*ptr;
TB8=P; // transmite restul
caracterelor din bufferul ASCII
Ser_Send_Byte(COM0,*ptr,1);
} while(*ptr!=0x0A);
if(ADR_NOD!=MASTER)
{
retea[i].full=0; // slave-ul considera acum ca a
transmis mesajul
}
while(Ser_SND_Done(COM0)!=0);
return; // asteapta terminarea transmisiei
}
9
Fig. 6 Schema bloc a functiei de transmisie a unui mesaj
10
6. Recepia mesajelor descriere, schema logic i implementare
Ultima functie ce a ramas de tratat, este cea de receptie a mesajelor. Ea este cea
mai complaxa dintre toate, deoarece are ca responsabilitati de a decodifica mesajul
primit, de a indentifica carui tip de nod (master / slave) ii este destinat si de a notifica
utilizatorul legat de datele primite in buffer.
Pentru a implementa aceasta functie, am urmarit cu atentie schema logica
prezentata in Fig.8. Pe scurt aceasta functie, tine mereu seama daca nodul care primeste
un mesaj este de tip master / slave, si va intra in asteptarea caracterelor corecte. Daca se
intampla ca datele receptionate sa fie eronate, va ignora acele date (informand
utilizatorul) si va astepta informatii corecte. Dupa identificarea nodului, functia va avea o
parte comuna, cea de recunoastere a mesajului primit, apoi va identifica iarasi daca nodul
este master / slave pentru a vedea ce trebuie facut cu mesajul primit.
Respectand schema bloc prezentata am alcatuit urmatorul cod, pentru a
implementa functia:
void RxMesaj(int i){ // receptie mesaj in bufferul i
unsigned char j, ch, sc, adresa, screc, destsrc, lng, functie, *ptr,*ptrbin;
if(ADR_NOD==MASTER){
// Daca nodul este master...
ch=Ser_Receive_TMO(COM0, 1000);
// M: asteapta cu timeout primul caracter al raspunsului
de la slave
//error("Receptie...");
if(timeout==1){
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
else{
retea[i].full=0;
11
if(ch!=':')
{
error("Eroare incadrare");
do{
ch=Ser_Receive_TMO(COM0, 5);
}while(timeout==0);
return;
}
else{
ptr=retea[i].bufasc + 1;
*ptr++=Ser_Receive_TMO(COM0,5);
if(timeout==1){
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
*ptr--=Ser_Receive_TMO(COM0,5);
if(timeout==1){
error("Timeout nod");
LCD_Putchar(i+'0');
return ;
}
adresa=ascii2bin(ptr);
if(adresa!=ADR_NOD)
{
error("Eroare adresa!");
do{
ch=Ser_Receive_TMO(COM0, 5);
}while(timeout==0);
return ;
}
12
}
}
else{
do{
do{
//ignora mesaj
ch=Ser_Receive_TMO(COM0, 5);
}while(timeout==0);
do{
ch=Ser_Receive_Byte(COM0, 1);
}while(ch != ':');
ptr=retea[i].bufasc + 1;
*ptr++=Ser_Receive_TMO(COM0,5);
if(timeout==1){
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
*ptr--=Ser_Receive_TMO(COM0,5);
if(timeout==1){
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
adresa=ascii2bin(ptr);
}while(adresa != ADR_NOD);
}
ptr++;
13
do{
*(++ptr) = Ser_Receive_TMO(COM0,5);
if(timeout==1){
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
}while(*ptr != 0x0A);
ptr=retea[i].bufasc + 3;
screc=adresa;
functie=ascii2bin(ptr);
ptr+=2;
if(functie >= 2 ){
error("Eroare cod functie!");
return;
}
screc += functie;
if(functie==MES){
destsrc = ascii2bin(ptr);
ptr += 2;
screc += destsrc;
if(ADR_NOD==MASTER){
if(retea[destsrc].full == 1){
error("Eroare de suprapunere!");
return;
}
}
lng = ascii2bin(ptr);
ptr += 2;
screc += lng;
14
if(ADR_NOD==MASTER){
retea[destsrc].bufbin.functie = functie ;
retea[destsrc].bufbin.destsrc = i ;
retea[destsrc].bufbin.lng = lng ;
for (j=0;j<retea[destsrc].bufbin.lng;j++){
retea[destsrc].bufbin.date[j]=ascii2bin(ptr);
ptr += 2;
screc += retea[destsrc].bufbin.date[j];
}
sc = ascii2bin(ptr);
if(sc == screc){
retea[destsrc].full = 1 ;
return;
}
else{
error("Eroare SC!");
return;
}
}else{
retea[ADR_NOD].bufbin.functie = functie ;
retea[ADR_NOD].bufbin.destsrc = destsrc ;
retea[ADR_NOD].bufbin.lng = lng ;
for (j=0;j<retea[ADR_NOD].bufbin.lng;j++){
retea[ADR_NOD].bufbin.date[j]=ascii2bin(ptr);
ptr += 2;
screc += retea[ADR_NOD].bufbin.date[j];
}
sc = ascii2bin(ptr);
if(sc == screc){
retea[ADR_NOD].full = 1 ;
15
return;
}
else{
error("Eroare SC!");
return;
}
}
}
else{
sc = ascii2bin(ptr);
if(sc == screc){
return;
}
else{
error("Eroare SC!");
return;
}
16
17
18
Fig. 8 - Schema bloc a fuctie de receptie
19