Seriell Schnittstelle Steuerleitungen

#4771076
Lesenswert?
• ▲
▼
Ich gehe mal davon aus, dass du das auslesen per TTY Syscalls (ioctl) 
machst.
Da gibt es den TIOCMIWAI-Syscall.

Siehe die Doku: http://man7.org/linux/man-pages/man4/tty_ioctl.4.html
1
       TIOCMIWAIT     int arg
2
              Wait for any of the 4 modem bits (DCD, RI, DSR, CTS) to
3
              change.  The bits of interest are specified as a bit mask in
4
              arg, by ORing together any of the bit values, TIOCM_RNG,
5
              TIOCM_DSR, TIOCM_CD, and TIOCM_CTS.  The caller should use
6
              TIOCGICOUNT to see which bit has changed.

Logischerweise musst du dann diesen Syscall in einen Child-Prozess 
auslagern, wenn du nicht willst, dass dein Programm blockiert...

Siehe z.B. hier für ein Beispielprogramm: 
http://linux.mathematik.tu-darmstadt.de/pub/linux/oldstuff/people/bonnes/waitcomm/serial_test.c
Gast #4773280
Lesenswert?
• ▲
▼
Danke für die Antworten.

Leider bin ich irgendwie zu blöd, folgender Test-Code kommt bei mir nur 
bis zur Ausgabe "TEST":
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <termios.h>
4
#include <sys/ioctl.h>
5
#include <sys/types.h>
6
#include <sys/stat.h>
7
#include <fcntl.h>
8
#include <unistd.h>
9
#include <string.h>
10

11
int main()
12
{
13
  int fd;
14
  struct termios options;
15
  fd = open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
16
  if(fd == 0)
17
  {
18
    printf("Fehler: Device kann nicht geöffnet werden.\n");
19
    return 1;
20
  }
21
  
22
  memset(&options,0,sizeof (struct termios));
23
  cfmakeraw(&options);
24
  cfsetispeed(&options,B9600);
25
  cfsetospeed(&options,B9600);
26
  tcsetattr(fd,TCSANOW,&options);
27
  tcflush(fd,TCIOFLUSH);
28
    
29
  int i;
30
  printf("TEST\n");
31
  i = ioctl(fd,TIOCMIWAIT,0);
32
  if( i < 0 )
33
  {
34
    printf("clear failed (%d)\n",i);
35
    return 1;
36
  }
37
  else
38
    printf("PASS\n");
39
  i = ioctl(fd, TIOCMIWAIT, TIOCM_DSR);
40
  printf("A=%d", i);
41
  
42
  close(fd);
43
  return 0;
44
}

LG
traffic
#4777397
Lesenswert?
• ▲
▼
Wenn eine Handshake Funktion zeitkritisch ist, sollte sie bereits im 
Treiber implementiert sein, und nicht im Benutzerprogramm. Db das Buffer 
Full, im RTS/CTS. Sonst kann man im UART Fall von einem PC wenig 
erwarten. Versuch mal eine zunehmend laengere Blochnachricht zu 
uebertragen. Die kommt dann ploetzlich in einzelne Bloecke zerhackt. Mit 
einem eigenen Timing. Ich hab die Details dazu leider vergessen. Und der 
USB treiber macht auch noch seine Spielchen.

Fazit. Man sollte von einem PC keine Echtzeitleistungen erwarten.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren