Sunteți pe pagina 1din 21

Universitatea Tehnică “Gheorghe Asachi” din Iaşi

Facultatea de Automatică şi Calculatoare


Domeniul: Ingineria sistemelor
Specializarea: Automatică şi Informatică Aplicată
Anul universitar: 2018-2019

Proiect

Comunicaţii în sisteme de conducere

-Tema 1-

Student: Grupa:

Lupu Alexandru 1401A

Vârgă Silviu 1404B


Cuprins
1. Tema proiectului ................................................................ 3
2. Prezentarea resurselor HW şi SW utilizate ..................... 4
3. Protocolul Master-Slave .................................................... 7
4. Programul principal........................................................... 9
5. Pregătirea mesajelor pentru transmisie ......................... 11
6. Transmisia mesajelor ....................................................... 13
7. Recepţia mesajelor ........................................................... 15
8. Concluzii............................................................................ 21
1. Tema proiectului
Folosind microsistemul MicroPac 515C să se implementeze un protocol de comunicaţie
serială de tip master-slave, având următoarele caracteristici:

1. Port COM0 (RS-232) - folosind modemul radio Satel 1870E


2. Parametri comunicaţie 9600 Baud, 8 biţi de date, paritate pară, 1 bit de STOP
3. Formatul mesajului Caracterul „:‟
Adresă HW nod destinaţie
Cod funcţie: 0 sau 1
Destinatia sau sursa mesajului, după caz
Lungime date
Date
Cod detectare erori – LRC (+)
4. Codificare mesaj ASCII hex

Formatul mesajelor:

Start Adresă Cod Sursă (master) Lungime Date Suma de Sfârşit


mesaj destinaţie funcţie Destinaţie (slave) control mesaj
2Ah 1 octet 1 octet 1 octet 1 octet Lungime 1 octet 0Dh,
0Ah

Obs.:
 Câmpul adresă destinaţie va conţine adresa nodului care va recepţiona mesajul.
 Câmpul cod funcţie poate fi, după caz:
• 0 – mesaj de interogare (lungime date = 0) – transmis de master către un
nod slave sau de slave către master, în lipsa altui mesaj util
• 1 – mesaj de date – mesaj care conţine un text ASCII

 Câmpul sursă/destinaţie va indica:


• pentru un mesaj de tip 1 transmis de nodul master – sursa mesajului
• pentru un mesaj de tip 1 transmis de un nod slave – destinaţia finală a
mesajului

 Câmpul lungime reprezintă numărul de octeţi al câmpului de date;


 Octetul din câmpul suma de control va fi calculat ca suma aritmetică a tuturor octeţilor
din câmpurile anterioare(cu neglijarea bitului de transport), luată cu semn opus.

 Mesajul va fi codificat in ASCII HEX și transmis, octet cu octet, portului serial


