Sd Kartta Karsılastırma

Başlatan M_B, 11 Kasım 2014, 16:11:00

M_B

Merhaba arkadaslar;
Arduino ile SD karta ornek.txt şeklinde dosya kaydetip icerigini okuyabiliyorum.

Yapmak istediğim ise
ornek.txt icerisindeki veri ile dısardan gelen veriyi karşılastırmak

ornek.txt icerigi

1245
1256
8592
4523
4586
7456
....
gibi devam edıyor.
Dısardan gelen veri ile icerisindekileri karşılaştıracam.

Nasıl yaparım.


Ornek Kullanım:
/*
  SD card basic file example
 This example shows how to create and destroy an SD card file   
 The circuit:
 * SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4
 This example code is in the public domain.
 Not: Sistem normal olarak calisiyor. 
*/

#include <SD.h>		// include the SD card interface library
File myFile;	        // declare a file

void setup()
{
  Serial.begin(9600);
  Serial.print("Init SD card...\n");		
 						        
  
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4))
      {
      Serial.println("init failed!\n");	
      return;
      }
  Serial.println("init done.");
} // Setup sonu

				
void loop()
{

  //***********Yazma kismi**************//
  
  myFile = SD.open("test.txt", FILE_WRITE);		
                                                
												
  if (myFile)  									
  {
    Serial.print("Yaziyor test.txt...");     
    myFile.println("test 1, 2, 3.");			
    myFile.close();	                        	
    Serial.println("bitti.");					
  }
  else
  {
    Serial.println("hata acilmadi test.txt");	
  }
  
 //***********Okuma kismi***************//
  myFile = SD.open("test.txt");					
  if (myFile)
  {
      Serial.println("test.txt:");				
      while (myFile.available())				
        {						
        	Serial.write(myFile.read());
        }
  myFile.close();				       
  } //if sonu
  else
      {
        Serial.println("hata acilmadi test.txt");	
      }

  while(1);					      		
  
}// loop sonu


İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Kabil ATICI

#1
 myFile = SD.open("test.txt");               
  if (myFile)
  {
      Serial.println("test.txt:");            
      while (myFile.available())            
        {                  
        //   Serial.write(myFile.read()); //<<<burada..
if (myFile.Read()==degisken)
{
//...artık ne yapacaksan...
}

        }
  myFile.close();                   
  } //if sonu
--------------------
myFile.read() sanırım bu string olarak tanımlanmış bir değişken (emin değilim sd card kütüphanesine bak) o yüzden degisken olarak gelen veride string olması gerekir.(Serial.write(myFile.read()); olarak komut yazıldığı için)  Aksi durumda char olarak parçalayıp tek tek kontrol etmek gerekir.

Eğer tüm belge içinde myFile.read()  bütün olarak geliyorsa o zaman alt string parçalama yapman gerekir.
belge içinde \n arayarak parçalama yapman gerekir.

EK:
Gördüğüm kadarı ile o iş o kadar basit olmayabilir. Çünkü arduino sd ile kütüphanede tampon bellek oluşturuyor ve o bellekten alıp seriport üzerinden bilgisayara gönderiyor. İstediğin şeyi yapabilmek için kendi kütüphaneni oluşturman veya bu bölümü kendin için tekrar yazman gerekiyor.

Bu konu ile ilgili 13 kütüphane dosyası oluşturulmuş... SD kartı üzerinde fat32 formatında işlem yapmak için normal.
Yoksa donanım düzeyinde sd kartı spi formatında okuyup yazılıyor. Bu da bir dizi komut içeriyor...
ambar7

M_B

#2
@ambar7 hocam;
buffer=dataFile.read(); 
ile sd kart icindeki dosyadan char char okuyup buffer dizisine atiyorum.
cunku dataFile.read();  fonksiyonu byte byte okuma yapıyor.
şimdi bunu bu şekilde yaparsam
benim verimin uzunlugu 6 karakter diyelim ve gelen verimizde 825421 olsun.
bunu buffer dizisinde aramak ve karşılaştırmak istersem nasıl bir yontem bulmam lazım.

buffer[0] =8
buffer[1] =2
buffer[2] =5
buffer[3] =4
buffer[4] =2
buffer[5] =1

istediğim veri ilk 6 da olmayıp sonlarda veya ortalarda da olabilir.
diziyi ayırırken buffer[150]  6 şarlı dizi olarak ayırmam gerekecek.
Yazarkende aklıma geldi diziyi buffer[150][5]; şeklinde de tanımlayabilirim.
şimdilik tek sıkıntı gelen veriyi buffer icinde arama kısmı kaldı


char buffer[150];

void test()
{ 
unsigned long i;
 File dataFile = SD.open("ID.txt");					
  if (dataFile)
  {i=0;
      Serial.println("ID.txt:");				
      while (dataFile.available())				
        {						
        	buffer[i]=dataFile.read();
        i++;
        }
  dataFile.close();
  } //if sonu
  else
      {
     Serial.println("hata acilmadi test.txt");	
      }
      
 
}



mesaj birleştirme:: 12 Kasım 2014, 10:10:12

Hocam tekrar dan aklıma bir şey daha geldi.
buffer=dataFile.read();
şeklinde değilde.

dataFile.read(); fonksiyonundan  gelen 825421  verisini
buffer[0]=825421  icine aktarma yaparsam karşılaştırmalarım daha kolay olur diye dusunuyorum.
yalnız
dataFile.read(); fonksiyonu her okumada bir byte alıyor
yanı 
dataFile.read();  once    8
dataFile.read();             2 
dataFile.read();             5
dataFile.read();             4
dataFile.read();             2
dataFile.read();en son  1  okuyor.
bu okuma işlemi sonucunu 825421 turune cevırmem lazım.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Kabil ATICI

Bildiğim kadarı ile (\n) satırbaşı karakteri de gelmesi gerekir. Yoksa text dosyasında veriler alt alta yazılmaz.
Buna göre ayıklama yapabilirsin.
Eğer gelen verini de dizi haline getirirsen karşılaştırmak kolay olur.
ambar7

papsukkal

Bodoslamadan giriyor gibi olmasın ama yanlış anlamadımsa sd kart içindeki bir Text dosyasından istediğin 6 karakteri bulmaya çalışıyorsunuz. Yukarıdaki kodlar simdilik bana üst seviye ve yabancı geliyor. 
Aranacak 6 karakter dizi değişkene aktarıldı ktan sonra Text ten 6 sarli ya da 12 şerli karakterler diziye aktarılıp aranan dizinin sadece 1. elemanı aranıp uyması halinde ikinci eleman kontrol edilse...

Soruyu yanlış anladim ise kusura bakmayin.

M_B

Hocam Gelen verim bir değişkende onu aslında diziye koymak değilde
sd den okuyup diziye koymaya çalıştığım veriyi
dizide buffer[0]=825421; şeklinde sokabilirsem çok daha güzel olacak.
cunku dısardan gelen verim değişkende  452854 şeklinde

tabi diziyi unsigned long buffer[150]; tanımlamam gerekecek.
takıldıgım nokta bir turlu aklıma getıremedım. (Kafam durdu )
tek tek aldıgım veriyi nasıl birleştirecem.
ilk 6 karakteri aldıgımı sayıyorum alt satır falan onemli değil.




İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Kabil ATICI

#6
temp diziye alıp, bunu tersten olacak şekilde sırala.
temp1[5] ve temp[5];

buffer [ x ] daki sayıyı temp'e aktar,

for (int i=0;i6<i;i++)
{
temp1=temp[5-i];
}
temp1'deki sayıyı tekrar aynı buffer'a koy.,
biraz uğraştıracak ama aklıma gelen bu...
ambar7

papsukkal

#7
Alıntı yapılan: M_B - 12 Kasım 2014, 09:36:05
cunku dataFile.read();  fonksiyonu byte byte okuma yapıyor.
şimdi bunu bu şekilde yaparsam
benim verimin uzunlugu 6 karakter diyelim ve gelen verimizde 825421 olsun.
bunu buffer dizisinde aramak ve karşılaştırmak istersem nasıl bir yontem bulmam lazım.


anlatmak istediğim tam olarak şuydu..

önce dışarıdan gelen veriyi değişkende tutmak yerine diziye aktarıp Degisken_Dizi[6] gibi;

buffer[150] dizisindeki her bir elemanda text'e ait bir byte (karakter) var.
for-next döngüsü ile

buffer[0]  ile Degisken_Dizi[6] aynı mı?
değilse
buffer[1]  ile Degisken_Dizi[6] aynı mı?
değilse
buffer[2]  ile Degisken_Dizi[6] aynı mı?
aynı ise
buffer[3]  ile Degisken_Dizi[5] aynı mı?
aynı ise
buffer[4]  ile Degisken_Dizi[4] aynı mı?
değil ise
buffer[5]  ile Degisken_Dizi[6] aynı mı?
....
....

böyle bir algoritma kurulabilir.



Edit: Sd karttan gelen veriyi buffer[150] dizisine aktarman gerekecek. ve diğer veriyi de diziye aktarmalısın.