Tämän hetken kokeiluiden mukaan sueraava koodi vaikuttaa toimivan. Luettava rivi on vain merkattava tarpeeksi pitkäksi.
Yksi ongelmahan on, että sarjaporttiin päätteeltä lähtevä ja sarjaportista päätteelle tuleva teksti ovat kummatkin samassa (pääte)ikkunassa. Sarjaportista pienellä viiveellä tuleva vastausteksti voi sotkea uutta kirjoitettavaa tekstiä.
Olisikohan apua, jos tuleva teksti lähetettäisiin vaikka std::err -vuohon, ja miten sen saisi näkymään omassa ikkunassaan.
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/poll.h>
#include <ctype.h> // vain isspacea varten
int main(int argc,char** argv)
{
struct termios tio; // käytettävät asetukset
struct termios old_stdio; // vanhat sarjatiedsotoasetukset
int tty_fd; // sarjatiedoston tiedostonumero
struct pollfd fds[1]; // polling -rakenteet
int pollrc; // luettujen merkkien määrä pollista
unsigned char cbuf[80];
cbuf[0]='d'; // luettava merkki, ei ainkaan \n alussa
if(argc < 2) // tarvitaan sarjavuon nimi käynnistyksessä
{ printf("Usage %s ",argv[0]);
printf(" /dev/ttyUSB0 (for example) \n" );
exit(11);
}
memset(&tio,0,sizeof(tio)); // nollataan sarjavuon asetukset
tio.c_iflag=0;
tio.c_oflag=0;
tio.c_cflag=CS8|CREAD|CLOCAL; // 8n1, see termios.h for more information
tio.c_lflag=0;
tio.c_cc[VMIN]=1; // 1 merkki riittää käsittelyn aloittamiseen
tio.c_cc[VTIME]= 1; // 5 sarjatiedoston merkkiä voidaan odottaa
tty_fd=open(argv[1], O_RDWR | O_NONBLOCK); // avataan rw ja noblcking -asetuksin
cfsetospeed(&tio,B9600); // 9600 baudia sarjatiedostn kirjoitusnopeudeksi
cfsetispeed(&tio,B9600); // 9600 baudia sarjatiedostn lukunopeudeksi
tcsetattr(tty_fd,TCSANOW,&tio);
fds[0].fd = tty_fd; // tarkkailtavan tiedoston tunnistenumero
fds[0].events = POLLIN ; // valitaan tuleva tieto tarkkailtavaksi
while( 1 )
{
unsigned char ch;
int k = 0;
while( (ch = getchar()) != '\n' )
{
cbuf[k++] = ch;
} // vain merkit käsitellään, \n ei mene mukaan
write(tty_fd, cbuf, k); // /tiedostonumero, char-osoite, merkkilkm)
tcdrain( tty_fd ); //tämä ei auta, pitkä rivi loppuu kesken
sleep(1); // tämän avulla pitkä rivi tulostuu, miksi ???????????
pollrc = poll(fds, 1, 1000); // onko vastaus tulossa 1000 ms aikana
if(pollrc < 0) // poll -virhe, aikaylitys ehkä, tai muu virhe
{
perror("poll");
}
else
if( pollrc > 0) // ainakin poll onnistui ilman virhettä
{
if(fds[0].revents & POLLIN ) // merkkejä on tulossa
{
ssize_t rc = read(tty_fd, cbuf, 79 ); // luettiin rc kpl merkkejä
if(rc > 0)
{
/////printf("%zu %s\n", rc, " chars read from stream" );
write(0, "\n", 1);
write(0, cbuf, rc); // k ???, merkki saatu sarjavuosta, sen voi käsitellä ohjelmassa
write(0, "\n", 1);
fds[0].revents = 0; // nollataan paluu(virhe)ilmoitukset
}
}
} // if( pollrc > 0) loppuu
} // while loppuu
close(tty_fd); // suljetaan sarjavuo
tcsetattr(STDOUT_FILENO,TCSANOW,&old_stdio); // palautetaan pääteasetukset
printf("\n %s \n", "program ended ");
return EXIT_SUCCESS;
}