COM0(de exemplu octetul 2Ah va fi transmis ca doi octeți: „2‟ = 32h și „A‟ = 41h, în
această ordine.
2. Prezentarea resurselor HW şi SW utilizate
MicroPac C515C este un sistem de dezvoltare ce folosește un microcontroler Infineon C515C.

Caracteristici tehnice ale microcontrolerului C515C

Fig. 1 Structura microcontrolerului C515C

 variantă îmbunătăţită a microcontrolerului SAB 80C515A, compatibil MCS 51;


 memorie program internă de până la 64Kocteţi (cu excepţia variantei C515C-L,
utilizată şi de sistemele MicroPac 515C din laborator);
 interfaţă pentru memoria program de 64Kocteţi;
 256 octeţi de memorie RAM internă;
 2 Kocteţi de memorie XRAM internă;
 interfaţă pentru memorie de date externă de până la 64Kocteţi;
arhitectură internă compatibilă MCS 51, cu 8 registre DPTR în loc de unul singur;
 frecvenţă de tact de până la 10MHz, fără divizor de frecvenţă (ciclu maşină de 1
μs la 6 MHz, respectiv de 600ns la 10MHz – varianta din laborator).
 48+1 linii I/E digitale cvasibidirecţionale ,8 intrări analogice
 3 timere de 16 biţi (T0, T1 şi T2, ultimul prevăzut şi cu facilităţi de comparare-
captură);
 convertor A/D de 10 biţi cu autocalibrare;
 port serial UART compatibil MCS51, cu generator de tact programabil;
 port serial sincron SSC (compatibil SPI – Serial Peripheral Interface);
 modul CAN (Controller Area Network) integrat complet implementat;
 17 surse de întrerupere, organizate pe 4 niveluri;
 ceas de gardă;
 4 moduri de consum redus (Slow Down, Idle Mode, SW / HW Power Down).
Organizarea memoriei

Memoria program – varianta C515C-L, utilizată şi de sistemele MicroPac 515C nu are


memorie program internă, însă varianta C515C-8R dispune de 64 Kocteţi de ROM, iar C515C-
8E are 64 Kocteti de memorie OTP (One Time Programming). La aceste variante, accesul la
memoria internă ROM/OTP este validat prin aplicarea unui nivel logic „1” pe linia EA(External
Access). Toate aceste lucruri sunt ilustrate în figura următoare:

Fig. 2. Organizarea memoriei la microcontrolerele Infineon C515C

Memoria de date – singura diferenţă faţă de organizarea memoriei la un microcontroler


8052 este prezenţa, în spaţiul rezervat memoriei externe de date (XDATA), a unei memorii
interne de date de 2 Kocteţi (XRAM) şi a unei pagini de 256 de octeţi de memorie în care sunt
mapaţi regiştrii de interfaţă ai modulului CAN. Utilizarea acestor facilităţi suplimentare se poate
selecta explicit în configuraţia microcontrolerului (XMAP0=0 în SFR SYSCON).

Fig. 3 Special Function Register la microcontrolerele Infineon C515C

Caracteristici ale plăcii de dezvoltare  Pac C515C


 Interfețe de comuncație serială și asincronă

• COM0 (RS-232) - UART C515C – portul serial al microcontrolerului C515C;


• COM1 (RS-232), COM2 (RS-485) – un circuit extern DUART Philips
SC26C92, cu două canale independente full duplex;
• COM3 (RS-232) - UART AT89C2051 - portul serial al coprocesorului
AT89C2051;
• Porturile seriale pot lucra în modul asincron, cu 10 sau 11 biţi/caracter şi cu rate
de comunicaţie de până la 230,4 Kbps.
 Interfață CAN
C515C integrează pe cip un modul CAN (Controller Area Network) care implementează în
hardware versiunea 2.0B a protocolului CAN.

 I/E digitale

• 11 linii I/E programabile, de nivel TTL


• 8 linii de ieşire de curent mare (500mA);
• 4 linii de intrare şi 3 linii de ieşire TTL situate pe circuitul DUART Philips
• Liniile de intrare A/D pot fi de asemenea folosite ca intrări digitale.
• Atunci când coprocesorul AT89C2051 nu este instalat, mai rămân disponibile
încă 6 linii I/E de nivel TTL

 Intrări A/D

• 8 intrări multiplexate conectate la convertorul intern A/D cu rezoluţia de 10 biţi;


• durata unei conversii este de 9,6 μs (104 Keşantionări / sec).

 Ieşiri D/A
• 4 canale de ieşire D/A implementate cu un convertor extern AD7226 cu 4 canale;
• rezoluţia ieşirilor D/A este de 8 biţi.
• Interfaţă LCD - permite controlul oricărui afişaj cu cristale lichide bazat pe controlerele
HD44780, HD61830 şi compatibile.
• Conector extensie - magistralele de adrese şi date, liniile de reset şi de întrerupere sunt
disponibile la un conector cu 50 de pini pentru conectarea unor periferice externe.

Conectarea dintre placă și calculator


Comunicația între calculator și placa se realizează cu ajutorul a 2 programe: NoICE51 și
uVision3.
Programul NoICE51 este un program de interfaţă cu sistemul MicroPac 515C ce permite
încărcarea şi depanarea simbolică a aplicaţiilor la distanţă, la nivel de cod sursă, direct pe
sistemul cu microcontroler. NoICE permite o depanare avansată a programelor, în condiţii mult
mai apropiate de cele în care va funcţiona în final, fără utilizarea unui instrument sofisticat şi
scump de tip ICE – In-Circuit Emulator (no ICE).

Fig. 4. Interfața programului NoICE51


Programul µVision3 permite compilarea și hex-editarea programelor ce vor fi încărcate
ulterior pe placa cu ajutorul NoICE. Pentru utilizare, vom crea un proiect, în care vom introduce
ca librării fișierele: mp515.c, lcddrv.c, copdrv.c, cirque.c, mmio.a51 şi startup.a51, având astfel
acces la funcții predefinite.

Sistemul MicroPac 515C dispune de 4 porturi seriale:


• COM0 - Portul serial UART C515C – echipat cu un adaptor de linie RS.
• COM1 şi COM2 - două canale seriale furnizate de interfaţa externă DUART Philips
SC26C92. COM1 este echipat cu un adaptor RS-232, iar COM2 este echipat cu două
adaptoare RS-485.
• COM3 - Portul serial UART AT89C2051 – preprogramat şi echipat pentru a asigura o
interfaţă serială asincronă RS-232 bufferizată, full-duplex, la viteza de 9600 Baud.
Liniile seriale COM0, COM1 şi COM3 ale MicroPac 515C sunt accesibile la trei
conectori DB9 având o organizare RS-232 modificată, pentru a permite conectarea lor la PC
folosind un cablu cu conexiuni directe pin la pin, de tip DTE-DCE (Data Terminal Equipment –
Data Communication Equipment sau calculator- modem).
Din punctul de vedere al fluxului de date vehiculat, comunicaţia dintre două noduri
interconectate printr-o legătură serială RS-232 poate fi de 3 tipuri:
• simplex – comunicaţie într-un singur sens, cu un singur flux de date: un nod doar
transmite (sursă), iar celălat doar primeşte date (destinaţie);
• duplex – comunicaţie în ambele sensuri, cu două fluxuri de date independente: nodurile
pot transmite şi primi date simultan (ambele noduri pot fi atât sursă cât şi destinaţie);
• half-duplex - comunicaţie în ambele sensuri, cu două fluxuri de date întreţesute:
nodurile pot transmite şi primi date, dar nu simultan (un nod poate fi la un moment dat fie
sursă, fie destinaţie).

3. Protocolul Master-Slave

Pentru a forma o rețea de comunicație, este nevoie de o placă (nod) care să gestioneze
fluxul de mesaje dintre restul plăcilor conectate. Astfel, nodul master deţine controlul reţelei şi
acordă nodurilor slave, pe rând, permisiunea de a transmite date de-a lungul retealei. Nodurile
slave au ca responsabilitate să citească mesajele de la master pentru a afla când au dreptul de a
transmite date. Avantajul acestei organizări este acela că nodurile slave pot primi mesaje numai
de la master şi nu vor trebui să citească răspunsurile celorlalte noduri slave.

Tehnica master / slave este o tehnică de acces la mediu cu control centralizat. Dreptul de
acces este acordat de către master pe rând, în mod ciclic, fiecărui nod slave, printr-un mesaj
adresat acestuia. La primirea unui mesaj, un nod slave ştie că poate transmite la rândul lui un
mesaj, dar numai către nodul master. Astfel, dreptul de acces revine sistematic la nodul master,
care trece la următorul nod slave din lista circulară.

Principalele precizări ale standardului RS232 se referă la:


 modul de transmisie: serial asincron, bidirecțional (pe două linii de date separate)
 codificarea informațiilor binare : prin nivele de tensiune sau curent (bucla de
curent) :
 1 logic – (-3V … -15V) ;
 0 logic – (+3V…-15V).
 structura informației elementare transmise :
 un bit de start (0 logic) ;
 5-8 biti de date ;
 bit de paritate (paritate pară sau impară) ;
 1-2 biti de stop (1 logic).

În tabelul de mai jos s-au indicat numele și semnificația celor mai importante semnale
definite de standardul RS232. De asemenea s-a indicat poziția acestor semnale pe un conector
de 25 pini și pe unul de 9 pini. Direcția este indicată între calculator (DTE) sș modem (DCE).

Nume Semnificația/Funcția Direcție Poziția pe Poziția


semnal DTE-DCE con.RK25 pe con.
RK9
RXD Receive Data - recepție date  3 2
TXD Transmit Data – transmisie date  2 3
GND Masa digitală -- 5
DTR Data Terminal Ready – terminal pregătit pentru  20 4
transmisie
DSR Data Set Ready – Pregătește dispozitiv pentru  6 6
transmisie
RTS Request To Send – Cerere de transmisie  4 7
CTS Clear To Send – Pregătit pentru transmisie  5 8
RI Ring – sonerie  22 9
CD Carrier Detect – detecție purtătoare  8 1

Ca avantaje ale acestei metode putem enumera:


 fiecare nod primeşte dreptul de acces în reţea într-un timp finit, indiferent de numărul de
mesaje pe care le au de transmis nodurile.
 pe termen lung, fiecare nod are aceleaşi şanse de a transmite date în reţea;
 determinism – fiecare nod primeşte dreptul de acces într-un timp predictabil.

Ca dezavantaje ale acestei metode putem enumera:


 nodul master are o încărcare mult mai mare decât nodurile slave cu sarcini de
comunicaţie;
 un mesaj de la un nod slave pentru un alt nod slave apare în reţea de două ori;
 căderea nodului master determină blocarea comunicaţiei.
4. Programul principal
Pentru început în funcția principală vom face câteva inițializări necesare flow-ului de transmisie
-recepție a datelor, cum ar fi:

 Inițializăm LCD – folosit pentru afișarea datelor transmise


 Inițializăm coprocesor tastatură și comunicația cu acesta
 Inițializăm portul serial COM0 – cu 9600 Baud, validare transmisie și recepție fără
întreruperi
 Inițializăm timer-ul T0
 Inițializăm bufferele pentru mesaje pentru toate nodurile, cuprinzând : inițializare
câmpuri adresă de către master, inițializare câmpuri adresă de către slave, precum și
punerea primului caracter în buffer-ele ASCII „ : ”

În continuare, tot flow-ul programului principal se va desfășura într-o buclă infinită.


Încă de la început vom verifica dacă nodul pe care rulează programul este master / slave. Dacă
nodul este master și dacă nu există un mesaj ASCII de transmis către slave i, atunci se va folosi
un mesaj de interogare.
După aceasta etapă, se va calcula suma de control, se va face conversia binar-ascii, după care
transmite mesajul către slave-ul i. Slave-ul i va răspunde cu un mesaj și va realiza conversia
ascii-binar.
Odată apelate cele 2 funcții de TxMesaj(), respectiv RxMesaj(), se va apela o funcție de afișare a
mesajului recepționat, în cazul nostru Afisare_mesaj(), dupa care va trece la următorul nod slave.

Dacă în schimb, nodul pe care ruleaza programul este slave, atunci se va duce pe ramura “else”
in care se vor parcurge urmatoarele etape:
 Se asteapta un raspuns de la master (RxMesaj()) unde se va realiza si conversia ascii-
binar.,
 Se cauta un mesaj de transmis in bufferele de transmisie, sare peste propriul buffer (de
receptie), iar dacă nu a fost gasit niciun mesaj de transmis va iesi din bucla “for”.
 Dacă este gasit un mesaj ASCII de transmis, se va apela ca si functie Pregatire_mesaj(),
unde se va calcula suma de control si conversia binar-ascii.
 Transmite mesajul cu destinatia nodul i (prin intermediul masterului)

Dacă nu s-a transmis niciun mesaj de date, atunci se va transmite un mesaj de interogare, după
care se vor apela funcțiile de Pregătire_mesaj() -> în care se calculează suma de control și
conversia binar- ascii, TxMesaj() – transmite mesajul de interogare către master.
în cazul in care primim un mesaj, se va afișa folosind functia Afisare_mesaj();

Periodic vom verifica dacă s-a apasat o tasta, iar dacă s-a efectuat, atunci vom trata comanda
transmisie mesaj. După câteva adaptări, vor interveni câteva verificări privind buffer-ul. Mai
precis ne vom întreba dacă buffer-ul este plin sau nu. În caz afirmativ, se va afișa un mesaj
“Buffer Plin” și totul va continua cu refacerea meniului comenzi.
5. Pregătirea mesajelor pentru transmisie
Funcția de pregătire a mesajului de transmis are scopul de a forma mesajul ce se va
transmite în rețea între noduri și respectă cerințele de format impuse în proiect. Astfel, un mesaj
va putea fi interpretat corect la recepție. La orice transmisie, mesajul va fi fie de tip interogare
sau de tip date. Diferențierea se realizează prin codul funcției care va fi “0” pentru interogare și
“1” pentru date.

 Mesaj de interogare – pregătirea mesajului constă în calcularea sumei


de control care în acest caz coincide cu adresa nodului ce transmite;
 Mesaj de date – pregătirea mesajului constă în calcularea sumei de
control care în acest caz depinde de adresa nodului, codul funcției, lungimea
datelor și datele de transmis.

După ce au fost încărcate în bufferul binar, are loc conversia datelor ce compun
mesajul în cod ASCII, încărcarea acestora în bufferul ASCII împreună cu delimitatorii de mesaj
convertiți și ei la rândul lor în cod ASCII.
Implementare:

void Pregatire_mesaj(int i){ // pregatire mesaj pentru transmisie catre nodul


i
unsigned char sc; // suma de control
unsigned char *ptr; // pointer
int j; // contor
if(retea[i].bufbin.functie==POLL) // Dacă este un mesaj de interogare (POLL=0)
{
retea[i].bufbin.sc=retea[i].bufbin.adresa;// atunci suma de control este
egala cu adresa HW a nodului destinatie
}
else
{ // altfel...
sc=retea[i].bufbin.adresa; // initializeaza SC cu adresa HW a nodului
destinatie
sc+=retea[i].bufbin.functie;// ia in calcul codul functiei
sc+=retea[i].bufbin.destsrc;// ia in calcul adresa nodului destinatie sau
sursa a mesajului
sc+=retea[i].bufbin.lng; // ia in calcul lungimea datelor
for(j=0;j<retea[i].bufbin.lng;j++) // ia in calcul datele
sc+=retea[i].bufbin.date[j];

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)// dacă 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(j=0;j<retea[i].bufbin.lng;j++)
{
bin2ascii(retea[i].bufbin.date[j],ptr); // pune in bufasc
datele
ptr+=2;
}
}
bin2ascii(retea[i].bufbin.sc,ptr);// pune in bufasc SC
ptr+=2;
*ptr=0x0d;
ptr++; // pune in bufasc CR
*ptr=0x0a; // pune in bufasc LF
}
6. Transmisia mesajelor

Funcția de transmisie a mesajelor, fie ele de interogare sau de date, calulează mai întâi
bitul de paritate, apoi transmite caracterul de început de mesaj „:‟. După acest caracter se trimit
pe rând toate datele păstrate în bufferul ASCII. Dacă nodul este slave, după ce transmite, golește
bufferul. Ieșirea din funcție are loc după ce se transmit toate caracterele din buffer.

Pentru implementarea algoritmului se folosește inițial o buclă do...while, în interiorul


căreia au loc inițializări de variabile (ACC si TB8 – calculează bitul de paritate) și trimite pe
portul COM0, valoarea lui *ptr cu delay=1(revine fără a aștepta terminarea transmisiei). Inițial
valoarea lui *ptr este caracterul „:” deoarece cu acest caracter începe un mesaj. Se transmite
mesajul, caracter cu caracter până întâlnește valoarea 0x0A care indică sfârșit de mesaj. Se
verifică dacă transmisia a avut loc cu succes, dacă nu, se reia interogarea până se termină de
transmis întreg mesajul.
Implementare:

void TxMesaj(int i){


unsigned char *ptr;
ptr=retea[i].bufasc;

do
{
ACC=*ptr;
TB8=P;
Ser_Send_Byte(COM0,*ptr,1);
}
while(*ptr++!=0x0a);
if (ADR_NOD!=MASTER)
{
retea[i].full=0;
}
while(Ser_SND_Done(COM0)==0);

}
7. Recepţia mesajelor
Funcția de recepție este cea mai complexă funcție din cele 3, ea având ca responsabilități:
decodificarea mesajului din ASCII în binar, identificarea nodului destinație – dacă este nod
master sau nod slave și avertizarea operatorului cu privire la posibile erori ce pot apărea la
recepție(erori legate de suma de control, erori de suprapunere, depășirea timeout-ului, eroare
determinată de codul funcției).
Dacă este nodul master cel care recepționează, el așteaptă cu timeout sosirea caracterului
„:‟, iar dacă nodul este slave așteaptă fără timeout recepția caracterului de început de mesaj de la
master. Datele recepționate sunt decodificate și pe baza a ceea ce s-a recepționat, se recalculează
suma de control ce va fi comparată cu suma ce a fost trasmisă. Dacă cele două nu coincid, este
afișată o eroare pe LCD.

MASTER-ul asteaptă (reprezentat prin timeout cu delay 1000) recepția primului caracter
al răspunsului de la SLAVE. Dacă timeout = 1 (se termină perioada de ațteptare), se termină
recepția. Dacă primul caracter primit de la slave este diferit de „:‟ (repezintă primul character al
unui mesaj), se ignoră restul mesajului și se iese din funcție. Dacă primul caracter este „:‟ se sare
peste prima poziție și asteaptă primirea primului și celui de-al doilea caracter al adresei
hardware, atâta timp cât perioada de delay este diferită de 1. Dacă adresa celui de-al doilea
caracter este diferită de adresa nodului, se afișază un mesaj de eroare și se ignoră restul
mesajului
SLAVE-ul asteaptă, atât timp cât timeout este diferit de 1, primirea primului caracter al
răspunsului de la MASTER. Așteaptă primirea primului caracter al mesajului transmis de către
MASTER până când acel caracter este „:‟. Atunci când s-a găsit caracterul de început de mesaj,
se sare peste prima poziție și așteaptă primirea primului și celui de-al doilea caracter al adresei
hardware, atât timp cât perioada de delay este diferită de 1. Toți acești pași de repeat până când
mesajul este adresat acestui SLAVE.
Se pune în buffer restul mesajului atât timp cât timeout-ul nu este depășit și cât ultimul
caracter este diferit de 0x0A. Se sare peste primele 3 poziții ale mesajului, care reprezintă
caracterul „:‟ și adresa ASCII-HEX. Dacă mesajul este de date, se determină dacă este destinație
(M) sau sursa (S) iar adresei hardware, pe lângă codul funcției i se mai adaugă și adresa
(destinație sau sursă). Dacă nodul este MASTER si dacă bufferul destinație este deja plin, se
termină recepția și se iese din funcție. Adresei hardware i se mai adaugă și lungimea datelor.
Dacă nodul este MASTER, se stochează în bufferul destinație codul funcției, codul
nodului sursă al mesajului și lungimea datelor.
Dacă nodul este SLAVE, se stochează în bufferul destinație codul funcției, codul
nodului sursă al mesajului și lungimea datelor.
Dacă mesajul nu este de date, se iese din funcție. De asemenea tot în acest timp se
calculează şi suma de control, care este verificată la sfârsit cu suma de control primită în mesaj.

