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
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,...)
Martin Kattner schrieb: > Irgendwo muss/müssen da Fehler sein. Da ist kaum eine richtige Zeile. Lies ein C-Buch.
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ß
Mit malloc ohne free macht man sich aber auch keine Freunde.
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 | }
|
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!!
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
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 :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.