Lesen aus serial Port unter Linux

Gast #902195
Lesenswert?

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:
#902259
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

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