moro Postat Septembrie 24, 2012 Partajează Postat Septembrie 24, 2012 Salut, de ceva vreme ma bate gandul sa fac un aeromodel cu comada wireles, momentan is blocat la partea de comunicare pe care vreau s-o fac cu modulul uart, folosesc mikroC ca si compilator si PIC18F4585 Am urmatorul cod char rxdat[3]; char *po;int i;void main() {trisc.rc6=0;trisc.rc7=1;UART1_Init(38400); Delay_ms(100);rxdat[0]=0x00; // defaul byte 1rxdat[1]=0xFF; // default byte 2rxdat[2]=0x02; // default byte 3while (1) { for(i=3;i--;) { po = &rxdat[i]; UART1_Write(po); delay_ms(500); } }Simularea o fac deocamdata in proteus cu un virtual terminal cuplat la PIC care este setat sa afiseze in hexa si dilema este de ce daca trimit acei 3 bytes definiti pe terminal apar urmatoarele 1B 1A 19 si nicidecum 00 FF 02 si nu inteleg de ce.... in schimb daca modific in Uart1_Write(po) si pun uart1_write(rxdat) le afiseaza corect in hex, deocamdata am simulat doar codul asta ca sa inteleg cum lucrez cu bytes si pointeri Eu vreau sa indic un anumit byte care imi vine pe RX ( rxdat) si sa-l il trimit pe serial TX sau catre un port pe 8 biti [b0...B7] Multumesc Link spre comentariu
Liviu M Postat Septembrie 24, 2012 Partajează Postat Septembrie 24, 2012 Mie mi se pare ca ai cam ametit pointerii aia. Un array este un pointer (numele array-ului e adresa primului element), asa ca daca vrei sa-l aloci unui pointer o poti face direct (p=a e echivalent cu p=&a[0], adica p contine adresa lui a[0]). Ca sa accesezi valoarea continuta la adresa indicata de p trebuie sa folosesti derefenetierea (sau indirectarea sau cum s-or traduce "dereferncing or indirection"): x = *p. Ceea ce transmite la tine comada UART1_Write(po); e adresa variabilelor, nu variabilele in sine. Ca sa transmiti variabilele trebuie sa scrii UART1_Write(*po); Si cum un exemplu are sanse sa fie mai clar, codul de mai jos mie imi functioneaza corect: #include <stdio.h>void main(void){ unsigned char cTest[] = {0x01, 0x10, 0xFF}; unsigned char *pcTest; char cIdx; pcTest = cTest; for (cIdx=0; cIdx<3; cIdx++) { printf("cIdx = %d, cTest= %x\n", cIdx, *pcTest); *pcTest++; } }PS Esti sigur ca ai scris bine for-ul ala? Link spre comentariu
Vizitator Postat Septembrie 24, 2012 Partajează Postat Septembrie 24, 2012 PS Esti sigur ca ai scris bine for-ul ala?Merge sigur:- În C, orice număr diferit de zero este evaluat ca adevărat, zero este evaluat ca fals.- Expresia i-- întoarce i, după care îl decrementează.- Bucla se execută cât timp condiţia este adevărată, adică diferită de 0. În programul din primul mesaj, se execută bucla de 3 ori.- Am testa bucla şi practic, în GCC. Merge.- Recunosc, pe asta n-o ştiam. Dacă n-ai fi întrebat, n-aş fi observat şi nu m-aş fi gândit să fac tot raţionamentul. Link spre comentariu
moro Postat Septembrie 24, 2012 Autor Partajează Postat Septembrie 24, 2012 Buna seara, am incercat sa inlocuiesc in Uart1_write(*po) si se pare ca functioneaza corect codul , ma tot miram cum naiba pointez catre o adresa din array si nu imi returneaza ce trebuie... La mine oricum este primul proiect cu pic care implica trasnfer de date..Va multumesc mult ! 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