Forum: Compiler & IDEs Strings wollen nicht verbunden werden


von Martin K. (Firma: Student) (mkattinger)


Lesenswert?

Hallo,
ich möchte Strings zusammenfügen und anschließend über die UART 
rausschicken.

Aufruf:
rs485_send_packet(0x01, 0x33, "Data");

Methode:
void rs485_send_packet(  const unsigned char* type,
      const unsigned char* dest,       const unsigned char* data)
{
  unsigned char* packet;

  // Das RS485 Paket erzeugen
  *packet = *type;
  *packet = strcat(*packet, *dest);
  *packet = strcat(*packet, RS485_ADDRESS);
  *packet = strcat(*packet, 1 + 1 + 1 + strlen(*data) + 1) ;
  *packet = strcat(*packet, *data);
  *packet = strcat(*packet, crc16(*packet));

  uart_puts(*packet);
}

Irgendwo muss/müssen da Fehler sein.

danke für euer Hilfe,
Martin

von Achim W. (Gast)


Lesenswert?

char* xxx:
xxx ist ein Pointer auf char, und nicht *xxx

deshalb meine ich, es müsste in der Art sein:
strcat(xxx, ..); anstatt strcat(*xxx,...)

von Helfer (Gast)


Lesenswert?

Martin Kattner schrieb:
> Irgendwo muss/müssen da Fehler sein.

Da ist kaum eine richtige Zeile.
Lies ein C-Buch.

von Jean P. (fubu1000)


Lesenswert?

Hi,

Martin Kattner schrieb:
> void rs485_send_packet(  const unsigned char* type,
>       const unsigned char* dest,       const unsigned char* data)
> {
>   unsigned char* packet;
>
>   // Das RS485 Paket erzeugen
>   *packet = *type;
>   *packet = strcat(*packet, *dest);
>   *packet = strcat(*packet, RS485_ADDRESS);
>   *packet = strcat(*packet, 1 + 1 + 1 + strlen(*data) + 1) ;
>   *packet = strcat(*packet, *data);
>   *packet = strcat(*packet, crc16(*packet));
>
>   uart_puts(*packet);
> }
1
void rs485_send_packet(  const unsigned char* type,
2
                         const unsigned char* dest,       
3
                         const unsigned char* data)
4
{
5
   uint8_t* packet = (uint8_t*) malloc(strlen(type)+
6
                                       strlen(dest)+
7
                                       strlen(RS485_ADDRESS)+
8
                                       //sizeof(RS_485ADDRESS)+
9
                                       strlen(data)+
10
                                       6);
11
   strcpy(packet, type);
12
   strcat(packet, dest);
13
   strcat(packet, RS_485_ADDRESS);
14
   //uint8_t address[sizeof(RS_485ADDRESS)+1);
15
   //itoa(RS_485ADDRESS, address, 10);
16
   //strcat(packet, address);
17
   strcat(packet, data);
18
   //uint16_t crc;
19
   //uint8_t crc_str[6];
20
   //crc = crc16(packet);
21
   //itoa(crc, crc_str, 10);
22
   //strcat(packet, crc_str);
23
   strcat(packet, crc16(packet));
24
25
   uart_puts(packet);
26
}
Die auskommentierten Sachen sind optional, falls RS_485ADDRESS ne Zahl 
und kein string und crc16 ne Zahl und keinen string zurück liefert.
P.S.: und alles ohne Gewähr, nur schnell alles mal zusammen gereimt aus 
dem Kopf.

Helfer schrieb:
> Da ist kaum eine richtige Zeile.
> Lies ein C-Buch.
Das klingt zwar hart, ist aber leider die Wahrheit und das sollte er 
tun.

Gruß

von (prx) A. K. (prx)


Lesenswert?

Mit malloc ohne free macht man sich aber auch keine Freunde.

von Martin K. (Firma: Student) (mkattinger)


Lesenswert?

Danke!!!

von Jean P. (fubu1000)


Lesenswert?

Autsch, danke A.K.,
 das war dann wohl doch etwas zu fix ;-(
1
void rs485_send_packet(  const unsigned char* type,
2
                         const unsigned char* dest,       
3
                         const unsigned char* data)
4
{
5
   uint8_t* packet = (uint8_t*) malloc(strlen(type)+
6
                                       strlen(dest)+
7
                                       strlen(RS485_ADDRESS)+
8
                                       //sizeof(RS_485ADDRESS)+
9
                                       strlen(data)+
10
                                       6);
11
   strcpy(packet, type);
12
   strcat(packet, dest);
13
   strcat(packet, RS_485_ADDRESS);
14
   //uint8_t address[sizeof(RS_485ADDRESS)+1);
15
   //itoa(RS_485ADDRESS, address, 10);
16
   //strcat(packet, address);
17
   strcat(packet, data);
18
   //uint16_t crc;
19
   //uint8_t crc_str[6];
20
   //crc = crc16(packet);
21
   //itoa(crc, crc_str, 10);
22
   //strcat(packet, crc_str);
23
   strcat(packet, crc16(packet));
24
25
   uart_puts(packet);
26
   free(packet);
27
}

von Martin K. (Firma: Student) (mkattinger)


Lesenswert?

Ja, ein C-Buch wäre wiedermal nicht schelcht. Habe das letzte mal vor 
6-7 Jahren C Programmiert (Schule).

War zur Zeit eher mit "höheren" Sprachen beschäftigt. Java, C# ... da 
sind Zeichenketten komfortabler zu benützen.
Da erledigt die Runtime das allocieren :)

Trotz meines Unwissens: Danke für die Hilfe!!

von olf79 (Gast)


Lesenswert?

Sind das wirklich alles Strings? Also 0-terminierte Byte-Arrays?
Dann empfehle ich einfach etwas wie

char packet[200];
sprintf(packet,"%s%s%s",string1,string2,string3);

Wie ist denn crc16 deklariert?

Gruß
OLF79

von Klaus W. (mfgkw)


Lesenswert?

Und wozu überhaupt alle Teilstrings in einen langen String verpacken, 
nur um sie dann zu verschicken?
Da könnte man doch gleich die Teilstrings verschicken...

(So eine uneffektive Vorgehensweise gewöhnt man sich in Sprachen wie 
Java oder C# an :-)

von Achim W. (Gast)


Lesenswert?

wahrscheinlich wegen der CRC Berechnung

von Martin K. (Firma: Student) (mkattinger)


Lesenswert?

Fertige Methode:

void rs485_send_packet(  const char type,
                         const char dest,
                         const char* data)
{
  unsigned int length;
  unsigned int crc = 0xFFFF; //Vorladewert
  length = 1 + 1 + 1 + 2 + strlen(data) + 2;

  uart_putc(type);
  crc = crc16_update(crc, type);

  uart_putc(dest);
  crc = crc16_update(crc, dest);

  uart_putc(RS485_ADDRESS);
  crc = crc16_update(crc, RS485_ADDRESS);

  uart_putc(length>>8);
  crc = crc16_update(crc, length>>8);

  uart_putc(length);
  crc = crc16_update(crc, length);

  uart_puts(data);
  crc = crc16_update_s(crc, data);

  uart_putc(crc>>8);

  uart_putc(crc);

}

Meine Meinung auch Ressourcenschonend.

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.
Lade...