Forum: Mikrocontroller und Digitale Elektronik Lesen aus serial Port unter Linux


von mathias (Gast)


Angehängte Dateien:

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

von Bernhard M. (boregard)


Lesenswert?

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...

von mathias (Gast)


Lesenswert?

Hallo,

die Bedeutung von O_NDELAY= Ignore the DCD signal line
soll ich es lassen oder wie

von Bernhard M. (boregard)


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
}

von mathias (Gast)


Angehängte Dateien:

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):

von Bernhard M. (boregard)


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);

von mathias (Gast)


Lesenswert?

Hallo Bernhard,
es klappt jetzt ich danke Dir hundertmal

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.