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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.