Implementare:

unsigned char j, ch, sc, adresa, screc, destsrc, lng, functie, *ptr, *ptrbin;
if(ADR_NOD==MASTER)
{
ch=Ser_Receive_TMO(COM0, 1000);
if(timeout)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}
retea[i].full=0;
if(ch!=':')
{
error("Eroare incadrare");
do
{
ch=Ser_Receive_TMO(COM0,5);
} while(timeout==0);
return;
}

ptr=retea[i].bufasc+1;
*ptr++=Ser_Receive_TMO(COM0,5);
if(timeout)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;
}

*ptr--=Ser_Receive_TMO(COM0,5);
if(timeout)
{
timeout=0;
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;
}
}
else{
do{

do
{
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)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;

}
*ptr--=Ser_Receive_TMO(COM0,5);
if(timeout)
{
timeout=0;
error("Timeout nod");
LCD_Putchar(i+'0');
return;

}
adresa=ascii2bin(ptr);
}while(adresa!=ADR_NOD);

}
ptr++;
do
{
*(++ptr) = Ser_Receive_TMO(COM0,5);
if(timeout)
{
timeout=0;
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;
if(ADR_NOD==MASTER)
{
retea[destsrc].bufbin.functie = functie ;
retea[destsrc].bufbin.destsrc = i ;
retea[destsrc].bufbin.lng = lng ;
for(j = 0,ptrbin = retea[destsrc].bufbin.date;j<lng;j++)
{
ch = ascii2bin(ptr);
ptr+=2;
*ptrbin = ch;
screc+=ch;
ptrbin++;
}
sc = ascii2bin(ptr);
if (sc==screc)
{
retea[destsrc].full = 1 ;
return;
}
error("Eroare SC!");
return;

retea[ADR_NOD].bufbin.functie = functie ;
retea[ADR_NOD].bufbin.destsrc = destsrc ;
retea[ADR_NOD].bufbin.lng = lng ;
for(j = 0,ptrbin = retea[ADR_NOD].bufbin.date;j<lng;j++)
{
ch = ascii2bin(ptr);
ptr+=2;
*ptrbin = ch;
screc+=ch;
ptrbin++;
}
sc = ascii2bin(ptr);
if(sc==screc)
{
retea[ADR_NOD].full = 1 ;
return;
}

error("Eroare SC!");
return;

}
}

8. Concluzii
Aplicatia dispune de o interfață cu operatorul local constând într-un meniu afișat pe
LCD-ul fiecărui nod din rețeaua de comunicație:
Pe prima linie sunt afișate: master/slave, adresă nod, COM0/COM2, ASCII/binar.
Pe a doua linie: RxM – adresă nod sursă - ultimul mesaj de date recepţionat cu succes
Pe a treia linie: 1 – TxM 2 – Stare
Pe a patra linie: afișarea mesajului ce se dorește a fi transmis (comanda TxM)/ conținutul
bufferului de transmisie (comanda Stare).

Dacă nodul este master și operatorul dorește execuția comenzii TxM trebuie să se
introducă adresa nodului destinație și apoi mesajul de transmis. Dacă dorește execuția comenzii
Stare, trebuie să introducă adresa nodului solicitat, pentru ca apoi să se afișeze pe LCD starea
bufferului de transmisie a respectivului nod.
Dacă nodul este slave se așteaptă mesaj de la master sau apăsarea unei taste de către
operator. Sosirea de la master a unui mesaj de date este confirmată prin afișarea acestuia pe linia
a doua a LCD-ului. Dacă nodul slave vrea să transmită un mesaj de date, operatorul trebuie să
introducă adresa nodului destinație apoi mesajul

S-ar putea să vă placă și