Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Nächste Überarbeitung
Vorhergehende Überarbeitung
Nächste Überarbeitung Beide Seiten der Revision
serialdbus:start [2011/08/07 12:56]
Patrick Wacker angelegt
serialdbus:start [2011/08/07 21:12]
Patrick Wacker [Shell Script Beispiele (bash)] typo behoben
Zeile 8: Zeile 8:
  
  
-==== Verwendung ====+===== Verwendung ​=====
  
-=== Start des Programms ===+==== Start des Programms ​====
 **serialdbus /​dev/​ttyUSB0 Ser1** **serialdbus /​dev/​ttyUSB0 Ser1**
  
 dies stellt ein dbus-Interface "​org.schmufu.serialdbus"​ mit dem Object "/​Ser1"​ im DBus zur Verfügung. Der Zugriff hierauf kann dann z.B. über qdbus erfolgen. dies stellt ein dbus-Interface "​org.schmufu.serialdbus"​ mit dem Object "/​Ser1"​ im DBus zur Verfügung. Der Zugriff hierauf kann dann z.B. über qdbus erfolgen.
  
-=== Senden von Daten (mit qdbus) ===+==== Senden von Daten (mit qdbus) ​====
 **qdbus org.schmufu.serialdbus /Ser1 org.schmufu.serialdbus.apply "send data"​** **qdbus org.schmufu.serialdbus /Ser1 org.schmufu.serialdbus.apply "send data"​**
  
 Sendet "send data" über die serielle Schnittstelle /​dev/​ttyUSB0 Sendet "send data" über die serielle Schnittstelle /​dev/​ttyUSB0
  
-=== Empfangen von Daten (mit qdbus) ===+==== Empfangen von Daten (mit qdbus) ​====
 **qdbus org.schmufu.serialdbus /Ser1 org.schmufu.serialdbus.receive** **qdbus org.schmufu.serialdbus /Ser1 org.schmufu.serialdbus.receive**
  
 Gibt alle, seit dem letzten Aufruf, empfangene Daten zurück und löscht den internen Empfangsbuffer. Gibt alle, seit dem letzten Aufruf, empfangene Daten zurück und löscht den internen Empfangsbuffer.
  
-=== Beenden des Programms ===+==== Beenden des Programms ​====
 serialdbus läuft weiterhin im Vordergrund und kann über STRG+C beendet werden. Es besteht aber auch die Möglichkeit das Programm über den dbus aufruf "qdbus org.schmufu.serialdbus /Ser1 org.schmufu.serialdbus.quit"​ zu beenden. (Dies funktioniert auch dann wenn das Programm durch ein nachgestelltes "&"​ weiter im Hintergrund ausgeführt wird). ​ serialdbus läuft weiterhin im Vordergrund und kann über STRG+C beendet werden. Es besteht aber auch die Möglichkeit das Programm über den dbus aufruf "qdbus org.schmufu.serialdbus /Ser1 org.schmufu.serialdbus.quit"​ zu beenden. (Dies funktioniert auch dann wenn das Programm durch ein nachgestelltes "&"​ weiter im Hintergrund ausgeführt wird). ​
  
