Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <c8051F040.h> // declaratii SFR
- #include <uart1.h>
- #include <Protocol.h>
- #include <UserIO.h>
- extern nod retea[]; // reteaua Master-Slave, cu 5 noduri
- extern unsigned char STARE_NOD; // starea initiala a nodului curent
- extern unsigned char TIP_NOD; // tip nod
- extern unsigned char ADR_MASTER; // adresa nodului master
- extern unsigned char timeout; // variabila globala care indica expirare timp de asteptare eveniment
- //***********************************************************************************************************
- unsigned char RxMesaj(unsigned char i); // primire mesaj de la nodul i
- unsigned char ascii2bin(unsigned char *ptr); // functie de conversie 2 caractere ASCII HEX in binar
- //***********************************************************************************************************
- unsigned char RxMesaj(unsigned char i){ // receptie mesaj
- unsigned char j, ch, sc, adresa_hw_dest, adresa_hw_src, screc, src, dest, lng, tipmes, *ptr;
- if (ADR_NOD == MASTER) // Daca nodul este master...
- {
- ch = UART1_Getch_TMO(1000); // M: asteapta cu timeout primul caracter al raspunsului de la slave
- if (timeout)
- {
- return TMO; // M: timeout, terminare receptie
- }
- else
- {
- retea[i].full = 0; // M: raspunsul de la slave vine, considera ca mesajul anterior a fost transmis cu succes
- if (ch != ADR_NOD)
- {
- do
- ch = UART1_Getch_TMO(5); // M: ignora restul mesajului
- while (!timeout);
- return ERA;
- }
- else
- {
- screc = ADR_NOD;
- adresa_hw_src = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= adresa_hw_src;
- if (ADR_NOD == SLAVE)
- ADR_MASTER = adresa_hw_src;
- tipmes = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- if (tipmes >= 2) {
- do
- ch = UART1_Getch_TMO(5); // M: ignora restul mesajului
- while (!timeout);
- return TIP;
- }
- screc ^= tipmes;
- if (tipmes == USER_MES) {
- src = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= src;
- dest = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= dest;
- if (ADR_NOD == MASTER) {
- if (retea[dest].full == 1) {
- do
- ch = UART1_Getch_TMO(5); // M: ignora restul mesajului
- while (!timeout);
- return OVR;
- }
- }
- lng = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= lng;
- if (ADR_NOD == MASTER){
- retea[dest].bufbin.adresa_hw_src = adresa_hw_src;
- retea[dest].bufbin.tipmes = tipmes;
- retea[dest].bufbin.src = src;
- retea[dest].bufbin.dest = dest;
- retea[dest].bufbin.lng = lng ;
- lng = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= lng;
- sc = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- if (sc == screc) {
- retea[dest].full = 1;
- return ROK;
- }
- else
- return ESC;
- }
- else{
- retea[ADR_NOD].bufbin.src = src;
- retea[ADR_NOD].bufbin.lng = lng;
- lng = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= lng;
- sc = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- if (sc == screc){
- retea[ADR_NOD].full = 1;
- return ROK;
- }
- else
- return ESC;
- }
- }
- else{
- sc = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- if (sc == screc)
- return ROK;
- else
- return ESC;
- }
- }
- }
- }
- else
- {
- do {
- do
- ch = UART1_Getch_TMO(5); // M: ignora restul mesajului
- while (!timeout);
- ch = UART1_Getch_TMO(2000 + ADR_NOD * 1000);
- if (timeout)
- return TMO;
- }
- while (ch != ADR_NOD);
- screc = ADR_NOD;
- adresa_hw_src = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= adresa_hw_src;
- if (ADR_NOD == SLAVE)
- ADR_MASTER = adresa_hw_src;
- tipmes = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- if (tipmes >= 2) {
- do
- ch = UART1_Getch_TMO(5); // M: ignora restul mesajului
- while (!timeout);
- return TIP;
- }
- screc ^= tipmes;
- if (tipmes == USER_MES) {
- src = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= src;
- dest = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= dest;
- if (ADR_NOD == MASTER) {
- if (retea[dest].full == 1) {
- do
- ch = UART1_Getch_TMO(5); // M: ignora restul mesajului
- while (!timeout);
- return OVR;
- }
- }
- lng = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= lng;
- if (ADR_NOD == MASTER){
- retea[dest].bufbin.adresa_hw_src = adresa_hw_src;
- retea[dest].bufbin.tipmes = tipmes;
- retea[dest].bufbin.src = src;
- retea[dest].bufbin.dest = dest;
- retea[dest].bufbin.lng = lng ;
- lng = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= lng;
- sc = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- if (sc == screc) {
- retea[dest].full = 1;
- return ROK;
- }
- else
- return ESC;
- }
- else{
- retea[ADR_NOD].bufbin.src = src;
- retea[ADR_NOD].bufbin.lng = lng;
- lng = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- screc ^= lng;
- sc = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- if (sc == screc){
- retea[ADR_NOD].full = 1;
- return ROK;
- }
- else
- return ESC;
- }
- }
- else{
- sc = UART1_Getch_TMO(5);
- if (timeout)
- return CAN;
- if (sc == screc)
- return ROK;
- else
- return ESC;
- }
- }
- }
- //***********************************************************************************************************
- unsigned char ascii2bin(unsigned char *ptr){ // converteste doua caractere ASCII HEX de la adresa ptr
- unsigned char bin;
- if(*ptr > '9') bin = (*ptr++ - 'A' + 10) << 4; // contributia primului caracter daca este litera
- else bin = (*ptr++ - '0') << 4; // contributia primului caracter daca este cifra
- if(*ptr > '9') bin += (*ptr++ - 'A' + 10); // contributia celui de-al doilea caracter daca este litera
- else bin += (*ptr++ - '0'); // contributia celui de-al doilea caracter daca este cifra
- return bin;
- }
Add Comment
Please, Sign In to add comment