kostenloser Webspace werbefrei: lima-city


C++/Linux: RS232 (Serieller Port)

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    valuser

    Kostenloser Webspace von valuser

    valuser hat kostenlosen Webspace.

    In der Schule / Handwerk Elektronik haben wir seit einiger Zeit mit PICs herumprogrammiert. Da dieser auch eine Kommunikation über RS232 (Serielle Schnittstelle) unterstützt, wollte ich einmal ein kleines Programm am PC schreiben, dass bestimmte Signale (z.B. Tastatureingaben vom PC) an die Serielle Schnittstelle schickt. Treiber werden wunderbar erkannt, ich hatte auch schon möglichkeiten, via cutecom (gui für minicom), mit dem PIC zu "kommunizieren". Nur würde ich gerne mein eigenes Programm schreiben, dass Befehle senden und empfangen kann.
    Kennt sich jemand mit dieser Hardware gut aus?

    Ich würde mich sehr um Beispielcode oder Links mit Beschreibungen freuen, die bei euch schon mal zum Erfolg geführt haben.

    lg
    vali
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    Bitteschön: http://netzmafia.de/skripten/hardware/index.html

    Beitrag zuletzt geändert: 14.3.2009 16:24:55 von kochmarkus
  4. oder hier das ganze zum offline schmökern

    http://www.amazon.de/Hardware-Hackz-Messen-Steuern-Sensorik/dp/3446407839

    plate ist einfach nur der godfather of hardware hackz
  5. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    fatfox schrieb:
    [...]
    plate ist einfach nur der godfather of hardware hackz

    Kennst du ihn? Ich hatte das Glück zwei Vorlesungen bei ihm zu besuchen. :-D
  6. leider nur durch das buch, wurde mal im linux user vorgestellt ich habs gekauft und bin voll begeistert.

    bin voll neidisch das du den kennst...
  7. Autor dieses Themas

    valuser

    Kostenloser Webspace von valuser

    valuser hat kostenlosen Webspace.

    mhm, danke schon mal für die Links.

    Aber irgendwie blicke ich da nicht so ganz durch...
    gibts da keine einfache Lösung, so wie z.B.:
    #include <stdio.h>
    #include <string.h>
    #include <fcntl.h>
    #include <errno.h>
    #include <termios.h>
    #include <unistd.h>
    int fd1;
    int fd2;
    char *buff,*buffer,*bufptr;
    int wr,rd,nbytes,tries;
    
    int main()
    {
       fd1=open("/dev/ttyUSB0", O_RDWR | O_NOCTTY | O_NDELAY);
       
       fcntl(fd1, F_SETFL,0);
       printf("Port 1 has been sucessfully opened and %d is the file description\n",fd1);
    
       wr=write(fd1,"txt\r",4);
       
       rd=read(fd1,buff,100);
       printf("Bytes sent are %d \n",rd);
    
       close(fd1);
    }


    Diesen code habe ich auf der Website http://softexpert.wordpress.com/2007/10/18/how-to-connect-to-a-serial-port-in-linux-using-c/ gefunden, jedoch immer diese Fehlermeldungen:
    Port 1 has been sucessfully opened and 3 is the file description
    Bytes sent are -1
  8. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    So ein ähnliches Skript steht auch in meinem Link: http://netzmafia.de/skripten/hardware/rp1/rp11.html im Abschnitt Programmierung mit C.

    Bist du sicher, dass es /dev/ttyUSB0 ist (also ein USB <-> RS232 Adapter) und nicht /dev/ttyS0?
    Wenn ja, stimmen dann die Rechte? (Also darsft du als Benutzer nach /dev/ttyUSB0 schreiben bzw. lesen, oder führst du das Programm eeh als root aus?)

    Dein Buffer ist nur ein Pointer, du müsstest mit malloc() speicher allozieren, oder gleich ein statischen Buffer nehmen. Ausserdem hast du da ziemlich viel Variablen die du gar nicht verwendest.

    Du könntest zusätzlich zu rd auch mal wr ausgeben. Und in der vorletzten Zeile würde ein "Bytes received ..." mehr Sinn machen.

    Und dann vllt. auch noch die Fehler ausgeben lassen:

    [...]
    char buff[100];
    [...]
    wr = write(fd1, "txt\r", 4);
    if(wr != 4)
      printf("Error sending data: %s\n", strerror(errno));
    
    rd = read(fd1, buff, 100);
    if(rd < 0)
      printf("Error receiving data: %s\n", strerror(errno));
    
    printf("Bytes sent are %d\n",wr);
    printf("Bytes received are %d\n", rd);
    close(fd1);
    ...
  9. Autor dieses Themas

    valuser

    Kostenloser Webspace von valuser

    valuser hat kostenlosen Webspace.

    Danke kochmarkus, dein Programm funktioniert super! :thumb:
    Als Ausgabe erhalte ich folgenden Text:
    Bytes sent are 4
    Bytes received are 15

    Das müsste auch eigentlich stimmen, da der PIC die Daten "txt\r" geschickt bekommt und selbst die Daten "Wie heisst du?\r" schreibt.

    Nur noch zwei Fragen:
    [...]
       rd = read(fd1, buff, 100);
       if(rd < 0)
          printf("Error receiving data: %s\n", strerror(errno));
       printf("Bytes received are %s\n", buff);
    
       wr = write(fd1, "martin\n\r", 6);
       if(wr != 6)
          printf("Error sending data: %s\n", strerror(errno));
       printf("Bytes sent are %d\n",wr);
    
       rd = read(fd1, buff, 100);
       if(rd < 0)
          printf("Error receiving data: %s\n", strerror(errno));
       printf("Bytes received are %s\n", buff);
       [...]


    1. kann ich auch beim 2.Mal einlesen die selbe Buffer-Variable hernehmen, weil momentan funkioniert das nicht so ganz?
    2. wenn ich eine andere Buffer-Variable benutze (char buff1[100];), dann bekomme ich komischerweise bei diesem Code nichts mehr zurück bzw. nur 1 Byte. Der PIC würde mir aber (getestet mir vielen fertigen Terminals) diesen Text zurückschicken: "Hallo martin\r". Könnte das sein, dass da noch irgendwo was nicht stimmt beim Schreiben?

    Beitrag zuletzt geändert: 15.3.2009 11:53:58 von valuser
  10. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    Ersetzte
    wr = write(fd1, "martin\n\r", 6);
    mal durch
    wr = write(fd1, "martin\r", 7);


    Die Zeile danach natürlich auch anpassen.

    €dit: Zweimal den gleichen Buffer verwenden ist natürlich kein Problem.

    Beitrag zuletzt geändert: 15.3.2009 12:03:00 von kochmarkus
  11. Autor dieses Themas

    valuser

    Kostenloser Webspace von valuser

    valuser hat kostenlosen Webspace.

    Mhm, das bring auch nicht wirklich etwas...
    Rückmeldung:
    Bytes(15) received are [Wie heisst du?
    ]
    Bytes sent are 7
    Bytes(1) received are [
    ]


    Mein Code:
    rd = read(fd1, buff, 100);
       if(rd < 0)
          printf("Error receiving data: %s\n", strerror(errno));
       printf("Bytes(%d) received are [%s]\n", rd, buff);
    
       wr = write(fd1, "martin\r", 7);
       if(wr != 7)
          printf("Error sending data: %s\n", strerror(errno));
       printf("Bytes sent are %d\n",wr);
    
       rd = read(fd1, buff1, 100);
       if(rd < 0)
          printf("Error receiving data: %s\n", strerror(errno));
       printf("Bytes(%d) received are [%s]\n", rd, buff1);


    und weißt du auch vl. wie ich ganz leicht die Variable buff[100] wieder "löschen" kann, d.h. dass ich sie mit neuem (und vl. kürzerem) Inhalt beschreiben kann?
  12. kochmarkus

    Co-Admin Kostenloser Webspace von kochmarkus

    kochmarkus hat kostenlosen Webspace.

    buff musst du nicht ganz löschen sonder nur ein "\0" an das Ende des gelesenen Strings anhängen:

    rd = read(fd1, buff, 100);
    buff[rd+1] = '\0';


    Und ist bei deinem Beispiel die Variable buff1 auch ein char Array, also: char buff1[100], oder ein char Pointer?
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!