-==== Shell Script Beispiele (bash) ====+===== Shell Script Beispiele (bash) ​=====
  
 +folgendes script kann in ein Script eingebunden werden und dann einfach über die zur Verfügung gestellten funktionen auf die serielle Schnittstelle zugegriffen werden.
 +
 +<file bash dbusserial.sh>​
 +#!/bin/bash
 +#
 +# bash Script das in andere Scripte eingebunden werden kann um Daten über
 +# eine serielle Schnittstelle zu senden.
 +#
 +export SERIALDBUS="​../​build/​./​serialdbus"​
 +
 +function serial_init()
 +{
 + local device;
 + local baudrate;
 + local dbusname;
 + local stopbits;
 + local databits;
 + local flowcontrol;​
 + local parity;
 + local serial_export;​
 +
 + local interface;
 + local grepret;
 +
 + if [[ -z "​$1"​ ]]; then
 + device="/​dev/​ttyS0"​
 + else
 + device="​$1"​
 + fi
 +
 + if [[ -z "​$2"​ ]]; then
 + dbusname="​Ser0"​
 + else
 + dbusname="​$2"​
 + fi
 +
 + if [[ -z "​$3"​ ]]; then
 + baudrate=19200
 + else
 + baudrate="​$3"​
 + fi
 +
 + if [[ -z "​$4"​ ]]; then
 + databits=8
 + else
 + databits="​$4"​
 + fi
 +   ​
 + if [[ -z "​$5"​ ]]; then
 + flowcontrol="​none"​
 + else
 + flowcontrol="​$5"​
 + fi
 +   ​
 + if [[ -z "​$6"​ ]]; then
 + stopbits=1
 + else
 + stopbits="​$6"​
 + fi
 +   ​
 + if [[ -z "​$7"​ ]]; then
 + parity="​none"​
 + else
 + parity="​$7"​
 + fi
 +   ​
 + # Alle Werte wurden auf Standart oder den übergebenen Wert gesetzt
 +   ​
 + # Instanz von serialdbus starten und alle Ausgaben des Programs
 + # nach /dev/null schicken
 + $SERIALDBUS "​$device"​ "​$dbusname"​ -b "​$baudrate"​ -d "​$databits"​ -f "​$flowcontrol"​ -s "​$stopbits"​ -p "​$parity"​ >/​dev/​null 2>&1 &
 +   ​
 + sleep 2 #etwas warten damit die schnittstelle initialisert werden kann
 +   ​
 + # gibt alle funktionen innerhalb von serialdbus wieder
 + interface=$(qdbus org.schmufu.serialdbus)
 + grepret=$(echo "​${interface}"​ | egrep "​${dbusname}"​)
 + # der übergebene dbusname muss als dbus service vorhanden sein
 + if [[ -z "​${grepret}"​ ]]; then
 + #dbus service konnte nicht erstellt werden
 + echo "ERROR at ${FUNCNAME}:​ cant create the serialdbus service for $dbusname"​
 + return 1
 + fi
 +
 + return 0;
 +}
 +
 +# Beendet die genutzte serielle Schnittstelle
 +function serial_deinit()
 +{
 + if [[ -z "​$1"​ ]]; then
 + echo "​PROGRAMMING ERROR at ${FUNCNAME}:​ supply a DBUSNAME at \$1"
 + return 1
 + fi
 +
 + qdbus org.schmufu.serialdbus /${1} org.schmufu.serialdbus.quit
 +
 + return 0
 +}
 +        ​
 +
 +# Sendet über die in $1 definierte Schnittstelle,​ den in $2 übergebenen String
 +function serial_send()
 +{
 + local ret;
 + local str;
 + ret=1;
 + if [[ -z "​$1"​ ]]; then
 + echo -en "​PROGRAMMING ERROR at ${FUNCNAME} - supply a dbusname at \$1!\n"​
 + return 1
 + fi
 +
 + if [[ -z "​$2"​ ]]; then
 + echo -en "​PROGRAMMING ERROR at ${FUNCNAME} - supply a text to sent at \$2!\n"​
 + return 1
 + fi
 +
 +
 + str=$(qdbus org.schmufu.serialdbus /${1} org.schmufu.serialdbus.apply "​$2"​)
 + if [[ "​x${str}"​ != "​xtrue"​ ]]; then
 + ret=1
 + else
 + ret=0
 + fi
 +
 + return $ret
 +}
 +
 +# Setzt die globale Variable $SERIALRECV auf den Empfangenen String
 +function serial_receive()
 +{
 + local str;
 +
 + if [[ -z "​$1"​ ]]; then
 + echo -en "​PROGRAMMING ERROR at ${FUNCNAME} - supply a dbusname at \$1!\n"​
 + return 1;
 + fi
 +
 + str="";​
 +
 + str=$(qdbus org.schmufu.serialdbus /${1} org.schmufu.serialdbus.receive)
 + SERIALRECV="​${str}";​
 +}
 +
 +</​file>​
 +
 +Verwendet werden kann dies dann wie folgt
 +
 +<file bash serial_example.sh>​
 +#!/bin/bash
 +#
 +# simples Beispiel Script zur Verwendung von serialdbus über die bash
 +#
 +#
 +# Vorrausssetzungen:​
 +#  - es existiert die serielle Schnittstelle /​dev/​ttyUSB1
 +#  - TXD ist mit RXD verbunden
 +#  - das Programm "​qdbus"​ ist installiert
 +#
 +#
 +
 +#include the main functions
 +. dbusserial.sh
 +
 +SER=serial1 #​ der Name für die serialdbus instanz (frei wählbar!)
 + # über diesen Namen wird später auf die Schnittstelle zugeriffen
 +
 +# initialisierung der Schnittstelle
 +serial_init /​dev/​ttyUSB1 $SER 19200 8 none 1 none
 +
 +if [[ $? -ne 0 ]]; then
 + # Ein Fehler ist bei der Initialisierung aufgetreten
 +        echo "​ERROR:​ could not open /​dev/​ttyUSB1 as '​$SER'​ for serial communication"​
 +        exit 1 # Script abbrechen
 +fi
 +
 +# von jetzt an kann über "​serial_send"​ gelesen und über "​serial_receive"​ geschrieben werden
 +
 +# wenn TxD mit RxD verbunden ist wird das was gesendet wird auch wieder empfangen
 +serial_send $SER "Diese Daten "
 +serial_send $SER "​werden gesendet"​
 +
 +# wir holen die Empfangen Daten ab
 +serial_receive $SER
 +# in $SERIALRECV steht jetzt der empfangene String
 +echo "​Empfangen wurde:"​
 +echo -en "​$SERIALRECV"​
 +echo " "
 +
 +# Die gesendeten Daten enhalten KEINE Steuerzeichen! Und auch ein abschlie0endes
 +# "​\n"​ wird nicht automatisch an den String angehangen!
 +# Wenn Steuerzeichen übertragen werden sollen kann dies folgendermaßen
 +# erreicht werden
 +
 +# String erstellen
 +SEND_DATA=$(echo -en "Test mit einem\nZeilenumbruch."​)
 +# Daten Senden. $SEND_DATA muss in " ", damit es als ein Argument übergeben wird!
 +serial_send $SER "​$SEND_DATA" ​
 +
 +# wir holen die Empfangen Daten ab
 +serial_receive $SER
 +# in $SERIALRECV steht jetzt der empfangene String
 +echo "​Empfangen wurde:"​
 +echo -en "​$SERIALRECV"​
 +echo " "
 +
 +
 +# Auch folgendes ist möglich
 +serial_send $SER "0x41 (A) in HEX angegeben = \x41\n"​
 +serial_receive $SER
 +echo "​Empfangen wurde:"​
 +echo -en "​$SERIALRECV"​
 +echo " "
 +
 +
 +# zum schluss muss die Schnittstelle wieder geschlossen werden
 +serial_deinit $SER
 +
 +
 +</​file>​
  
 ====== Weiterführende Links ====== ====== Weiterführende Links ======
Projektwerkzeuge