Avatar billede area404 Nybegynder
05. april 2008 - 16:28 Der er 2 kommentarer og
1 løsning

Send / modtag data, 8 bit

Hej allesammen,

Jeg leger lidt med en PIC18 hvor jeg har et analogt input som conventeres til digital, samt 2 knapper.

Disse skal gerne pakkes ned i en pakke og sendes serielt til en anden PIC18. Til dette bruger jeg arrays. Hvordan vil jeg kunne pakke dem ud på den anden side igen? Med en en while loop som lytter efter startbittet og stopbittet?

Koden på sendersiden ser således ud:
Er det mon helt ved siden af?

  while(1)
      {
      // Recive data from ADC
      // ADCdata = read_adc();

      char data1[8];
        data1[0] = 0x01;      // Startbit
        data1[1] = read_adc(); // Analog input
        data1[2] = read_adc();
        data1[3] = read_adc();
        data1[4] = read_adc();
        data1[5] = read_adc();
      data1[6] = read_adc();
      data1[7] = 0x01;        //
      // Send data to Tx
      Tx == data1;
     
      // Break here, for reveiver...
      delay_us(250);

      char data2[8];
        data2[0] = 0x01;      // Startbit
        data2[1] = read_adc(); // Analog input
        data2[2] = read_adc();
        data2[3] = read_adc();
        data2[4] = page_up;    // Button status
        data2[5] = page_down;  // Button status
      data2[6] = 0x00;
      data2[7] = 0x01;        // Stopbit
 
      // Send data to Tx
      Tx == data2;
      } // While loop end
Avatar billede tobibobi Nybegynder
10. april 2008 - 20:08 #1
Du skal bruge en struct - det er meget mere enkelt end et array. derefter skal du blot lave en funktion der lytter efter start flaget hvorefter at du læser hvad der svarer til størrelsen af din struct (sizeof(struct my_package_t)) Det er klart den enkleste måde at sende data over en seriel forbindelse.
Avatar billede area404 Nybegynder
11. april 2008 - 09:21 #2
yep, har fået det hen nu, men jeg jeg havde også noget i tankerne omkring en check sum, for at forsikre at det rigtige bliver modtaget
Avatar billede tobibobi Nybegynder
11. april 2008 - 10:15 #3
Det kan sagtens lade sig gøre, jeg havde bare ikke så meget tid til at give et ordentligt svar - sorry. Her følger en lidt bedre uddybelse..


Først og fremmest vil jeg lade en seperat funktion lade scanne efter start flaget og her vil jeg stærkt anbefale at du bruger mere end en enkelt byte til at indikere starten på en pakke (ellers skal du til at bruge bit-stuffing hvilket bare øger kompleksiteten) Dernæst kan du lave en struct med en union region så den kan håndtere flere pakketyper:

eks:

struct my_package_t {
  char type;
  uint_16 checksum;
  union {
    struct
    {
      char adc[8];
    } analog;
    struct
    {
      char adc[4];
      char button_up;
      char button_down;
    } digital;   
  };
};

Så er metoden for transmission.
1. Fyld alle relevante data i strukturen:
  (husk at sætte type for at fortælle om det er en digital pakke el. analog)
2. Sæt checksums feltet til 0;
3. Udregn crc (eller hvad du nu finder på af checksums funktion) for hele strukturen.
4. sæt checksummen ind i checksums feltet.
5. Send startflag
6. Send pakke.

På modtagelsen:
1. lyt på seriel porten og vent indtil at et start flag bliver modtaget.
2. indlæs sizeof(struct my_package_t) bytes ind i et hukommelsesområde.
3. Typecast dette område til struct my_package_t *;
  struct my_package_t *package = (struct my_package_t *)pointer;
4. kopier checksums feltet ind i en lokal variabel.
5. sæt checksums feltet til 0
6. udfør checksums beregning på hele pakken
7. sammenlign med den beregnede checksum med værdien fra step 4.

Det skulle gerne være opskriften... held og lykke.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester