Thread overview
C++ seri port kontrolü işlev dışındaki string değişkenin deger almaması
Feb 08, 2016
erdem
Feb 08, 2016
erdem
Feb 08, 2016
erdem
Feb 08, 2016
erdem
February 08, 2016
#include <iostream>
#include <string>
#include "serial/serial.h"

using std::cout;    using std::string;

typedef serial::Serial SeriPort;

const string  veriGonder(SeriPort & seriPort,  string ileti)
{
   const size_t iletiUzunlugu = seriPort.write(ileti);

   const string okunanIleti = seriPort.readline(iletiUzunlugu, "\n");

   seriPort.waitReadable();

   if (okunanIleti.size() == iletiUzunlugu)
   {
       cout << "Okunan ileti = " << okunanIleti << '\n';
       return okunanIleti;
   }
   else
   {
       cout << "Veri okuma başarısız" << '\n';
       veriGonder(seriPort, ileti);
   }
}


int main()
{
   SeriPort seriPort("/dev/ttyACM0", 9600, serial::Timeout::simpleTimeout(1000));

   cout << "Seri port açık mı ?\n";

   if (seriPort.isOpen())
       cout << "Evet\n";
   else
       cout << "Hayır\n";

   const string ileti = "Merhaba\n";


   const string okunan = veriGonder(seriPort, ileti);
   cout << "İşlev dışındaki okunan değişkeni =  " << okunan << '\n';
   return 0;
}

Gene seri porta veri gönderen bir uygulama üzerinde çalışıyorum. Seri portta Arduino bağlı. Programdan ne gönderirsem adeta yankı yaparak tekrar programa gönderiyor.

Ama şimdi asıl sorun buradaki C++ kodunda olabilir. Program çalıştırıldığında çıktısı şu şekilde:

'$ ./seri1
Seri port açık mı ?
Evet
Veri okuma başarısız
Okunan ileti = Merhaba

İşlev dışındaki okunan değişkeni =
'

Şöyle ki ilk kez veriGonder() işlevi çağrıldığında veriyi gönderiyor ama okuyamıyor. İkinci kez veriGonder() işlevini öz yinelemeli olarak çalıştırdığımızda veri gönderiyor bu sefer okuyor. Buraya kadar normal.

Hatta okunan ileti'yi işlev içinde yazıyoruz. Ama işlev dışında okunan değişkenine atamıyor. :huh:

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 08, 2016

Evet başarısız olduğunda okunanIleti.size() başarısız olduğunda 0 oluyor.

Başarılı olmamasının nedeninin seri portun çalışma mantığıyla ilgili olabileceğini düşünüyorum. Örnegin

Program Veri Gönder Arduino Veriyi Geri Gönder Program Veri Oku
"Merhaba\n" Başarısız Başarısız
"Merhaba\n" "Merhaba\n" "Merhaba\n"
"Merhaba\n" "Merhaba\n" "Merhaba\n"

Ama farkettim ki ilk gönderilen veriden sonra doğru bir şekilde çalışıyor. O yüzden ilk seferinde rastgele bir veri göndererek o kısmı halletim.

Şimdi programı bir kütükten verileri okuyacak şekilde değiştirdim.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>

#include "serial/serial.h"

using std::cout;    using std::string;  using std::random_shuffle;
using std::vector;  using std::ifstream;

typedef serial::Serial SeriPort;

const string  veriGonder(SeriPort & seriPort, const string & ileti)
{
   const size_t iletiUzunlugu = seriPort.write(ileti);

   const string okunanIleti = seriPort.readline(iletiUzunlugu, "\n");

   seriPort.waitReadable();

   if (okunanIleti.size() == iletiUzunlugu)
   {
       return okunanIleti;
   }
   else
       return string("");
}


int main()
{
   SeriPort seriPort("/dev/ttyACM0", 9600, serial::Timeout::simpleTimeout(1000));

   cout << "Seri port açık mı ?\n";

   if (seriPort.isOpen())
       cout << "Evet\n";
   else
       cout << "Hayır\n";

   typedef vector<string> Kelimeler;


   Kelimeler kelimeler;
   string satir;

   ifstream giris ("kelimeler.txt");
   while (getline (giris, satir))
       kelimeler.push_back (satir);

   veriGonder(seriPort, "Başlıyor");

   for (int i = 0; i < kelimeler.size(); ++i)
   {
       random_shuffle(kelimeler.begin(), kelimeler.end());
       const string ileti = kelimeler[i] + "\n";
       string okunan = veriGonder(seriPort, ileti);
       cout << "Seri port okunan veri = " << okunan << '\n';
   }

   return 0;
}

Ama random_shuffle ile her seferinde rastgele bir karışım yapamıyoruz anladığım kadarıyla ..

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 08, 2016

Evet haklısınız. random_shuffle'ı döngü dışına taşıdım.

Demek istediğim şuydu. Programı her çalıştırdığımda bu sırayla kelimeleri yazıyor.

'$ ./seri1
Seri port açık mı ?
Evet
Seri port okunan veri = indirmeyecekleri

Seri port okunan veri = kuzeylilerden

Seri port okunan veri = toplanacağınız

Seri port okunan veri = donanımlarının'

Ben istiyorum ki programı her çağırdığımda sözcükleri farklı karıştırsın.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 08, 2016

Tamam şimdi hallettim teşekkürler! :-)

Rastgele sayı üretecini unutmuşum.

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <fstream>

#include "serial/serial.h"

using std::cout;    using std::string;  using std::random_shuffle;
using std::vector;  using std::ifstream;



typedef serial::Serial SeriPort;

const string  veriGonder(SeriPort & seriPort, const string & ileti)
{
   const size_t iletiUzunlugu = seriPort.write(ileti);

   const string okunanIleti = seriPort.readline(iletiUzunlugu, "\n");

   seriPort.waitReadable();

   if (okunanIleti.size() == iletiUzunlugu)
   {
       return okunanIleti;
   }
   else
       return string("");
}


int main()
{
   SeriPort seriPort("/dev/ttyACM0", 9600, serial::Timeout::simpleTimeout(1000));

   cout << "Seri port açık mı ?\n";

   if (seriPort.isOpen())
       cout << "Evet\n";
   else
       cout << "Hayır\n";

   typedef vector<string> Kelimeler;


   Kelimeler kelimeler;
   string satir;

   ifstream giris ("kelimeler.txt");
   while (getline (giris, satir))
       kelimeler.push_back (satir);

   veriGonder(seriPort, "Başlıyor");

   srand(time(NULL));
   random_shuffle(kelimeler.begin(), kelimeler.end());
   for (int i = 0; i < kelimeler.size(); ++i)
   {
       const string ileti = kelimeler[i] + "\n";
       string okunan = veriGonder(seriPort, ileti);
       cout << "Seri port okunan veri = " << okunan << '\n';
   }

   return 0;
}

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 08, 2016

Gözüme kod hatası çarpmıyor ama özyineleme olayı karıştırıyor: Acaba başarılı olmasının nedeni iki kere göndermek mi yoksa iki kere okumak mı; anlayamıyoruz. Bir de, başarısız olduğunda okunanIleti.size() herhalde 0, değil mi?

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

February 08, 2016

Neden yapılamayacağını anlamıyorum ama random_shuffle çağrısının for döngüsünden önce olacağını görebiliyorum: oku, karıştır, ve kullan.

Döngü içinde karıştırırsan, önceden gönderdiğin kelimelerin henüz göndermediğin indekslerde belirme olasılığı var.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]