Go Down

Topic: Arduino hackt die empfangenen serielle daten ab (Read 1 time) previous topic - next topic

milito

ok hier der code:
Code: [Select]

const int EN=24;

const int chipselect_mc = 49;
byte instruction;
byte adresse;
byte data;

const int kipp_left=30;//Pin digital 30
const int kipp_right=31;//pin digital 31
int left=0;
int right=0;

byte value;
//int tasterState = 0; //initialiesern der Statusabfrage-Variable des Tasters

#include <SD.h>    //SD-Library
#include <Wire.h> //i2c library
#include <SPI.h> //SPI- library




/*#############################################################################*/


/*###############################SD-Variablen###################################*/
int const chipSelect =53; //chipselect pin 53
File Datei;

char parameter;
char inByte; //kontroll $ bzw. ?
int index; //Position für Char Array (Buffer)
char Text[500]; //für die Parameter[i2c]
char Text2[400]; //für die Parameter SPI
/*##############################################################################*/

/*##################I2C- Scnanner ###############*/
byte checkfault; //errorvaraible für ack (12c)
byte address; //i2c adresse
int AnzDevices; //anzahl der i2c-devices
/*###############################################*/

/*###################I2C-COntrol#######################################################*/
byte error_check; //errorcheck variable enthält return-wert von Wire.endTransmission()
/*#####################################################################################*/

/*###########################################################HAUPTPROGRAMM#############################################################*/
void setup()
{
 //Serialport verbindung mit 9600Baudrate
 Serial.begin(9600);
 Wire.begin();//I2C-Vebindung initialisieren
 SPI.begin(); //SPI- initialisieren
 /*########LED Konfig#########*/
 pinMode(ledPin1, OUTPUT);
 pinMode(ledPin2,OUTPUT);
 
 /*#######ENABLE-PIN########*/
 pinMode(EN,OUTPUT);
 //digitalWrite(EN,LOW); //Standard Enablepin auf low->0V
 
 /*###########################*/
/*ChipSelect Pin , den standard als Ausgangs sonst geht SD library nicht*/
 pinMode(53, OUTPUT); //Sd-Karte
 pinMode(25, OUTPUT); //Microchip-Board
/*######################################################################*/

/*############################Taster-Konfig####################################*/
pinMode(kipp_left, INPUT_PULLUP); //kippstellung links in pin30 INPUT_PULLUP->interner pullup, somit pullup aktivieren
pinMode(kipp_right, INPUT_PULLUP);//kippstellung rechts in pin31 und wird input-widerstand aktiviert (intern)
/*kippleft= low -> linksstellung
  kippright= low= rechtsstellung
 kippleft & kippright = HIGH -> mittelstellung */
/*##############################################################################*/
}

void loop()
{
 //wird ein zeichen über Serialport empfangen?
 if (Serial.available() > 0)
 {
   //falls ja, schreibe diesen in inByte
   inByte = Serial.read();
 
 /*##################################I2C################################*/  
   //falls inByte= $ -> ASCII(36), Arduino im Sendemodus
     if (inByte==36)//falls $=36 ankommt arduino sendet, sonst empfangen
     {
       blink_send();
       read_SD();
     }//endif 36
     
     else //(inByte==38)
     {
       //blink_receive();
       if(!SD.begin(chipSelect))
       {
         Serial.println("No SD-card");
         return;
       }//end if Sd.begin
       //Serial.println("SD-card ok");
       //-----------überprüfen Datei da---------------------//
       // wenn ja= löscheu nd erstelle eine neue ,sonst//
       //wenn keine da, erstelle neue Datei//
         if(SD.exists("I2C.csv"))
         {
           SD.remove("I2C.csv");
           //Datei=SD.open("I2C.csv",O_CREAT | O_WRITE);
           //Datei.println("Anz_para ; Address ; Register ; Data ");
           //Datei.close();
           
         }//sd exists
         //falls Datei nicht vorhanden erstelle neue Datei
         //else
         //{
           //Datei=SD.open("I2C.csv",O_CREAT | O_WRITE);
           //Datei.println("Anz_para ; Address ; Register ; Data ");
           //Datei.close();
           
         //}//end else
         write_SD();
        }
       //endif
 
     if (inByte==63) //falls ?=63 in Byte dann führe funktion i2c-scan durch
     {
        i2c_scan();
     }
       /*###########ENABLE-PIN###############*/
        if(inByte==38) //empfängt & d.h. enable is true
          {
           digitalWrite(EN,HIGH);
           Serial.println("EN-EIN");
          }
         
         if(inByte==45)
          {
           single_control_i2c();
          }//endif
           
         if(inByte==47)
          {  
           read_out_i2c();
          }//endif
         
        if(inByte==43) //falls + ankommt -> enable pin disable
         {
           digitalWrite(EN,LOW);
           Serial.println("EN-AUS");
               
         }  
   //falls Arduino &(38) empfängt , d.h. er empfänngt von GUI
   
    /*###############################SPI###################################*/
     //falls Arduinio ascii(33)->! empfängt, dann soll er in datei für spi dieparameter schreiben  
       if(inByte==33)
       {
         write_sd_spi();
       }//endif
       
       //empfängt "#"
       else if (inByte==35)
       {
         read_sd_spi();
       }//endif
       
       //falls "=" empfangen wird//
       else if (inByte==61)
       {
         single_control_spi();
       }//end if
       
       //falls "*" empfangen wird//
       else if(inByte==42)
       {
         read_out_spi();
       }    
  }//endif Serial available

 
  /*######################################tasterabfrage#######################################################*/
    left = digitalRead(kipp_left);
    right = digitalRead(kipp_right);
    if(left == LOW)
    {
      digitalWrite(EN,HIGH);
      control_i2c(); //Aufruf der Funktion
      Serial.println("Linkssstellung an ");
      delay(100);
     
    }//endif left (i2c)
    /*Eventuell eine LED, falls control-i2c blink, falls nicht leuchtet bzw bleibt aus */
   
    if (right== LOW)
    {
      digitalWrite(EN,LOW);
      //control_spi();
      Serial.println("Rechtsstellung an");
      delay(100);
    }  
     
  /*##########################################################################################################*/    
}//end loop

/*############################################################################################################################################*/    

/*#######################################Funktionen#################################################################*/


/*##################blinken beim senden an GUI##################*/
void blink_send()
{
 digitalWrite(ledPin1,HIGH);
 delay(500);
 digitalWrite(ledPin1,LOW);
 delay(500);
}
/*##############################################################*/


/*################blinken beim empfangen von gui################*/
void blink_receive()
{
 digitalWrite(ledPin2,HIGH);
 delay(500);
 digitalWrite(ledPin2,LOW);
 delay(500);
}
/*###############################################################*/


/*################auslesen von SD karte [i2c](i2c.csv)#####################*/
void read_SD()
{
 Serial.println("-----------------------------------");
 Serial.println("Initializing SD card...");
 if(!SD.begin(chipSelect))
 {
   Serial.println("---------------------------------");
   Serial.println("Initialization failed");
   return; //tue nichts
 }
 Serial.println("-----------------------------------");
 Serial.println("SD Card initialized");
 
 
 //Datei öffnen
 Datei=SD.open("I2C.csv");
 
 if(Datei)
 {
   Serial.println("===file content===");
   
   //lese solange etas in txt enthalten ist
   while(Datei.available())
   {
    //delay(30);
    Serial.write(Datei.read());
   
   //wenn nicht klappt mit delay dann innerhalb der whileschleife char inhalt = Datei.read(); und ausßerhalb Serial.write(inhalt);
   }//end while
   
   //außerhalb dann Serial.write(inhalt);
   //close file
   Datei.close();
 
   Serial.println("===end===");
 }//endif
 else
 {
   Serial.println("-----------------------------------");
   Serial.println("Error opening file");
 }//end else
 
}//end fu
         
/*##############################################################################################*/


/*#################################Schreiben auf SD-Karte(I2C)##########################################*/
void write_SD()
{
 //wiederhole die schleife,solange ein Zeichen an Serialport anliegt
 //und Buffer nicht überschritten wird
 Datei=SD.open("I2C.csv",O_CREAT | O_WRITE);
 Datei.println("Anz_Parameter; Address; Register; Data");
 Datei.close();
 if (Serial.available()>0)
 {
   while((Serial.available()))
   {
     Datei=SD.open("I2C.csv",FILE_WRITE);
   //Datei=SD.open("I2C.csv", O_CREAT | O_WRITE);
   Datei.print(parameter = Serial.read());
   Datei.close();
   
     }//end while
 }//end if
}//end fu

jurs


inByte = Serial.read();


Da liest Du in der loop-Funktion ja schon immer ein Zeichen weg, bevor die Funktion "write_SD()" mit der geposteten while-Schleife überhaupt aufgerufen wird:
inByte = Serial.read();

Warum wunderst Du Dich dann, dass Dir in der Funktion "write_SD()" genau dieses eine schon vorher ausgelesene Zeichen zum Speichern auf der SD-Karte fehlt?

milito

wie sorry das verstehe ich gerade nicht ? wo meinst du das?

milito

#18
Aug 17, 2013, 12:06 am Last Edit: Aug 17, 2013, 12:41 am by milito Reason: 1
ok, sollte ich dafür eine andere variable nehmen?
Also hab es weiterhin getestet, manchmal hackt er das nicht ab , aber meistens. also ich verstehe nichts mehr :(
habe mal zwei bilder von der ausgabe zum anschauen mal mit hochgeladen, vllt is es deutlicher

jurs


ok, sollte ich dafür eine andere variable nehmen?


Ne, beschreib mal lieber das gesendete Protokoll in Worten!
Und zwar das gesamte gesendete Protokoll, nicht nur die Zeichen, die auf SD-Karte gespeichert werden sollen. Und in allen Datails.

Wenn das Protokoll in sich sauber und logisch korrekt formulierbar ist, mit irgendeiner fehlertoleranten Art der Synchronisierung, z.B. eine Sendepause zwischen zwei Zeilen, die man per Timeout erkennen kann, oder ein Zeilenende-Steuerzeichen (Carriage Return oder Linefeed oder beides), dann läßt sich das mit irgendeinem sauber strukturierten Code auch wieder auseinanderpflücken.

Du pflückst das was ankommt, falsch auseinander. Und deshalb landet das was ankommt, in Deiner Programmlogik nicht da, wo es aufschlagen sollte. Z.B. die mit Semikolon gesendeten Zahlen erst (meistens) ab der zweiten Zahl auf der SD-Karte, weil die erste Zahl schon vorher aus dem seriellen Puffer ausgelesen wird und auf irgendwas anderes geprüft wird, insbesondere auf "if (inByte==36)". Wenn da als "inByte" aber schon das erste Zeichen gelesen wurde aus der Zeile, die eigentlich komplett gespeichert werden sollte, dann fehlt in der zu speichernden Zeile das vorher als "inByte" ausgelesene Zeichen am Anfang der Zeile.

milito

Danke jurs :D wirklich dein Letzter Beitrag war sehr hilfreich. Hab das Protokolliert und siehe and es lag an dem if(inbyte==36) ... else... bei else. hab das els mit einem if (inbyte =37) ersetztz da ich mit den 2;0;= ein sonderzeichen mitsende am anfang. d.h. %2;0;0 somit wird das dann richtig gespeichert. Danke sehr und danke an alle ;).

Go Up