[ O4SiS @ 04.07.2007. 23:15 ] @
Molio bih pomoć

Dakle, imam problem sa half duplex komunikacijom po linuxom...

Izvorni kod preuzet od nekog howto manuala
Code:

#include <stdio.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <stdlib.h>
struct termios tio;

int main()
{
  int fd, status, whichBaud, result,i;
  long baud;
  char buffer[255];

  varijabla[2] = "\x31\x31";
  baud = B9600;

 fd = open(device ,O_RDWR | O_NOCTTY);
    if (fd <0) 
    {
        printf("error");
        exit(1);
      }
  tio.c_cflag = baud | CS8 | CREAD | CLOCAL;

  tio.c_iflag = IGNPAR;  /* ignore parity errors */

  tio.c_oflag = 0;       /* set output flag non-canonical, no processing */

  tio.c_cc[VTIME] = 18;   /* no time delay */
  tio.c_cc[VMIN]  = 0;   /* no char delay */
  tcflush(fd, TCIFLUSH); /* flush the buffer */
  tcsetattr(fd, TCSANOW, &tio); /* set the attributes *
  
/* Set up for no delay, ie non-blocking reads will occur. 
   When we read, we'll get what's in the input buffer or nothing */
  fcntl(fd, F_SETFL, FNDELAY);

write(fd,varijabla,2);
  result = read(fd,buffer,255);
  printf("%c\n",result);
  buffer[result] = 0; // zero terminate so printf works
  printf("%s\n",buffer);
}
/* close the device file */
  close(fd);


Ovdje kad posaljem varijablu "31 31" trebao bih dobiti odgovor od 18 bytova.
Primim je i sve radi OK, ali ako ne primim 18 bytova program ceka u nedogled.

Moze li se namjestit recimo, ako se ne pojavi nista na portu u 200 ms...prekini sa cekanjem tih 18 bytova nego posalji opet varijablu?

[ rumpl @ 05.07.2007. 09:38 ] @
man termios:
Canonical and non-canonical mode
The setting of the ICANON canon flag in c_lflag determines whether the
terminal is operating in canonical mode (ICANON set) or non-canonical
mode (ICANON unset). By default, ICANON set.

Treba da predjes u non-canonical mode:
Code:

tio.c_lflag &= ~ICANON;



Serem, probaj sa ovim:

Code:

fcntl (fd, F_SETFL, O_NONBLOCK);


A probaj i oba :)
[ O4SiS @ 06.07.2007. 22:08 ] @
Prije svega hvala na odgovoru!

Probao sam oba i nema efekta, posto je ovo half duplex veza... hardware treba iz stanja pisanja(write) uci u stanje citanja(read).
Izveo sam to tako da sam prvo otvorio port zapisao, pa zatvorio port te ga opet otvorio okrenuo MCR bit (Line control registar) i procitao podatke tih 18 bytova ali kad mi je
Code:

tio.c_cc[VMIN]  = 18;


Ako nista ne stigne cekanje je do beskonacnosti...

Pa sam napravio ovo:
Code:

tio.c_cc[VTIME] = 100;   
 tio.c_cc[VMIN]  = 0;  


i dobio to da, ako se nista ne dogodi na portu, program nastavi vrtiti dalje... ali ne mogu dobiti vise od 8 bytova?

Sto se triba postaviti da procita svih 18 bytova?
Bilo koju vrijednost da stavim uvijek je isto 8 bytova...

[ rumpl @ 07.07.2007. 11:54 ] @
Misilm da bi trebao da napises svoju funckciju ny_read koji ce da bufferizuje i da posalje char* kada imas dovoljno, ili mozes da pogledas select i pselect.