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.
#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
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?