[De-Nut-Discussion] _read()

de-nut-discussion at egnite.de de-nut-discussion at egnite.de
Fri Aug 20 19:17:03 CEST 2004


Hi,

Ich habe leider seit geraumer Zeit ein Problem mit dem Ethernut Board.
Versucht wird über die zweite serielle Schnittstelle des ATMega128 ein Datenstream zu senden und die Antwort des Empfängers zu
empfangen. Verwendet werden die hierbei Funktionen _write() und _read().
Das Problem liegt nun darin das bei _read() nicht die aktuell empfangenen Daten zurückgegeben werden, sondern die des zurvor
empfangenen Streams.

Beispiel:
1. Senden -> Empfangen -> _read() liefert nicht nachvollziehbare Werte
2. erneutes Senden -> Empfangen -> _read() liefert die Werte die bei Punkt 1 emfpangen wurden

Anbei noch der Source Code der Funktion.

mit freundlichen Grüssen,
Manuel Mausz

Source Code:

EncodeStream()  ... erzeugt den Datenstream der gesendet werden soll
DecodeStream()  ... überprüft den Datenstream auf fehlerfreie Übertragung
Rs485enableTx() ... schaltet den RS485-Treiber auf senden um
Rs485enableRx() ... schaltet den RS485-Treiber auf empfangen um

static int nLQuery(FILE *stream, REQUEST *req)
{
    struct NetLinkStream thisStream;
    static char buf;
    unsigned char inbuf[11];
    int i;

    thisStream.Address   = ((((req->req_query)[0])-0x41) << 4 ) + (((req->req_query)[1])-0x41);
    thisStream.ByteCount = 2;
    thisStream.Data[0]   = ((((req->req_query)[2])-0x41) << 4 ) + (((req->req_query)[3])-0x41);
    thisStream.Data[1]   = (((((req->req_query)[4])-0x41) << 4 ) + (((req->req_query)[5])-0x41))+0x30;

    EncodeStream(&thisStream);

    Rs485enableTx();
    _write(_fileno(uart2), thisStream.Stream, thisStream.ByteCount+8);
    _write(_fileno(uart2), 0, 0);
    Rs485enableRx();

    buf = _read(_fileno(uart2), &inbuf, sizeof(inbuf));

    printf("buf: %d\n", buf);
    for (i=0; i < 10; i++) {
        printf("%x-", inbuf[i]);
        thisStream.Stream[i]=inbuf[i];
        if (inbuf[i] == '\x03')
            inbuf[i+1] = '\0';
    }

    if (DecodeStream(&thisStream)==TRUE)
        printf("success");
    else
	  printf("error");
    printf("\n");

    NutHttpSendHeaderTop(stream, req, 200, "Ok");
    NutHttpSendHeaderBot(stream, "text/html", -1);

    fputs("<HTML>"
          "<HEAD>"
          "<TITLE>NetLink v2</TITLE>"
          "</HEAD>"
          "<BODY>", stream);

    if (req->req_query) {
        fputs(inbuf, stream);
    }
    else
        fputs("None", stream);
    fflush(stream);

    return 0;
}





More information about the De-Nut-Discussion mailing list