Lesen aus serial Port unter Linux

Gast #902195
Hallo,
ich senden von dem Mikrocontroller einen String, mit dem Befehl 
cat/dev/ttyS1
kann ich der String auf dem Port lesen. Mit der Funktion, die ich im c 
geschrieben habe, ist die Ausgabe meines Buffers leer.
Ich  weiss nicht, welche Konfiguration mache ich falsch für das Kernel.
Ich weiss, dass es verschiedenen Mode gibt. Ich habe mich "für Canonical 
Input Processing" entschieden.
Kann jemanden mir sagen, was ich falsch mache.
Anbei mein c Programm

mathias
Angehängte Dateien:
#902224
Wenn ich mich richtig erinnere, dann sorgt doch das O_NDELAY in:
1
int fd = open( DEVICE, O_RDWR | O_NOCTTY | O_NDELAY);
dafür, daß der "read" sofort zurückkehrt und nicht auf ein Zeilenende 
(canonical mode) wartet, d.h. Du liest wahrscheinlich schon bevor Daten 
ankommen...
#902259
Ich dachte, O_NDELAY ist das selbe O_NONBLOCK....

Ich würde generell mal eine Schleife um die Lesefunktion machen um zu 
sehen,
ob vielleicht etwas ankommt, aber nicht gelesen wird....(timing).

Hier ein Beispiel, wie ich in einem Programm die ser. Schnittstelle 
öffne. Ich lese dann allerdings in einer Schleife...evtl. könnte man 
auch die maximum wait time und minimum bytes to read anpassen.
1
/*****************************************************************************
2
 *
3
 *      Open and initialise serial port
4
 *
5
 ****************************************************************************/
6
static int fnInitV24 (const char * device)
7
{
8
    int                 iFd;
9
    int                 modelines = 0;
10
    struct termios      settings;
11

12
    /* open and check filedescriptor */
13
    iFd = open (device, O_RDWR | O_NOCTTY);
14

15
    if (iFd < 0)
16
    {
17
        fprintf (stderr, "Can not open device %s (errno: %s)!\n",
18
                 device, strerror (errno));
19
        return (iFd);
20
    }
21

22
    /* Check if filedescriptor belongs to a terminal */
23
    if (!isatty (iFd))
24
    {
25
        fprintf (stderr, "Device %s is not a terminal device (errno: %s)!\n",
26
                 device, strerror (errno));
27
        close (iFd);
28
        return (-1);
29
    }
30

31
    /* Set input flags */
32
    settings.c_iflag =  IGNBRK          /* Ignore BREAKS on Input */
33
                     |  IGNPAR;         /* No Parity              */
34

35
    /* Set output flags */
36
    settings.c_oflag = 0;
37

38
    /* Set controlflags */
39
    settings.c_cflag = CS8              /* 8 bits per byte */
40
                     | CREAD            /* characters may be read */
41
                     | CLOCAL;          /* ignore modem state, local connection */
42

43
    /* Set local flags */
44
    settings.c_lflag = 0;
45

46
    /* Set maximum wait time on input */
47
    settings.c_cc[VTIME] = 10;
48

49
    /* Set minimum bytes to read */
50
    settings.c_cc[VMIN]  = 0;
51

52
    /* set speed */
53
    if (cfsetspeed (&settings, B9600) != 0)
54
    {
55
        fprintf (stderr,
56
                 "Can not set communication speed to %s (errno: %s)!\n",
57
                 device, strerror (errno));
58
        return (-1);
59
    }
60

61
    /* transfer setup to interface */
62
    if (tcsetattr (iFd, TCSANOW, &settings) < 0)
63
    {
64
        fprintf (stderr, "Error setting terminal attributes for %s (errno: %s)!\n",
65
                 device, strerror (errno));
66
        return (-1);
67
    }
68

69
    /* Read IO parameter */
70
    if (ioctl (iFd, TIOCMGET, &modelines) < 0)
71
    {
72
        fprintf (stderr, "Error getting IO parameter from %s (errno: %s)!\n",
73
                 device, strerror (errno));
74
        return (-1);
75
    }
76

77
    /* Set RTS-Signal */
78
    modelines &= ~TIOCM_RTS;
79
    if (ioctl (iFd, TIOCMSET, &modelines) < 0)
80
    {
81
        fprintf (stderr, "Error setting RTS on %s (errno: %s)!\n",
82
                 device, strerror (errno));
83
        return(-1);
84
    }
85
    return (iFd);
86
}
Gast #902350
Hallo Bernhard,
ich  habe das Programm verändern. ich habe deine Einstellungen genommen. 
Ich kriege immer dasselbe. Alle Bedingunengen sind erfüllt.Das Problem 
bleibt immer im read_data Funktion.Ich bekomme:
readfunction 0
read succesful
read:(null)
values read(printf):
Angehängte Dateien:
#902374
Hmm nun:
readfunction 0
sagt ja, daß nichts gelesen wurde (0 bytes), offensichtlich ist er durch 
einen Timeout zurückgekehrt.
Du hast natürlich den Timeout von mir mit 1s übernommen...

Ich würde zum Test mal das Lesen in eine Schleife setzen...
1
while (0 == (res = read(iFd,(char *)buf,BUFFSIZE)));

Übrigens:
1
printf("read:%s\n",buf[0]);
kann einen coredump geben, muß heißen
1
printf("read:%s\n",buf);

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.