Strings wollen nicht verbunden werden

OP (Firma: Student) #2359032
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
#2359074
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ß
#2359083
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
}
OP (Firma: Student) #2359084
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!!
Gast #2359089
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
OP (Firma: Student) #2359306
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren