Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Half duplex komunikacija

[es] :: C/C++ programiranje :: Half duplex komunikacija

[ Pregleda: 2789 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

O4SiS
Dalmatia

Član broj: 22389
Poruke: 149
*.adsl.net.t-com.hr.

ICQ: 146566222


Profil

icon Half duplex komunikacija04.07.2007. u 23:15 - pre 204 meseci
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?


There are 10 types of people in the world:
Those who understand binary and those who don't.
 
Odgovor na temu

rumpl

Član broj: 54959
Poruke: 156
*.net81-66-199.noos.fr.



Profil

icon Re: Half duplex komunikacija05.07.2007. u 09:38 - pre 204 meseci
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 :)
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
 
Odgovor na temu

O4SiS
Dalmatia

Član broj: 22389
Poruke: 149
*.adsl.net.t-com.hr.

ICQ: 146566222


Profil

icon Re: Half duplex komunikacija06.07.2007. u 22:08 - pre 204 meseci
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...


There are 10 types of people in the world:
Those who understand binary and those who don't.
 
Odgovor na temu

rumpl

Član broj: 54959
Poruke: 156
*.w86-217.abo.wanadoo.fr.



Profil

icon Re: Half duplex komunikacija07.07.2007. u 11:54 - pre 204 meseci
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.
"The problem with the world is that everyone is a few drinks behind."
-Humphrey Bogart
 
Odgovor na temu

[es] :: C/C++ programiranje :: Half duplex komunikacija

[ Pregleda: 2789 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.