Forum: Mikrocontroller und Digitale Elektronik Problem mit Konvertierung unsigned char * to char *


von Matthias (Gast)


Lesenswert?

Hallo,

ich habe eine Funktion:
1
void SendUART(char* zeig);
mit der ein String z.b. mit dem Aufruf:
1
SendUART("P");
gesendet werden kann.


Auf der anderen Seite habe ich eine I2C-Implementierung mit folgendem 
Prototypen:
1
unsigned char TWI_Get_Data_From_Transceiver( unsigned char *, unsigned char );
Die so implementiert ist:
1
unsigned char TWI_Get_Data_From_Transceiver( unsigned char *msg, unsigned char msgSize )
2
{
3
  unsigned char i;
4
5
  while ( TWI_Transceiver_Busy() );             // Wait until TWI is ready for next transmission.
6
7
  if( TWI_statusReg.lastTransOK )               // Last transmission competed successfully.              
8
  {                                             
9
    for ( i=0; i<msgSize; i++ )                 // Copy data from Transceiver buffer.
10
    {
11
      msg[ i ] = TWI_buf[ i ];
12
    }
13
  }
14
  return( TWI_statusReg.lastTransOK );                                   
15
}


ich möchte das was als
1
unsigned char *msg
 zurückgegeben wird per UART senden.

Der Code ist wie folgt aufgebaut
1
int main(void)
2
{
3
  TWI_Master_Initialise();
4
  InituC();
5
  InitUART();
6
  unsigned char write_addr0[2] ={0xd0,0x00};
7
  unsigned char read[2] ={0xd1,0x00};
8
  char * ra_pt = &read[0];
9
  unsigned char read_in;
10
    while(1)
11
    {
12
    _delay_ms(100);
13
    TWI_Start_Transceiver_With_Data(write_addr0 , 2);
14
    _delay_ms(100);
15
    TWI_Start_Transceiver();
16
    _delay_ms(100);
17
    read_in=TWI_Get_Data_From_Transceiver( read, 1); //!!!Z1!!!
18
    if (read_in > 0)
19
    {
20
      SendUART(ra_pt);
21
    }
22
  }
23
}

Nun finde ich keine Möglichkeit den in Z1 mit read zurückgegebenen wert 
in die SendUART-Funktion zu packen...
Es scheitert immer an einer
1
invalid conversion from 'unsigned char*' to 'char*'

Hat vielleicht jemand eine Idee, wie eine solche Konvertierung gelingen 
kann?

Grüße und vielen Dank,
Matthias

von Carl D. (jcw2)


Lesenswert?

1
...
2
 unsigned char read[2] ={0xd1,0x00};
3
- char * ra_pt = &read[0];
4
+ unsigned char * ra_pt = &read[0];
5
...

von Rolf M. (rmagnus)


Lesenswert?

Matthias schrieb:
> Hat vielleicht jemand eine Idee, wie eine solche Konvertierung gelingen
> kann?

Mit einem cast.
1
read_in=TWI_Get_Data_From_Transceiver((unsigned char*)ra_pt, 1); //!!!Z1!!!

Da aber dein SendUART anscheinend einen nullterminierten String 
erwartet, muss sichergestellt sein, dass auf die Daten am Ende eine 0 
folgt und sie selbst keine 0 enthalten. Wenn du das nicht garantieren 
kannst, kannst du die Funktion dafür nicht nutzen.

von Carl D. (jcw2)


Lesenswert?

Rolf M. schrieb:
> Matthias schrieb:
>> Hat vielleicht jemand eine Idee, wie eine solche Konvertierung gelingen
>> kann?
>
> Mit einem cast.
>
1
> read_in=TWI_Get_Data_From_Transceiver((unsigned char*)ra_pt, 1); 
2
> //!!!Z1!!!
3
>
>
> Da aber dein SendUART anscheinend einen nullterminierten String
> erwartet, muss sichergestellt sein, dass auf die Daten am Ende eine 0
> folgt und sie selbst keine 0 enthalten. Wenn du das nicht garantieren
> kannst, kannst du die Funktion dafür nicht nutzen.

Er hat doch einen char* der auf einen unsigned char Puffer zeigt.
Da liegt der Fehler.

von Rolf M. (rmagnus)


Lesenswert?

Carl D. schrieb:
> Er hat doch einen char* der auf einen unsigned char Puffer zeigt.
> Da liegt der Fehler.

Seine Zielfunktion, an die er es übergibt, will aber ja gerade einen 
char* haben.

von Carl D. (jcw2)


Lesenswert?

Rolf M. schrieb:
> Carl D. schrieb:
>> Er hat doch einen char* der auf einen unsigned char Puffer zeigt.
>> Da liegt der Fehler.
>
> Seine Zielfunktion, an die er es übergibt, will aber ja gerade einen
> char* haben.

Na dann soll er den cast eben dort einmal machen und nicht vorher 
n-fach.

von Rolf M. (rmagnus)


Lesenswert?

Carl D. schrieb:
> Na dann soll er den cast eben dort einmal machen und nicht vorher
> n-fach.

Ja eben. Ich hatte ihn halt auf die andere Seite gemacht, aber das macht 
keinen großen Unterschied:

Rolf M. schrieb:
> Mit einem cast.
> read_in=TWI_Get_Data_From_Transceiver((unsigned char*)ra_pt, 1); //!!!Z1!!!

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.