cast to pointer from integer of different size.

OP #5532513
Lesenswert?
• ▲
▼
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);
  }
}
Persönliche Seite #5532527
Lesenswert?
• ▲
▼
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.
OP #5532585
Lesenswert?
• ▲
▼
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.
#5532628
Lesenswert?
• ▲
▼
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).
Gast #5532672
Lesenswert?
• ▲
▼
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
}

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.