Pages: 1 [2]   Go Down
Author Topic: Arduino hackt die empfangenen serielle daten ab  (Read 1342 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok hier der code:
Code:
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
Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 172
Posts: 3245
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-sad
habe mal zwei bilder von der ausgabe zum anschauen mal mit hochgeladen, vllt is es deutlicher


* bild1.jpg (5.9 KB, 257x200 - viewed 16 times.)

* bild2.jpg (4.49 KB, 258x199 - viewed 17 times.)
« Last Edit: August 16, 2013, 05:41:48 pm by milito » Logged

Germany S-H
Offline Offline
Faraday Member
**
Karma: 172
Posts: 3245
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Sr. Member
****
Karma: 2
Posts: 272
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke jurs smiley-grin 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 smiley-wink.
Logged

Pages: 1 [2]   Go Up
Jump to: