Kirjoittaja Aihe: Stty ja fstream -kokeiluja ja ongelmia  (Luettu 2450 kertaa)

teele

  • Käyttäjä
  • Viestejä: 852
    • Profiili
Stty ja fstream -kokeiluja ja ongelmia
« : 20.05.16 - klo:11.13 »
Laitoin usb-porttiin kiinni laitteen, joka lukee päätteeltä syötettyjä kirjaimia, muuttaa ne isoiksi kirjaimiksi ja lähettää ne heti takaisin samassa fstreamissa. Fstream on c++ -ohjelmassa, joka on tehty tätä kokeilua varten.

Kun käynnistän ohjelman, voin syöttää sille esim. wyttuq ja se palauttaa WYTTUQ.

Kaikki näyttää toimivan hyvin, mutta vain ensimmäisen merkkijonon osalta. Seuraavalla kerralla "merkkono" >> sarjaportti -komento ei näytä toimivan. Mutta minkään ei pitäisi olla muuttunut, koska uusi yritys tulee silmukassa, jossa mitään ei muuteta.

Alla on ohjelma, josta katsomalla toiminta varmaan selviää parhaiten.

Koodia: [Valitse]
#include <string.h>  // string -käsittelyyn

#include <unistd.h>     // nukkuaika, mutta ei ehkä säikeille
#include <fstream>      // tiedostoluku ja -kirjoitus
#include <iostream>     // cout

int main(int argc, char* argv[])
{

  if(argc < 2)
    { std::cerr << "Usage: " << argv[0] << " port name eg. /dev/ttyUSB3" << std::endl;
        exit(0);
    }


//  std::string str2(std::string("stty -F ") + argv[1] + std::string(" sane raw -echo 9600") );
  std::string str2(std::string("stty -F ") + argv[1] + std::string("  sane raw pass8 -echo -hupcl clocal 9600") );

  std::fstream fs;
  fs.open (argv[1], std::fstream::in | std::fstream::out );
  system( str2.c_str() ); // stty -F /dev/ttyUSB3 sane raw -echo 9600")

  int i = 0;  // kierroslaskuri
  int j = 0;  //cbuffer kirjainlukumäärä
  char cbuffer[80];
  char c1 = 'w'; // luettva merkki, päätteeltä
  char c2 = 'o'; // luettva merkki, arduinosta

  i = 0;
  while(i < 3 ) // tästä alkaa silmukka
    {
      sleep(1);  // jotta arduino varmasti mukana?
      j = 0; c1 = 'p'; c2 = 'o';
      std::cout << "anna kirjaimia, 'q' päättää syötteen ";
      while( c1 != 'q'  ) // kirjaimien loppumerkki
        {
          std::cin >> c1;
          cbuffer[j] = c1;
          j++;
        }
       
      for(int m = 0; m < j; m++)
        { sleep(0.01);
          //sleep(1); // tämän lisäys ei pilaa tuloksia
          fs << cbuffer[m];
              std::cout << "tiedostoon kirjoitettiin " << cbuffer[m] << std::endl;
          sleep(0.01); // että arduino ehtii varmasti mukaan             
        }
     
      while( 1 )
        {           
          fs >> c2 ;
          std::cout << " c2 sarjatiedostosta (iso kirjain) on " << c2 << std::endl;
          if( c2 == 'Q' || c2 == 'o') break;
        }
      i++;
    } // while kierroksille loppuu

  fs.close();  // lisätty varmuuden vuoksi
}


Ohelman tulostuksesta on esimerrkki alla

Koodia: [Valitse]
anna kirjaimia, 'q' päättää syötteen werq
tiedostoon kirjoitettiin w
tiedostoon kirjoitettiin e
tiedostoon kirjoitettiin r
tiedostoon kirjoitettiin q
 c2 sarjatiedostosta (iso kirjain) on W
 c2 sarjatiedostosta (iso kirjain) on E
 c2 sarjatiedostosta (iso kirjain) on R
 c2 sarjatiedostosta (iso kirjain) on Q
anna kirjaimia, 'q' päättää syötteen sq
tiedostoon kirjoitettiin s
tiedostoon kirjoitettiin q
 c2 sarjatiedostosta (iso kirjain) on o
anna kirjaimia, 'q' päättää syötteen q
tiedostoon kirjoitettiin q
 c2 sarjatiedostosta (iso kirjain) on o

Sen jälkeen, kun sarjavuo fs on tulostanut jotain, se ei enää suostu ottamaan mitään syötettä vastaan. Pitäisikö stty parametreja säätää jotenkin niin, että fs -vuo palaisi samaan tilaan, jossa se on ollut silmukan ensimmäisellä keirroksella. Auttaisiko ehkä joku lopetusmerkki, pitäisikö käyttää -canon -muotoa ?

Mitkä olisivat sellaisia päätekomentoja, joilla voisi kirjoittaa ja lukea /dev/ttyUSB* -portissa olevan laitteen palauttaman merkin.

C++ -ohjelmaa tässä ei kai tarvittaisi välissä, jos osaisin antaa oikeat päätekomennot ja oikeat stty -parametrit?