www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Fehler bei scanf_s


Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

habe wie oben gesagt ein Problem mit der scanf_s. Ich möchte die CRC16 
für eine Modbuscom berechnen. Wenn ich die Werte fest vergebe ist das 
auch kein Problem. Nur wenn ich sie über scanf_s einlese, bekomme ich 
fehler in der Berechnung. Bzw ein Array wird nicht mit Daten gefüllt. 
Jemand ne Idee? Anbei der Code
#include <stdio.h>

// Berechnung CRC16
// ----------------
unsigned int CRC16(unsigned int crc, unsigned int data)
{
const unsigned int Poly16=0xA001;  //Generatorpolynom
unsigned int LSB, i;
crc = ((crc^data) | 0xFF00) & (crc | 0x00FF);
for (i=0; i<8; i++)
{
LSB=(crc & 0x0001);
crc=crc/2;
if (LSB)
crc=crc^Poly16;
}
return(crc);
}

int main()
{

/*unsigned*/ char NumData;  
/*unsigned*/ char InputByte; 
/*unsigned*/ char i,data[255]/*={01,43,14,01,00}*/; // Telegrammbuffer
unsigned char Crc_HByte,Crc_LByte; //
unsigned int Crc;

/*Einlesen des Wortes Problemzone*/
printf("Anzahl der Bytes: ");
scanf_s("%d",&NumData);
printf("Anzahl der Bytes = %d\n",NumData);

for (i=0; i<NumData;i++)
{
  printf("Wert Byte:" );
  scanf_s("%d",&InputByte);   
  data[i]= InputByte;
}
printf("Wert data: %d\n %d\n %d\n %d\n %d\n" ,data[0],data[1],data[2],data[3],data[4]);

/*keine Probleme*/
Crc=0xFFFF;
for (i=0; i<NumData; i++) 
{
Crc = CRC16 (Crc, data[i] );
}
Crc_LByte = (Crc & 0x00FF); // Low-Byte bestimmen
Crc_HByte = (Crc & 0xFF00) / 256; // High-Byte bestimmen

printf("LByte %d\n",Crc_LByte);
printf("HByte %d\n",Crc_HByte);
while (1)
{;
;}
}

Alles auf der Basis von Visual c++ 2005.

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falsches Forum?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
/*unsigned*/ char NumData;  
...
scanf_s("%d",&NumData);

Das geht schief. "%d" instruiert scanf, einen int-Pointer zu verwenden.

sizeof int != sizeof char

Damit wird also nicht nur der Speicher beschrieben, der für "NumData" 
reserviert ist, sondern auch noch andere Dinge, die in der gleichen 
Gegend abgelegt sind, hier also potentiell noch "InputByte" und/oder 
"i".

Du solltest einen passenderen Formatspezifizierer verwenden, allein, der 
C-Standard sieht keinen für diesen Fall passenden vor.
Also musst Du in einen int einlesen und danach umkopieren.

Autor: Bruno (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe das ein wenig umdeklariert und jetzt läuft die Sache. Habe einfach 
Integer genommen. Danke.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.