- 12V Akku mit 280 Ah bauen         
Seite 1 von 4 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 37

Thema: Kommunikation zwischen CAN-Knoten und Raspberry

  1. #1
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9

    Kommunikation zwischen CAN-Knoten und Raspberry

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo Forum,

    ich tüftel gerade an meiner Kommunikation zwischen dem Raspberry Pi und meinem CAN-Knoten über UART.
    Der Plan ist, dass ich einen Befehl über eine Webseite eingebe und dieser per UART an mein Pi gesendet wird. Der CAN-Knoten antwortet dann und der Text soll auf der Webseite ausgegeben werden.
    Die Kommunikation zwischen Webseite und Knoten funktioniert bereits. Sprich ich kann was auf der Webseite eingeben und das wird dann an den CAN-Knoten gesendet. Die Antwort von meinem Knoten kann ich dann mittels TeraTerm verfolgen.
    Nur wie schaffe ich es das das Raspberry Pi eine ganze Nachricht von meinem Knoten über UART einließt und dann auf einer Website darstellt?
    Danke für die Hilfe
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Ich nutze dafür eine temporäre Datei. Diese wird dann bei jedem Aufruf der php Seite ausgelesen und deren Inhalt auf der Webpage angezeigt.

    php Code:
    Code:
        if (file_exists ("/tmp/ausgabe.txt" )){
            $userdatei = fopen("/tmp/ausgabe.txt","r");
            while(!feof($userdatei))
               {
               $zeile = fgets($userdatei);
               echo "<br>";
               echo $zeile;
               }
            fclose($userdatei);
        } else{
            echo "<br>Keine Ausgabe";
        }
    Geht bestimmt auch eleganter (Javascript, Ajax) mir reicht es aber beim Aufruf der Seite. Die Seite kann sich auch per "reload Meta" selbst alle paar Sekunden aktualisieren.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  3. #3
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Hey,

    danke für die Antwort.
    Und wie sorgst du dafür, dass alles was per UART empfangen wird in der Temporären Datei landet?
    Und wie schalte ich es ab das der gesamte Bootvorgang über das Terminal gesendet wird? Hab eben gesehen, dass dasselbe was per SSH an Putty gesendet wird auch über den UART ausgegeben wird. Und das bringt meinen Controller komplett durcheinander.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Das ist einfach eine Anpassung von meinem Internetradio Die Kernsachen stehen auch im zugehörigen Wiki. Im 'auswerten' Sub einfach die Datei zum Schreiben öffnen und rein mit dem Text. Wenn viele / ständig Daten kommen, würde ich diese hintereinander in eine Datei schreiben, damit nichts verlorengeht.

    In Datei schreiben:
    Code:
        int fd1;    
        fd1 = open ("/tmp/ausgabe.txt", O_WRONLY|O_CREAT|O_TRUNC); //O_APPEND zum Anhängen
        if (fd1 == -1)
            exit (-1);
        write (fd1, eingang, strlen(eingang));
        close (fd1); 
        system("chmod 644 /tmp/ausgabe.txt");
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  5. #5
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ah ok.
    Nur die nächste Frage ist, wie stelle ich das ab das das Raspberry Pi die komplette Bootsequenz über UART ausgibt?
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  6. #6
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Ja, das steht in dem von mir verlinkten Post.

    Hinweis:
    Ich nutze die UART auf der Stiftleiste. Für einen USB-Seriell Adapter sind folgende Schritte nicht notwendig!
    Damit die UART frei ist, müssen 2 Dateien angepasst werden. Achtung: Vorher sichern. Wenn was schief geht, kann ich die SD-Karte in meinem NAS mounten und die Sicherungen zurückspielen...
    /boot/cmdline.txt:
    Code:
    dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
    /ect/inittab: Folgende Zeile auskommentieren
    Code:
    T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
    zu
    Code:
    #T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
    Und natürlich auch alle anderen Zeilen, welche auf ttyAMA0 zugreifen wollen.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  7. #7
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Super
    Ich schau mal ob ich es morgen hin bekomme
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  8. #8
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    mmh seitdem ich das gemacht habe, wird vor eine Ausgabe im Terminal immer sowas gesetzt:

    Bild hier  


    Ich habe das schon zurück verfolgt bis zur Konsoleneingabe. Die letzten Ausgaben stammen von dieser Eingabe:

    Code:
    echo  >> /dev/ttyAMA0
    Ich habe mal mit Hex-Term drüber geschaut. Das ist ein F8 was da zuviel gesendet wird. Aber in meinen Codes finde ich nichts in der Richtung.
    UART.c
    Code:
    // Compile with: GCC /Programme/UART.c -o /Programme/UART
     
    //#include <iostream>
    //using namespace std;
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <termios.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <unistd.h>
    
    
    #define BAUDRATE B115200                                                                                    // Baudrate
    
    
    char MODEMDEVICE[]= "/dev/ttyAMA0";                                                                            // Device zum Senden   
    struct termios newtio={};                                                                                    // Variable für "termios.h"
    int fd;                                                                                                        // File descriptor
    
    
    void Send_UART(char *c)                                                                                        // Gibt ein einzelnes Zeichen über UART (als fd geöffnet) aus.
    {
        int res;
        char LineEnd[] = "\r\n";
        
        res = write(fd, c, strlen(c));
        write(fd, LineEnd, 2);
    }
    
    
    int UART_Init()                                                                                                // Schnittstelle öffnen und parametrieren
    { 
        // O_RDONLY, O_WRONLY or O_RDWR -
        // O_NDELAY (geht weiter, wenn keine Daten da sind und gibt "-1" zurueck)
        // man 2 open fuer mehr Infos - see "man 2 open" for more info
        // O_NOCTTY No ControllTeleType 
        fd = open(MODEMDEVICE, O_WRONLY | O_NOCTTY);
        
        if (fd < 0)
        {
            printf("Fehler beim öffnen von %s\n", MODEMDEVICE);
            exit(-1);
        }
        
        memset(&newtio, 0, sizeof(newtio));
        newtio.c_cflag = BAUDRATE | CS8 | CLOCAL | CREAD;                                                        // Setzt die neuen Porteinstellungen
        newtio.c_iflag = IGNPAR;
        newtio.c_oflag = 0;
        newtio.c_lflag = 0;         /* set input mode (non-canonical, no echo, ...) */
        newtio.c_cc[VTIME] = 0;     /* inter-character timer unused */
        newtio.c_cc[VMIN] = 1;    /* blocking read until 1 chars received */
    
    
        tcflush(fd, TCIFLUSH);
        tcsetattr(fd, TCSANOW, &newtio);
        return fd;
    }
    
    
    
    
    int main(int argc, char** argv)                                                                               // Programmstart
    {
        // Variablen für das Hauptprogramm
        char LineEnd[] = "\r\n";
        int res;
        
        UART_Init();                                                                                                 // Schnittstelle öffnen und parametrieren 
        
        if (argc >= 1)                                                     
        {
            res = write(fd, argv[1], strlen(argv[1]));
            write(fd, LineEnd, 2);
        }
        
        printf("Text empfangen\n");                                                                                // Empfangsbestätigung senden
        //Send_UART("Hallo");
        
        close (fd);
        return 0;
    }
    UART.php
    Code:
    <html>
    <head>
    <title>
    Raspberry Pi Webserver
    </title>
    </head>
    
    
    <h1>
    <font color="red">
    Raspberry Pi Webserver
    </font>
    </h1>
    
    
    <body>
    <div id="nav"><a href="index.php">Hauptseite</a>
    
    
    <h2>
    Raspberry Pi UART
    </h2>
    
    
    <?php
    
    
    if (isset($_POST["Eingabe"]))
    {
           $befehl="sudo /Programme/UART ".$_POST["Eingabe"]; 
           $output = shell_exec($befehl); 
    };
    
    
    echo "<form method='post' action='UART.php'>";
    echo "<input type='text' maxlength='40' size='40' id='1' name='Eingabe' value='Ich'>";
    echo "<input type='submit' value='Senden'>";
    echo "<br>";
    echo "<br>"; 
    echo "Antwort:"; 
    echo "<br>";
    echo "$output";
    echo "</form>";
    
    
    ?>
    </div>
    </body>
    </html>
    Weißt du evtl. was das sein könnte?
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  9. #9
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Lass den UART mal offen. Meiner sendet auch immer ein Zeichen beim Öffnen (oder Schließen? weiß nicht mehr so genau) des ttyAMA0. Lasse ich ihn offen, kommt nur das, was auch gesendet werden soll. Müsste ich aber auch schon irgendwo erwähnt haben. Ich lasse ihn geöffnet, indem mein Empfangen Programm ständig lauscht.

    Da das gesendete Zeichen abhängig von der Baudrate ist, gehe ich von einem "ungewollten" Bitwackeln beim Öffnen der Schnittstelle aus.

    Bei einem USB-Seriell Wandler habe ich diese Wirkung übrigens nicht.
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  10. #10
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Ich verwende auch einen USB-Seriell Wandler.
    Mit dem offen lassen probiere ich mal. Aber anscheinend habe ich das Problem beim empfangen nicht, da nichts dergleichen in der Datei steht.
    Kann ich auch zwei C-Programme gleichzeitig laufen lassen?
    Weil dann wollte ich das Prinzip übernehmen. Dann habe ich ein C-Programm zum Senden/Auswerten und eins zum Empfangen.
    Geändert von Kampi (18.11.2012 um 13:28 Uhr)
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

Seite 1 von 4 123 ... LetzteLetzte

Ähnliche Themen

  1. [ERLEDIGT] Kommunikation AVR <-> Raspberry
    Von Goldenflash im Forum Raspberry Pi
    Antworten: 6
    Letzter Beitrag: 04.09.2012, 09:30
  2. SPI Kommunikation zwischen 2 AVR's
    Von Ruppi im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 05.07.2007, 10:34
  3. Kommunikation zwischen uP und Pc
    Von XC866 im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 14.02.2007, 15:48
  4. Kommunikation zwischen PC und BOT
    Von corpsealive im Forum PC-, Pocket PC, Tablet PC, Smartphone oder Notebook
    Antworten: 9
    Letzter Beitrag: 07.07.2006, 07:40
  5. Kommunikation zwischen AVR und PC
    Von im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 10.02.2004, 13:26

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test