====== serialdbus ======
{{ :wiki:progress:90.png?150|Fortschritt: 90% (Funktionsfähig, evt. Erweiterungen)}}
Das Programm serialdbus dient der Umsetzung der seriellen Schnittstelle zum DBus-Daemon unter Linux.
Mit hilfe dieser Umsetzung kann sehr simpel auf eine oder auch mehrere serielle Schnittstellen zugegriffen werden.
===== Verwendung =====
==== Programm Parameter (-h|--help) ====
Ausgabe von 'serialdbus --help'
Usage: ./serialdbus device dbus-name [OPTIONS]
device
the serial device to use, e.g. /dev/ttyS0, /dev/ttyUSB0 etc.
dbus-name
the name under wich this instance will appear in the
session-dbus domain 'org.schmufu.serialdbus "dbus-name"'.
OPTIONS are:
-h, --help shows this help and exits
-b N, --baud N, --baudrate N
baudrate to use. Default: 19200
supported values: 110, 115200, 1200, 19200, 2400, 300, 38400, 4800, 57600, 600, 9600
-d N, --data N, --databits N
data bits. Default: 8
supported values: 5, 6, 7, 8
-f FLOW, --flow FLOW, --flowcontrol FLOW
flow control. Default: none
supported values: hardware, none, off, software, xonxoff
-s N, --stop N, --stopbits N
N count stop bits. Default: 1
supported values: 1, 2
-p PARITY, --par PARITY, --parity PARITY
parity to use. Default: none
supported values: even, mark, none, odd, space
Version: 0.1.0.0 (svn: rev7)
Author: Patrick Wacker (wacker.p@gmx.de)
License: GNU General Public License version 2, or (at your option) any later version
==== Start des Programms ====
**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.
==== Senden von Daten (mit qdbus) ====
**qdbus org.schmufu.serialdbus /Ser1 org.schmufu.serialdbus.apply "send data"**
Sendet "send data" über die serielle Schnittstelle /dev/ttyUSB0
==== Empfangen von Daten (mit qdbus) ====
**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.
==== 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).
===== 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.
#!/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}";
}
Verwendet werden kann dies dann wie folgt
#!/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" # gibt "Diese Daten werden gesendet" aus
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" # gibt "Test mit einem
echo " " # "Zeilenumbruch." aus
# Auch folgendes ist möglich
serial_send $SER "0x41 (A) in HEX angegeben = \x41\n"
serial_receive $SER
echo "Empfangen wurde:"
echo -en "$SERIALRECV" # gibt "0x41 (A) in HEX angegeben = A" aus
echo " "
# zum schluss muss die Schnittstelle wieder geschlossen werden
serial_deinit $SER
====== evt. noch implementieren ======
* über dbus die aktuellen Einstellungen auslesen (baudrate, databits, device etc.)
* über dbus die Einstellungen ändern (baudrate, databits, device etc.)
* Fehler zurückgeben wenn irgendwas schief ging
* über dbus die Schnittstelle öffnen und schließen (dabei das Progamm aber nicht beenden)
====== Weiterführende Links ======
* [[http://schmufu.dyndns.org/svn/serialdbus|subversion repository]]
* [[http://schmufu.dyndns.org/viewvc/serialdbus|ViewVC für das repos]]