Sari la conținut
ELFORUM - Forumul electronistilor

Problema cu comunicare UART


moro

Postări Recomandate

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
  • Răspunsuri 3
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • moro

    2

  • Liviu M

    1

Zile populare

Top autori în acest subiect

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

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. :dans:
Link spre comentariu

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări