Autor Thema: Serial Port - lesen! - Kleiner Aussetzer xD  (Gelesen 3477 mal)

Horst

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« am: 30. March 2010, 00:45 »
Hey...

also irgendwie komme ich gerade net mit... xD Ich weiß net ob es daran liegt das ich schon ewig nicht in C programmiert habe, aber ich bekomme es net mehr hin aus den Pointer einen String zusammen zu setzen.

// ++++++++++++++++++++++++++++++++++  R S 3 2 3  ~  C O M 2  ++++++++++++++++++++++++++++++++++++++
#define PORT 0x2f8   /* 3f8 = COM1 2f8 = COM2*/

void init_serial() {
   outb(PORT + 1, 0x00);    // Disable all interrupts
   outb(PORT + 3, 0x80);    // Enable DLAB (set baud rate divisor)
   outb(PORT + 0, 0x03);    // Set divisor to 3 (lo byte) 38400 baud
   outb(PORT + 1, 0x00);    //                  (hi byte)
   outb(PORT + 3, 0x03);    // 8 bits, no parity, one stop bit
   outb(PORT + 2, 0xC7);    // Enable FIFO, clear them, with 14-byte threshold
   outb(PORT + 4, 0x0B);    // IRQs enabled, RTS/DSR set
}

int serial_received() {
   return inb(PORT + 5) & 1;
}

char read_serial() {
   while (serial_received() == 0);

   return inb(PORT);
}

int is_transmit_empty() {
   return inb(PORT + 5) & 0x20;
}

void write_serial(char a) {
  switch(a) {
     case '\n':
a = 13;
        break;
     case '\r':
        a = 10;
        break;
     default:
        a = a;
        break;
    };
   
   while (is_transmit_empty() == 0);

   outb(PORT,a);
}

void SendSerial(const char *s)
{
    while(*s)
        write_serial(*(s++));
    return;
};

const char ReadSerial()
{
   int read;
   char zeichen;
   
   do
   {
    read = read_serial();   // puts("~ | \n", 0x0700,read_serial());

     }
   } while(read != 0);
   return zeichen;
}

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Wie man sieht funktioniert eigentlich alles, bis auf das lesen. Das Senden von Strings habe ich über SendSerial() gemacht. Klappt auch super. Aber ich bekomms gerade net hin die einzellen Zeichen von read_serial() zu einem String zusammen zu setzen und Ascii(10) zu \r und Ascii(13) zu \n zu ersetzen. =(

Wer kann mir da mal schnell aus der Gedächnis Lücke helfen ?  =)

Würde mich sehr freuen.

L.G.
Horst

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 30. March 2010, 09:35 »
Also erstmal kriegst du einen Obfuscation-Bonuspunkt dafür, sowohl read_serial/write_serial als auch ReadSerial/WriteSerial zu haben. :)

Bei ReadSerial würde ich dir empfehlen, erstmal was kompilierbares draus zu machen, denn das gibt im Moment das:
test.c: In Funktion »ReadSerial«:
test.c:13: Fehler: expected »while« before »}« token

Hätte man erstmal die Hinweise des Compilers befolgt bevor man andere fragt, so wäre man als nächstes auf folgende Warnung gestoßen:
test.c: In Funktion »ReadSerial«:
test.c:13: Warnung: »zeichen« is used uninitialized in this function

Eigentlich würde ich erwarten, dass man anderen, von denen man Hilfe erwartet, nicht offensichtlich kaputten Code vorwirft, sondern mit etwas ankommt, was man selbst zumindest schonmal ausprobiert hat und was vom Compiler angenommen wird.

Aber gut, die Funktion führt so offensichtlich nicht zum Ziel, fangen wir nochmal von vorne an. Wenn ich mal davon ausgehe, dass read_serial tut, dann hätte ich vielleicht sowas gebastelt (Achtung, ungetestet):
int serial_read_str(char* buf, size_t len)
{
    char c;
    int i = 0;

    while ((c = read_serial()) && (len--)) {
        buf[i++] = c;
    }

    if (len > 0) {
        buf[i] = '\0';
    }

    return i;
}
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Horst

  • Beiträge: 4
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 30. March 2010, 15:43 »
Hey... sry, wegen dem Besch****** Code.... hatte heute morgen echt keinen Nerv mehr..  :-P

Also gut, ich glaube du hast was falsches verstanden.

also die Funktion read_serial() gibt immer nur EIN ZEICHEN von der RS232 zurück. Ließt es also aus dem Speicher.

Blöderweiße ist es total dumm jedes mal im Programm selber die Teile zusammen zu stückeln. Deswegen möchte ich mit der Funktion ReadSerial() einen String zusammen setzten. Also als: const char

Ablauf ist folgender:
~Funktion startet.
Wartet bis serial_received() = 1 zurück gibt. (Daten im Speicher)
~Schleife starten
Jedes Zeichen mittels read_serial() speichern
~Schleife unterbrechen wenn \r\n gefunden wird
~Zeichenkette ausgeben!
~Funktion beendet.

Sprich puts(ReadSerial()); könnte mir dann folgenden Text anzeigen den ich zuvor mittels Terminal an die Maschine gesendet habe. z.B. gebe ich per Terminal 'H' 'e' 'l' 'o' ein unddrücke Return.  Der Terminal sendet jetzt die Steuerzeichen '\r' '\n';
Die Funktion ReadSerial() müsste mir jetzt also 'Helo' zurück geben.

Vielen dank für deine Mühe
und
Liebe Grüße
Horst

 

Einloggen