Forum: Compiler & IDEs Referenzparameter richtig übergeben


von Christian S. (roehrenvorheizer)


Angehängte Dateien:

Lesenswert?

Hallo,

zur Zeit befasse ich mich mit Erweiterungen an diesem Projekt mit dem 
RFM70:

http://projects.weber-itam.de/?p=90
http://projects.web4clans.com/wp-content/plugins/download-monitor/download.php?id=1
http://homepage.hispeed.ch/peterfleury/group__pfleury__uart.html

In Grundfunktionen funktioniert die Übertragung per Funk, nur möchte ich 
noch zusätzliche Möglichkeiten ausnutzen, die das Modul bietet.
Kann mal bitte jemand die Übergabe dieses Pointers genau betrachten:
"buf[byte_ctr] = transmitSPI(0);"

hier mal grob die Konstellation im Programm:
1
uint8_t buffer[32];  //Zum Lesen des Sende-Registers mit readRegBuf.
2
unsigned char Buffer[10];  //->>> für ITOA
3
4
uint8_t receivePayload(uint8_t *payload)
5
{
6
    uint8_t len;
7
        readRegBuf(RFM70_CMD_RD_RX_PLOAD, payload, len);
8
}
9
10
11
void readRegBuf(uint8_t reg, uint8_t * buf, uint8_t len) 
12
{
13
buf[byte_ctr] = transmitSPI(0);
14
{
15
16
int main (void)
17
{
18
readRegBuf (0x10,buffer, 5 );  
19
}

Was nicht funktioniert, ist die Übergabe der Werte, auf die der Pointer 
"buf" zeigt, durch die verschiedenen Funktionen bis zur Ausgabe von 
"buffer" auf das UART. Innerhalb der Schleife in "readRegBuf" gelingt 
die Ausgabe der gelesenen fünf Bytes allerdings einwandfrei.

Kann mir da jemand auf die Sprünge helfen bitte?

mfG

______________________________
______________________________
in rfm70.c:
1
uint8_t receivePayload(uint8_t *payload)
2
{
3
    uint8_t len;
4
        readRegBuf(RFM70_CMD_RD_RX_PLOAD, payload, len);
5
  uart_puts((char*)buffer);      //
6
  uart_puts( "\n" );        // neue Zeile und Rücklauf
7
}
8
9
10
//************************RFM COMMAND and REGISTER****************************************//
11
// SPI(RFM70) commands  siehe Seite 12 Tabelle2, SPI-Commands  ***  ***  ***  ***  ***
12
void readRegBuf(uint8_t reg, uint8_t * buf, uint8_t len) 
13
{
14
  char Buffer[10];  //->>> für ITOA
15
    uint8_t status, byte_ctr, hilfsvariable;      //byte_ctr dient zum Mitzählen der gelesenen Bytes. 
16
    status = transmitSPI(reg); // Select register to write, and read status UINT8
17
18
    for(byte_ctr = 0; byte_ctr < len; byte_ctr++)
19
       buf[byte_ctr] = transmitSPI(0); // Perform SPI_RW to read UINT8 from RFM70  //Einfach Bytes mit Wert Null übertragen per SPI, bis die vorgegebene Anzahl erreicht ist.
20
21
/*
22
uart_puts("Register: ");
23
itoa( reg, Buffer, 10);
24
uart_puts((char*)Buffer);
25
uart_puts("  ");        // neue Zeile und line feed
26
27
uart_puts("Anzahl: ");
28
itoa( len, Buffer, 10);
29
uart_puts((char*)Buffer);
30
uart_puts("\n\r");        // neue Zeile und line feed
31
32
33
   for(byte_ctr = 0; byte_ctr < len; byte_ctr++)
34
    {
35
       hilfsvariable = transmitSPI(0); // Perform SPI_RW to read UINT8 from RFM70  //Einfach Bytes mit Wert Null übertragen per SPI, bis die vorgegebene Anzahl erreicht ist.
36
    itoa( hilfsvariable, Buffer, 10);
37
    uart_puts((char*)Buffer);
38
    uart_puts(" ");
39
    buf[byte_ctr] = hilfsvariable;
40
    }
41
*/
42
43
/*
44
Ausgabe auf Terminal:
45
Register: 10  Anzahl: 5
46
52 67 16 16 1
47
Register: 11  Anzahl: 5
48
53 67 16 16 2
49
Register: 12  Anzahl: 5
50
195 195 195 195 195
51
Register: 13  Anzahl: 5
52
196 196 196 196 196
53
Register: 14  Anzahl: 5
54
197 197 197 197 197
55
Register: 15  Anzahl: 5
56
198 198 198 198 198
57
Register: 16  Anzahl: 5
58
52 67 16 16 1
59
*/

_____________________________________________
in main.c:
1
uint8_t buffer[32];    //Zum Lesen des Sende-Registers mit readRegBuf.
2
unsigned char Buffer[10];  //->>> für ITOA
3
//falls etwas nicht stimmt, das unsigned hier und in RC5.h entfernen.
4
5
int main()
6
{
7
8
  uint8_t test[32]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','\n','\r'};
9
10
uint8_t  zaehlvariable, k = 0;  //eine Variable zum Testen der LCD-Ausgabe über itoa
11
12
  Begin();    //RFM70 starten
13
  setMode(0);    //1 als Empfänger, 0 als Sender
14
  setChannel(8);
15
16
  
17
  sendPayload(test,32, 0);    //für Sender ins Programm
18
  uart_puts("\n\r");        // neue Zeile und line feed
19
  for(k = 0x0A; k < 0x11; k++)  
20
  {
21
  readRegBuf (k, buffer, 5 );  //../main_sender_6.c:191: warning: passing argument 2 of 'readRegBuf' from incompatible pointer type
22
  uart_puts((char*)buffer);
23
  }
24
  uart_puts("\n\r");  // neue Zeile und line feed
25
}

von Mark B. (markbrandis)


Lesenswert?

Wer ruft denn diese Funktion hier auf?

uint8_t receivePayload(uint8_t *payload)

Der Aufrufer müsste meines Erachtens Speicher für das anlegen, worauf 
der Zeiger uint8_t *payload zeigt. Wo passiert das?

von Christian S. (roehrenvorheizer)


Angehängte Dateien:

Lesenswert?

Der Aufruf erfolgt von main aus. Dort ist "buffer" bereits angelegt.

siehe Anhang.

von Christian S. (roehrenvorheizer)


Lesenswert?

Man kann also von main aus die 32 Bit an Daten, die das Modul empfangen 
hat, sich anzeigen lassen mittels

if (receivePayload(buffer))    //für Empfänger ins Programm
{
     uart_puts((char*)buffer);  //für Empfänger ins Programm
     uart_puts("\n");      //für Empfänger ins Programm
}


aber ein direkter Aufruf aus main

for(k = 0x0A; k < 0x11; k++)
  {
  readRegBuf (k, buffer, 5 );
//../main_sender_6.c:191: warning: passing argument 2 of 'readRegBuf' 
from incompatible pointer type
  uart_puts((char*)buffer);
  }

geht nicht oder bringt kein plausibles Ergebnis. Ich blicke da leider 
nicht durch. Habe schon einiges ausprobiert, aber es war nicht das 
richtige dabei.

mfG

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.