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
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...
Hallo, die Bedeutung von O_NDELAY= Ignore the DCD signal line soll ich es lassen oder wie
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 | }
|
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):
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); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.