Forum: PC-Programmierung cast to pointer from integer of different size.


von Kaiser K. (kingkong_18)


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);
  }
}

von Niklas G. (erlkoenig) Benutzerseite


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.

von Kaiser K. (kingkong_18)


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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Kaiser K. (kingkong_18)


Lesenswert?

Niklas G. schrieb:
> Achso, das war an deinem Code nicht ersichtlich. Dann musst du die
> Anweisungen tauschen.

ja mache ich

Vielen Dank noch mal

von (prx) A. K. (prx)


Lesenswert?

Ein char ist kein String und der Cast erzeugt einen Pointer ins 
Nirgendwo:
   char c= (unsigned char)CRC
   (const char*)c

von Dirk B. (dirkb2)


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

von foobar (Gast)


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
}

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.