costi002 Postat Septembrie 1, 2015 Partajează Postat Septembrie 1, 2015 (editat) Saluare, Incerc sa fac o functie, daca pot sa ii spun asa, care sa imi extraga nr de byte dintr-un array pana la un anumit grup de litere. Folosesc Mikroc, nu stiu daca este relevant. Din librariile lui folosesc functia : UART1_Read_Text(output, "OK", 64); care dupa ce receptioneaza caracterele OK imi pune la dispozitie array-ul "output" cu toate carecterele receptionate, cel putin asa am inteles eu. De exemplu eu trimit pe seriala MPtext1text2text3OK si vreau sa stiu cati byte sunt intre MP......OK. Am incercat varianta : unsigned int nr_byte=0;char output[64];....for(i=0;i<64;i++){if((output[i]==79)&&(output[i+1]==75)){nr_byte=i;}}//79=O,75=K dar nu regasesc valoarea utila in nr_byte. Am incercat si cu unsigned char nr_byte=0; dar tot nu vrea. Daca in schimb folosesc varianta nr_byte=(output[2]-48)*10+(output[3]-48) ; la comanda MA10test01test02OK unde 10 reprezinta nr de byte ce urmeaza sa fie utilizati merge corect, dar eu as dori ca acest numar sa fie calculat automat in limita a 64 byte. Orice idee este binevina. Toate bune Editat Septembrie 1, 2015 de costi002 Link spre comentariu
tes2000 Postat Septembrie 1, 2015 Partajează Postat Septembrie 1, 2015 1.probabil nu gaseste pentru ca nu opreste dupa ce l-a gasit (merge pana la 64) si poate gaseste ceva in buffer.2. Nu ai voie sa meraga pana la 64 dimensiunea este 64 si 64+1 este mai mare decat dimensiunea output[]poate asa: for(i=0;i<63;i++){if((output[i]==79)&&(output[i+1]==75)){nr_byte=i;break;}}//79=O,75=Kca sa fie vizibil ce cauti in array:for(i=0;i<63;i++){if((output[i]=='O')&&(output[i+1]=='K')){nr_byte=i;break;}} Link spre comentariu
mars01 Postat Septembrie 1, 2015 Partajează Postat Septembrie 1, 2015 (editat) Daca in schimb folosesc varianta nr_byte=(output[2]-48)*10+(output[3]-48) ; la comanda MA10test01test02OK unde 10 reprezinta nr de byte ce urmeaza sa fie utilizati merge corect, dar eu as dori ca acest numar sa fie calculat automat in limita a 64 byte. Nu prea inteleg ce vrei tu sa faci aici. Daca OUTPUT este aria de 64 caractere declarata mai sus iar "MA10test01test02OK" este continutul sau atunci tu cand faci: nr_byte=(output[2]-48)*10+(output[3]-48) ; dupa transformarea din ASCII in decimals ai output[2] = 1 si output[3] = 0 1 * 10 + 0 = 10 si intamplator fix acest numar de caractere este pana intalneste caracterele O si K. Pastrand ideea ta o functie de determinare nr caractere pana se intalnesc doua caractere predefinite este aceasta: unsigned int numara_bytes (char* buffer, const unsigned int buff_length, char ascii_1, char ascii_2) { unsigned int i; for(i = 0;i < buff_length;i++){ if((*(buffer + i) == ascii_1) && (*(buffer +i+1) == ascii_2)) return i; }} iar utilizarea sa ar fi ceva de genul: const unsigned int buffer_length = 64;unsigned int numarul_de_bytes;output[buffer_length] = "MA10test01test02OK";numarul_de_bytes = numara_bytes(*output, buffer_length, 79, 75); Editat Septembrie 1, 2015 de mars01 Link spre comentariu
mars01 Postat Septembrie 1, 2015 Partajează Postat Septembrie 1, 2015 (editat) si intamplator fix acest numar de caractere este pana intalneste caracterele O si K. Nu stiu ce am numarat mai devreme, dar nu sunt 10 caractere acolo, ci mai multe. Iar aici numarul_de_bytes = numara_bytes(*output, buffer_length, 79, 75); Mi-a ramas un '*' in plus. Corect este asa: numarul_de_bytes = numara_bytes(output, buffer_length, 79, 75); LE: Probabil functia ar fi mai OK sa returneze -1 in cazul in care nu gaseste caracterele speciale: int numara_bytes (char* buffer, const unsigned int buff_length, char ascii_1, char ascii_2) { int i; for(i = 0;i < buff_length;i++){ if((*(buffer + i) == ascii_1) && (*(buffer + i+1) == ascii_2)) return i; } return -1;} Si este apelata: const unsigned int buffer_length = 64;int numarul_de_bytes;output[buffer_length] = "MA10test01test02OK";numarul_de_bytes = numara_bytes(output, buffer_length, 79, 75); Editat Septembrie 1, 2015 de mars01 Link spre comentariu
costi002 Postat Septembrie 2, 2015 Autor Partajează Postat Septembrie 2, 2015 Multumesc pentru indrumari. Am incercat ambele variente, niciuna nu merge. Motivul: array-ul output nu se termina cu OK ci doar cu K, de ce asa, nu voi afla niciodata. Cum orice problema are cel putin o rezolvare, am optat pentru introducerea caracterului ! inainte de OK apoi sa il caut doar pe el. In acest fel for(i=0;i<64;i++){if(output[i]==33){nr_byte=i; break;}} totul este minunat. PS: ca fapt divers: ma asteptam ca break sa opreasca executia functiei if(output[i]==33) nu a for-ului dar nu este asa. Care ar fi motivul? Toate bune. Link spre comentariu
mars01 Postat Septembrie 5, 2015 Partajează Postat Septembrie 5, 2015 Citez din help-ul mikroC: "Break Statement Sometimes it is necessary to stop the loop within its body. Use the break statement within loops to pass control to the first statement following the innermost switch, for, while, or do block." Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum