ASCII Zeichen über UART senden

  • Hallo Forum!

    Vorneweg, ich habe hier schon zu dem Thema gelesen, aber keine Lösung gefunden. Ich suche eine Lösung in Shellscript, falls es die gibt.

    Folgdendes Problem:
    Ich will mit dem Raspi über UART (Serielle Schnittstelle) einen Konfigurationsdatensatz an ein GPS Modul schicken. Es ist ein NEO-6M Modul. Dazu gibt es eine Origiunalsoftware mit der man das Teil konfigurieren kann. Wenn ich in der Software die gewünschten Änderungen einstelle und sie dann hochlade funktioniert das Teil wie gewünscht. Die Übertragung erfolgt über eine UART Schnittstelle. Ich habe mit einer zweiten RX-Leitung gelauscht, welche Zeichen die Software an das Modul schickt, die Nachricht abgefangen und extrahiert :shy: .
    Wenn ich diesen Datensatz, es sind 49 Bytes, mit einem LabView-Programm zu dem Modul schicke gelingt die Konfiguration auch. Es sind viele Sonderzeichen die man in einer erweiterten ASCII-Tabelle finden kann. Also kann ich mir die Originalsoftware sparen und den Datensatz in einem Skript auf dem Raspi speichern und mit einer reinen TxD-Leitung (Pin8 an der 40poligen GPIO-Schnittstelle) verbunden mit dem RX-Pin am Modul hochladen. Das ist der Plan.
    Jetzt habe ich den Datensatz mal in eine Textdatei gespeichert und diese auf den Raspi hochgeladen. Den Datensatz kann ich hier nicht als Text reinkopieren, schräges Zeug!
    Wenn ich jetzt den Datensatz mit

    auf der seriellen Schnittstelle ausgebe und die Ausgabe zur Kontrolle mit meinem LabViewprogramm einlese, dann stelle ich fest dass sie vom ursprünglich ermittelten Datensatz abweicht. Die Textdatei scheint also Probleme mit einigen Sonderzeichen zu haben!
    Habe dann in LabView den Text in ein Byte-Array gewandelt und sehe für jedes Byte (von 0 bis Byte 48) eine Zahl zwischen 0 und 255. Unter z.B. http://www.torsten-horn.de/techdocs/ascii.htm kann ich dann tatsächlich das zugehörige Zeichen finden.

    Ich muss die Zeichen aus der Textdatei also z.B. als Hex-Zeichen oder sonst irgendwie über die Schnittstelle bringen.

    Meine Frage dazu:
    Wie kann ich die ASCII-Zeichen in eine Datei schreiben und in Shellscript (bitte kein python!!) an der seriellen Schnittstelle ausgeben? :s

    Ich stehe quasi kurz vorm Ziel, dieser Schritt fehlt noch...


    PS: Die Kommunikation funktioniert natürlich grundsätzlich, hello world und so, ihr wisst schon :thumbs1:

  • Shellscript ist etwas unspezifisch :fies: Du meinst vermutlich: bash

    Aber wieso kein python? In Python könntest du das ziemlich einfach umsetzen


    Ein Zwischenschritt über eine Textdatei ist meist suboptimal zumal das eine unnötige Belastung der SD verursacht. Hast du es stattdessen schon über eine FIFO Datei probiert? zB => "mknod gps.pipe p" was identisch ist mit "mkfifo gps.pipe" und zum auslesen einfach "<(cat gps.pipe)"

    In bash solltest du zunächst die Serielle Schnittstelle konfigurieren mithilfe von stty , weil ein einfaches "cat" oder "echo" nicht die Schnittstelle konfiguriert was für UART aber wichtig ist.
    Beispiel:

    Code
    stty -F /dev/ttyAMA0 9600

    Oder auch:

    Code
    stty -F /dev/ttyAMA0 9600 cs8 cread clocal

    Bitte erst die ManualPage (man stty) lesen bevor das obige ausgeführt wird!

    Einmal gesetzt bleibt die stty Einstellung solange erhalten bis rebootet wird.
    Siehe dazu auch http://unix.stackexchange.com/a/311680

    Für ASCII und HEX kannst du auch Hilfsmittel nutzen wie zB:

    Code
    echo A | xxd    # ist in scripts besser zu handhaben als die naechsten beiden
    echo A | hexdump
    echo A | od -x
    echo -e "\x41" | awk '{printf "%c\n", $1}'
    echo -e "\x41" | cat   #das zeigt das der vorher genannte awk nichts macht 
    echo A | uni2ascii -Bsepq
    echo A | uni2ascii -Bsepq | ascii2uni -Bq

    Mit Python:

    Python
    #!/usr/bin/python
    
    
    # ascii to hex:
    hex(ord('a'))
    
    
    # hex to ascii:
    import binascii
    binascii.a2b_hex("61")


    Lesenswertes:
    http://askubuntu.com/questions/5065…nd-command-line
    https://learn.sparkfun.com/tutorials/terminal-basics/all
    https://www.raspberrypi.org/forums/viewtopic.php?f=31&t=120074
    https://bbs.archlinux.org/viewtopic.php?id=83476
    http://grulos.blogspot.de/2006/03/genera…from-ascii.html

  • Danke ihr beiden. Exzellent!
    Habe was gelernt und nebenbei auch noch mein Problem gelöst!!!!!!!!!!!!!!! :shy:
    ...kann jetzt das Modul aus der Ferne (um)konfigurieren, und das mit einem einzigen Stück Draht, 8cm lang, von Pin8 am Raspi auf RxD am Modul gelötet.


    Shellscript ist etwas unspezifisch :fies: Du meinst vermutlich: bash


    Korrekt.


    Aber wieso kein python? In Python könntest du das ziemlich einfach umsetzen


    Weil ich bisher von python keinen Plan habe und erst damit anfangen will wenn ich es unbedingt brauche. Nicht zu viele Baustellen auf einmal aufmachen. Mein Ziel ist die Programmierung des Moduls, nicht python zu lernen.

    Ein Zwischenschritt über eine Textdatei ist meist suboptimal zumal das eine unnötige Belastung der SD verursacht. Hast du es stattdessen schon über eine FIFO Datei probiert? zB => "mknod gps.pipe p" was identisch ist mit "mkfifo gps.pipe" und zum auslesen einfach "<(cat gps.pipe)"


    Das Skript wird nur ganz selten ausgeführt, daher ist die Belastung vernachlässigbar. FIFO? Kenn eich auch noch nicht, kommt vielleicht später irgendwann.


    In bash solltest du zunächst die Serielle Schnittstelle konfigurieren mithilfe von stty , weil ein einfaches "cat" oder "echo" nicht die Schnittstelle konfiguriert was für UART aber wichtig ist.
    Beispiel:

    Code
    stty -F /dev/ttyAMA0 9600

    Oder auch:

    Code
    stty -F /dev/ttyAMA0 9600 cs8 cread clocal

    Bitte erst die ManualPage (man stty) lesen bevor das obige ausgeführt wird!


    OK, habe ich im Skript jetzt berücksichtigt.



    Sind wirklich alle Zeichen im File drin?

    In diesem Fall muesste es so funktionieren:

    Bash
    #!/bin/bash
    
    
    cp NMEA200msdelay.txt /dev/ttyAMA0
    
    
    exit 0


    Das ist tatsächlich die einfachste Lösung die bei mir funktioniert.
    Hätte nicht gedacht dass das einen Unterschied zu meinem Skript macht.

    Letztlich sieht mein Skript jetzt so aus:


    ...also ziemlich einfach. Hätte nicht gedacht das s die Lösung so einfach aussehen wird.

    Also, Danke nochmals. :thumbs1: :bravo2: :rolleyes:

    PS: Auch nach einem Neustart und ausschließlich cp NMEA200msdelay.txt /dev/ttyAMA0 funktioniert die Umkonfiguration. Es lag vorher also nicht an der fehlenden Festlegung der Bitrate.

    Einmal editiert, zuletzt von Stef7 (24. Oktober 2016 um 14:39)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!