Теряется строка

bit
Offline
Зарегистрирован: 07.05.2012
йуу



// библ SD карты
 #include <SD.h>

File myFile;
 




#include <string.h>
 
char a_in[10]; ///символ для включения сохранения
char s_in[10]; // символ обороты двигателя
char h_in[10]; // символ скважности


 

int PowSd = 49; // включения питания карты памяти


int knopka2 = 43; // упровляющий сигнал для сохронения данных
int flag2 = 0; // флаг для упровляющего сигнала



void setup(){ 
  
pinMode(PowSd, OUTPUT);  

digitalWrite(PowSd, HIGH);

pinMode(knopka2, INPUT);  



 Serial.begin(115200); 
   Serial3.begin(57600); 





// открываем сд карту




 while (!Serial) {
    ; 
  }


 if (!SD.begin(4)) {
   
  }
 delay(10);
    
     myFile = SD.open("test.txt", FILE_WRITE);
 

 
} 





void loop(){ 
  
  

    if(digitalRead(knopka2)==HIGH&&flag2==0)
   
   {
  

//считываем что приходит в сериал и разбираем по запятым 


 int i=0;


  char buffer[100];
 
//если есть данные - читаем
  if(Serial3.available()){
     
      
     //загоняем прочитанное в буфер
     while( Serial3.available() && i< 99) {
        buffer[i++] = Serial3.read();
     }
     //закрываем массив
     buffer[i++]='\0';
  }
 delayMicroseconds(5000);
//если буфер наполнен
  if(i>0){  
     
    //разбираем его на части отделенные запятой
    sscanf(buffer, "%[^','],%[^','],%[^','],%", &a_in, &s_in, &h_in);
     
  



  }
  
  flag2=1;
  
   }
 
  
  
  int asd = atof(a_in);
  int qwe = atof(s_in);
  int zxc = atof(h_in);


  
//////////////////////////////////////////
  
      if(digitalRead(knopka2)==LOW&&flag2==1)
  {
  
    
    
    
    
   
     myFile.print(" C ");
      myFile.print(a_in);
      
      myFile.print(" S ");
      
      myFile.print(s_in);
      
      myFile.print(" H ");
      
      myFile.println(h_in);   
    
    
    
  // выводим данные разобранные после запятой 

 Serial.print(" A>");
 Serial.print(asd);
 Serial.print(" S>");
 Serial.print(qwe);
 Serial.print(" D>");
 Serial.println(zxc);
 
 
 
// сбрасываем буфер
  a_in [0] = '\0';
  s_in [0] = '\0';  
  h_in  [0] = '\0';

flag2=0;
}


}

 

 

 

 



 

 

 

 

 

 

 

 

 

bit
Offline
Зарегистрирован: 07.05.2012
 A>306 S>306 D>306
 A>307 S>307 D>307
 A>308 S>308 D>308
 A>309 S>309 D>309
 A>310 S>310 D>310
 A>311 S>311 D>311
 A>312 S>312 D>312
 A>313 S>313 D>313
 A>314 S>314 D>314
 A>0 S>0 D>0
 A>316 S>316 D>316
 A>317 S>317 D>317
 A>318 S>318 D>318
 A>319 S>319 D>319
 A>320 S>320 D>320
 A>321 S>321 D>321
 A>322 S>322 D>322
 A>323 S>323 D>323
 A>324 S>324 D>324
 A>325 S>325 D>325

Привет всем ,подскажите пожалуйста.

Данные приходят на порт 3 , с частотой 34 раза в секунду (123,123,123) , разбираем строку на части по запятым , выводим в порт и сохроняем на SD  карту.

Иногда почемуто теряется строка?

 

Причём когда убираешь строки 136-145 сохранения на сд карту сбой пропадает!

 

Как решить эту проблему?

 

 

 

 

 

 

 

Maverik
Offline
Зарегистрирован: 12.09.2012

здравый смысл подсказывает, что где-то нужно добавлять задержки. 5 микросекунд это всётаки мало.

попробуйте для начала

-добавить что-нибудь вроде delay(1000);  в строку № 147

- увеличить задержку перед записью на карту  

- уменьшить скорость порта.

если не поможет, то уточните в какой именно момент теряются данные,  и есть ли строгая периодичность потери данных.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

не успевает записывать на карту (сам процесс довольно медленный).

bit
Offline
Зарегистрирован: 07.05.2012

Привет!

Мне нужно 34 раза в секунду записывать показания и delay(1000) тут не вариант.

bit
Offline
Зарегистрирован: 07.05.2012

Привет!

А как можно увеличить скорость записи на карту?

Клапауций 999
Offline
Зарегистрирован: 06.06.2015

bit пишет:

Привет!

А как можно увеличить скорость записи на карту?

скороть записи можно увеличить, увеличив скорость записи - это же очевидно.

Radjah
Offline
Зарегистрирован: 06.08.2014

bit пишет:

Привет!

Мне нужно 34 раза в секунду записывать показания и delay(1000) тут не вариант.

Может тогда что-нибудь более быстродействующее выбрать вместо AVR?