hallo, ich möchte Daten per Rs232 übertragen. dafür habe ich mir diese untere Funktion geschrieben. Bevor ich ein Kommando schicken möchte ich erst die VT und CRC drauf hängen. beim compilieren komme ich auf die Fehlermeldung "cast to pointer from integer of different size". ich habe viele printf reingeschrieben, um nur zu gucken wo mein program hängt. ich hast schon mehr mal gegoogelt und komme aber immer noch nicht weiter... wie könnte ich sie Prüfsumme casten um sie in VT anhägen zu können. Danke im Voraus void SendViaRS232(int ComPort, unsigned char *string, uint8_t CRC) { int commandLen, i = 0; char VT[50] = "\v"; char c= (unsigned char)CRC; printf("\nhahahaaa\n"); strcat((char *)VT, (const char*)c); // hier kommt die Meldung printf("\bbbbbbbbbbbbb\n"); strcat((char *)string, (const char*)VT); commandLen = strlen((const char*)string); RS232_flushTX(ComPort); for (i = 0; i <= commandLen; ++i) { RS232_SendByte(ComPort, string[i]); Sleep(10); RS232_flushTX(ComPort); } }
Sicher, dass du den Eingabe-String verändern willst? So ginge es:
1 | void SendViaRS232(int ComPort, const unsigned char *string, uint8_t CRC) |
2 | {
|
3 | char VT[50] = "\v"; |
4 | |
5 | VT [1] = CRC; |
6 | strncpy (VT+2, string, sizeof(VT)-2); |
7 | size_t commandLen = strlen(VT); |
8 | if (commandLen > sizeof(VT)) commandLen=sizeof(VT); // Kann passieren wenn string zu lang |
9 | |
10 | RS232_flushTX(ComPort); |
11 | |
12 | for (size_t i = 0; i <= commandLen; ++i) |
13 | {
|
14 | RS232_SendByte(ComPort, string[i]); |
15 | Sleep(10); |
16 | RS232_flushTX(ComPort); |
17 | }
|
18 | }
|
Variablen braucht man nicht am Funktionsanfang deklarieren. Das macht man am besten so spät wie möglich, dann kann man sie nicht versehentlich benutzen wenn sie noch keinen Wert haben. Verwende außerdem size_t für String/Array-Längen - z.B. auf AMD64 ist "int" meistens 32bit, und damit zu klein. size_t hat immer automatisch die richtige Größe. Nutze "const char*" um den String nicht versehentlich zu verändern. Da du eh jedes Byte einzeln sendest, kannst du dir den Puffer sparen:
1 | void SendViaRS232(int ComPort, const unsigned char *string, uint8_t CRC) |
2 | {
|
3 | RS232_flushTX(ComPort); |
4 | RS232_SendByte(ComPort, '\v'); |
5 | Sleep(10); |
6 | RS232_flushTX(ComPort); |
7 | RS232_SendByte(ComPort, CRC); |
8 | Sleep(10); |
9 | RS232_flushTX(ComPort); |
10 | while (*string) { |
11 | RS232_SendByte(ComPort, *string); |
12 | ++string; |
13 | Sleep(10); |
14 | RS232_flushTX(ComPort); |
15 | }
|
16 | }
|
Siehe ggf. auch Serialisierung.
Niklas G. schrieb: >
1 | void SendViaRS232(int ComPort, const unsigned char *string, uint8_t |
2 | > CRC) |
3 | > { |
4 | > char VT[50] = "\v"; |
5 | >
|
6 | > VT [1] = CRC; |
7 | > strncpy (VT+2, string, sizeof(VT)-2); |
8 | > size_t commandLen = strlen(VT); |
9 | > if (commandLen > sizeof(VT)) commandLen=sizeof(VT); // Kann passieren |
10 | > wenn string zu lang |
11 | >
|
12 | > RS232_flushTX(ComPort); |
13 | >
|
14 | > for (size_t i = 0; i <= commandLen; ++i) |
15 | > { |
16 | > RS232_SendByte(ComPort, string[i]); |
17 | > Sleep(10); |
18 | > RS232_flushTX(ComPort); |
19 | > } |
20 | > } |
>
Danke für deine Rückmeldung.
ich hätte noch eine Bemerkung:
was ich mache möchte ist diese VT und CRC ganz am ende jede Kommando
anhängen. das hießt man könnte V[1] = CRC nicht schreiben.
Kaiser K. schrieb: > was ich mache möchte ist diese VT und CRC ganz am ende jede Kommando > anhängen. das hießt man könnte V[1] = CRC nicht schreiben. Achso, das war an deinem Code nicht ersichtlich. Dann musst du die Anweisungen tauschen.
Niklas G. schrieb: > Achso, das war an deinem Code nicht ersichtlich. Dann musst du die > Anweisungen tauschen. ja mache ich Vielen Dank noch mal
Ein char ist kein String und der Cast erzeugt einen Pointer ins Nirgendwo: char c= (unsigned char)CRC (const char*)c
Kaiser K. schrieb: > char VT[50] = "\v"; > char c= (unsigned char)CRC; > > strcat((char *)VT, (const char*)c); // hier kommt die Meldung strcat erwartet zwei Adressen auf jeweils einen Speicherbereich, deren Inhalt Nullterminiert ist. Die Adresse von einem Objekt bekommt man in C mit dem Adressoperator. Das wäre dann &c. Da aber c nur ein Zeichen aufnehmen kann, ist kein Platz für die '\0'. Daher funktioniert das auch nicht (obwohl keine Fehlermeldung mehr kommt).
Wenn ich sowas sehen:
1 | for (i = 0; i <= commandLen; ++i) |
2 | {
|
3 | RS232_SendByte(ComPort, string[i]); |
4 | Sleep(10); |
5 | RS232_flushTX(ComPort); |
6 | }
|
klingen bei mir die Alarmglocken. In 99.99% der Fälle ist das ein Zeichen, dass die SendByte-Routine falsch implementiert ist. Mit ner korrekten Implementation wird deine Routine trivial:
1 | void SendViaRS232(int ComPort, unsigned char *string, uint8_t CRC) |
2 | {
|
3 | while (*string) |
4 | RS232_SendByte(ComPort, *string++); |
5 | RS232_SendByte(ComPort, '\v'); |
6 | RS232_SendByte(ComPort, CRC); |
7 | }
|
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.