mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probelm mit array in einer Funktion


Autor: Sebastian Z. (sz1985)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe in meinem Programm eine Funktion, die nach verschiedenen 
Kriterien Daten in ein array schreibt, einen CRC errechnet und 
anschließend sendet. Ich habe aktuell das Problem, dass die Daten aus 
der ersten Switch Anweisung (Fall 0x03) richtig gesendet werden, aber 
die Daten aus der zweiten Anweisung (Fall 0x08 & 0x0E) nur teilweise 
richtig gesendet werden. Hier passen die Werte der ersten zwei und der 
letzten 2 Bytes nicht(send[0], send[1], und der Wert für den CRC, der in 
das array gespeichert wird). Wenn ich aber zum Schluss z.B. den Wert vom 
CRC direkt sende passen die Werte.

void send_response(unsigned short length, volatile unsigned char *data_ptr, volatile unsigned int *reg_ptr)
{
unsigned char send[length+2];
unsigned short CRC = 0;
unsigned char n = 0;
unsigned char i = 0;
unsigned int temp = 0;
unsigned int x = 0;
unsigned int y = 0;


send[0] = 0x11;
send[1] = *(data_ptr+1);

switch (*(data_ptr+1) )                        //Auswahl der Funktion zum Zusammenbau des Sendearrays abhängig vom FC
{
  case 0x03:  
          send[2] = length-3;
          n = *(data_ptr+5);
          temp = *(data_ptr+2) *256 + *(data_ptr+3);    //Startadresse der zu lesenden Registern  !!Änderung von reg_ptr auf data_ptr!!!      

          for(i=3; i<(n*2+3); i=i+2)
          {
          send[i] = *(reg_ptr+temp)>>8;
          send[(i+1)] = *(reg_ptr+temp);
          temp = temp + 1;
          }
          break;

  case 0x08:    switch (*(data_ptr+3))
          {
          i=6;
          
          case 0x0E:  
                //send[0] = 0x11; Problem trotzdem vorhanden
                //send[1] = 0x08;
                send[2] = 0x00,
                send[3] = 0x0E;
                send[4] = cpt_4 >> 8;
                send[5] = cpt_4;
                break;

          };
          break;           

};
//Berechnung der Checksumme für die response anhand der zu sendenden Daten und der Bootschaftslänge ohne CRC
CRC = CRC16 (send, length);                      

send[i] = CRC;
i= i +1;
send[i] = (CRC>>8);


//Senden der response
if(status_send == 1)
{
for(i=0; i<length+2; i++)
{
USART_Transmit(send[i]);
}
}

Hat einer von euch eine Idee, wo hier das Problem liegen könnte.


Vielen Dank.

Gruss

Sebi

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Z. schrieb:

> Hat einer von euch eine Idee, wo hier das Problem liegen könnte.

Dein Hauptproblem ist deine scheusliche Codeformatierung

Wenn ich das mal etwas umformatiere
  case 0x08:
    switch (*(data_ptr+3))
    {
      i=6;
          
      case 0x0E:  
        //send[0] = 0x11; Problem trotzdem vorhanden
        //send[1] = 0x08;
        send[2] = 0x00,
        send[3] = 0x0E;
        send[4] = cpt_4 >> 8;
        send[5] = cpt_4;
        break;
    };
    break;           

};

dann sieht man, dass das i=6 an einer Stelle steht, an der es nie 
ausgeführt wird.

Der Wert von i ist aber kritisch, weil er danach noch gebraucht wird. Er 
sollte eigentlich 6 sein, ist aber tatsächlich noch 0. Zu allem 
Überfluss überprüfst du auch nicht ob i einen vernünftigen Wert (!=0) 
hat, ehe du dann mit der CRC weitermachst, ob also überhaupt einer der 
switch-cases genommen wurde oder ob die Funktion ungültige Daten 
bekommen hat. Mit einer derartigen Prüfung wäre es dir eventuell sogar 
aufgefallen, dass im Falle 0x08 0x0E überhaupt nichts gesendet wird, 
weil i immer noch 0 ist.
Und durch deine Codeformatierung hast du das alles so angeordnet, dass 
es nicht auf den ersten Blick auffällt. Ich habs auch erst gemerkt, 
nachdem ich den Code in Gedanken umformatiert habe, weil ich es hasse, 2 
Anweisungen in einer Zeile zu haben.

PS: Hinter deinen ganzen } brauchst du keinen ;
Der verwirrt mehr als er nützt. Und an bestimmten STellen würde dieser ; 
sogar für Ärger sorgen. ALso gewöhn ihn dir besser gleich wieder ab.

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.