Ansteuerung einer seriellen Schnittstelle

From: Harold Gutch <logix(at)foobar.franken.de>
Date: Sun, 24 Mar 2002 04:45:16 +0100

Hi,

ich habe letztens ein serielles Kabel fuer das Nokia 6210 in die
Haende bekommen und wollte nun ein wenig damit rumspielen. Das
Telefon versteht AT-Befehle und ist m.W. komplett darueber
ansteuerbar, das ganze sollte also nicht allzu wild sein. Jetzt
habe ich also ein kleines C-Programm zusammengehackt, das im
Prinzip nichts anderes macht als ein "ATI\r" an die Schnittstelle
an der das Geraet haengt zu schicken, und danach mit einem
read() Daten von derselben zu lesen - und an dieser Stelle
blockt das Programm, sprich es scheinen keine Daten zum Lesen
vorzuliegen. Aendere ich das ganze allerdings leicht so dass ich
einen zweiten Prozess forke, den zuerst (blockend) read()en lasse,
dann Daten schreibe, so funktioniert es wie erwartet. Habe ich
jetzt das Konzept von seriellen Schnittstellen nicht verstanden,
oder ist da was anderes kaputt?

1. Variante ohne fork():

#include <fcntl.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
int fd;
char buf[256];

        fd = open("/dev/cuaa1", O_RDWR);
        write(fd, "ATI\r", 4);
        read(fd, buf, sizeof(buf) - 1);
        printf("%s\n", buf);
}

# ./nofork
^C
#

[sprich - es tut sich nichts]

2. Variante mit fork():

#include <fcntl.h>
#include <stdio.h>

int main(int argc, char *argv[])
{
int fd, retval;
char buf[256];

        fd = open("/dev/cuaa1", O_RDWR);
        if (fork()) {
                retval = read(fd, buf, sizeof(buf) - 1);
                buf[retval] = '\0';
                printf("%s\n", buf);
        }
        sleep(2);
        write(fd, "ATI\r", 4);
        exit();
}

# ./fork
ATI
No
#

[Auf einen "ATI" schickt das Telefon einen Vendorstring oder
 etwas derartiges ("Nokia Mobile Phones") zurueck.]

Mir gehts jetzt nicht darum wie unsinnig es ist, nur 1x zu
read()en, da kommt natuerlich noch eine Schleife hin, etc., es
geht mir im Moment eigentlich nur um die Frage wieso die eine
Variante klappt und die andere nicht.

bye,
  Harold

To Unsubscribe: send mail to majordomo(at)de.FreeBSD.org
with "unsubscribe de-bsd-questions" in the body of the message
Received on Sun 24 Mar 2002 - 04:48:01 CET

search this site