mikrocontroller.net

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


Autor: mathias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn ich mich richtig erinnere, dann sorgt doch das O_NDELAY in:
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...

Autor: mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht 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.
/*****************************************************************************
 *
 *      Open and initialise serial port
 *
 ****************************************************************************/
static int fnInitV24 (const char * device)
{
    int                 iFd;
    int                 modelines = 0;
    struct termios      settings;

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

    if (iFd < 0)
    {
        fprintf (stderr, "Can not open device %s (errno: %s)!\n",
                 device, strerror (errno));
        return (iFd);
    }

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

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

    /* Set output flags */
    settings.c_oflag = 0;

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

    /* Set local flags */
    settings.c_lflag = 0;

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

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

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

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

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

    /* Set RTS-Signal */
    modelines &= ~TIOCM_RTS;
    if (ioctl (iFd, TIOCMSET, &modelines) < 0)
    {
        fprintf (stderr, "Error setting RTS on %s (errno: %s)!\n",
                 device, strerror (errno));
        return(-1);
    }
    return (iFd);
}

Autor: mathias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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):

Autor: Bernhard M. (boregard)
Datum:

Bewertung
0 lesenswert
nicht 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...
while (0 == (res = read(iFd,(char *)buf,BUFFSIZE)));

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

Autor: mathias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Bernhard,
es klappt jetzt ich danke Dir hundertmal

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.