Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen gezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
serialdbus:start [2011/08/07 14:05] Patrick Wacker beispiel zur Benutzung hinzugepfügt |
serialdbus:start [2011/08/07 22:05] (aktuell) Patrick Wacker punkte die noch implementiert werden könnten hinzugefügt |
||
---|---|---|---|
Zeile 9: | Zeile 9: | ||
===== Verwendung ===== | ===== Verwendung ===== | ||
+ | |||
+ | ==== Programm Parameter (-h|--help) ==== | ||
+ | Ausgabe von 'serialdbus --help' | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
==== Start des Programms ==== | ==== Start des Programms ==== | ||
Zeile 34: | Zeile 68: | ||
<file bash dbusserial.sh> | <file bash dbusserial.sh> | ||
#!/bin/bash | #!/bin/bash | ||
- | + | # | |
- | export SERIALDBUS="/home/user/bin/serialdbus" | + | # bash Script das in andere Scripte eingebunden werden kann um Daten über |
+ | # eine serielle Schnittstelle zu senden. | ||
+ | # | ||
+ | export SERIALDBUS="../build/./serialdbus" | ||
function serial_init() | function serial_init() | ||
{ | { | ||
- | local device; | + | local device; |
- | local baudrate; | + | local baudrate; |
- | local dbusname; | + | local dbusname; |
- | local stopbits; | + | local stopbits; |
- | local databits; | + | local databits; |
- | local flowcontrol; | + | local flowcontrol; |
- | local parity; | + | local parity; |
- | local serial_export; | + | local serial_export; |
- | + | ||
- | if [[ -z "$1" ]]; then | + | local interface; |
- | device="/dev/ttyS0" | + | local grepret; |
- | else | + | |
- | device="$1" | + | if [[ -z "$1" ]]; then |
- | fi | + | device="/dev/ttyS0" |
- | + | else | |
- | if [[ -z "$2" ]]; then | + | device="$1" |
- | dbusname="Ser0" | + | fi |
- | else | + | |
- | dbusname="$2" | + | if [[ -z "$2" ]]; then |
- | fi | + | dbusname="Ser0" |
- | + | else | |
- | #Exportiert den Verwendeten Namen für diese Schittstelle | + | dbusname="$2" |
- | serial_export="SERIAL_${dbusname}" | + | fi |
- | export ${serial_export}=${dbusname} | + | |
- | + | if [[ -z "$3" ]]; then | |
- | if [[ -z "$3" ]]; then | + | baudrate=19200 |
- | baudrate=19200 | + | else |
- | else | + | baudrate="$3" |
- | baudrate="$3" | + | fi |
- | fi | + | |
- | + | if [[ -z "$4" ]]; then | |
- | if [[ -z "$4" ]]; then | + | databits=8 |
- | databits=8 | + | else |
- | else | + | databits="$4" |
- | databits="$4" | + | fi |
- | fi | + | |
- | + | if [[ -z "$5" ]]; then | |
- | if [[ -z "$5" ]]; then | + | flowcontrol="none" |
- | flowcontrol="none" | + | else |
- | else | + | flowcontrol="$5" |
- | flowcontrol="$5" | + | fi |
- | fi | + | |
- | + | if [[ -z "$6" ]]; then | |
- | if [[ -z "$6" ]]; then | + | stopbits=1 |
- | stopbits=1 | + | else |
- | else | + | stopbits="$6" |
- | stopbits="$6" | + | fi |
- | fi | + | |
- | + | if [[ -z "$7" ]]; then | |
- | if [[ -z "$7" ]]; then | + | parity="none" |
- | parity="none" | + | else |
- | else | + | parity="$7" |
- | parity="$7" | + | fi |
- | fi | + | |
- | + | # Alle Werte wurden auf Standart oder den übergebenen Wert gesetzt | |
- | # Alle Werte wurden auf Standart oder den übergebenen Wert gesetzt | + | |
- | + | # Instanz von serialdbus starten und alle Ausgaben des Programs | |
- | # Instanz von serialdbus starten | + | # nach /dev/null schicken |
- | $SERIALDBUS "$device" "$dbusname" -b "$baudrate" -d "$databits" -f "$flowcontrol" -s "$stopbits" -p "$parity" & | + | $SERIALDBUS "$device" "$dbusname" -b "$baudrate" -d "$databits" -f "$flowcontrol" -s "$stopbits" -p "$parity" >/dev/null 2>&1 & |
- | + | ||
- | return 0; | + | 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 | + | # Beendet die genutzte serielle Schnittstelle |
function serial_deinit() | function serial_deinit() | ||
{ | { | ||
- | if [[ -z "$1" ]]; then | + | if [[ -z "$1" ]]; then |
- | echo "PROGRAMMING ERROR at ${FUNCNAME}: supply a DBUSNAME at \$1" | + | echo "PROGRAMMING ERROR at ${FUNCNAME}: supply a DBUSNAME at \$1" |
- | return 1 | + | return 1 |
- | fi | + | fi |
- | + | ||
- | qdbus org.schmufu.serialdbus /${1} org.schmufu.serialdbus.quit | + | qdbus org.schmufu.serialdbus /${1} org.schmufu.serialdbus.quit |
- | + | ||
- | return 0 | + | return 0 |
} | } | ||
| | ||
Zeile 119: | Zeile 168: | ||
function serial_send() | function serial_send() | ||
{ | { | ||
- | local ret; | + | local ret; |
- | local str; | + | local str; |
- | ret=1; | + | ret=1; |
- | if [[ -z "$1" ]]; then | + | if [[ -z "$1" ]]; then |
- | echo -en "PROGRAMMING ERROR at ${FUNCNAME} - supply a dbusname at \$1!\n" | + | echo -en "PROGRAMMING ERROR at ${FUNCNAME} - supply a dbusname at \$1!\n" |
- | return 1 | + | return 1 |
- | fi | + | fi |
- | + | ||
- | if [[ -z "$2" ]]; then | + | if [[ -z "$2" ]]; then |
- | echo -en "PROGRAMMING ERROR at ${FUNCNAME} - supply a text to sent at \$2!\n" | + | echo -en "PROGRAMMING ERROR at ${FUNCNAME} - supply a text to sent at \$2!\n" |
- | return 1 | + | return 1 |
- | fi | + | fi |
- | + | ||
- | + | ||
- | str=$(qdbus org.schmufu.serialdbus /${1} org.schmufu.serialdbus.apply "$2") | + | str=$(qdbus org.schmufu.serialdbus /${1} org.schmufu.serialdbus.apply "$2") |
- | if [[ "x${str}" != "xtrue" ]]; then | + | if [[ "x${str}" != "xtrue" ]]; then |
- | ret=1 | + | ret=1 |
- | else | + | else |
- | ret=0 | + | ret=0 |
- | fi | + | fi |
- | + | ||
- | return $ret | + | return $ret |
} | } | ||
- | # Setzt die globale Variable $MEAS auf den Empfangenen String | + | # Setzt die globale Variable $SERIALRECV auf den Empfangenen String |
- | function serial_recv() | + | function serial_receive() |
{ | { | ||
- | local str; | + | local str; |
- | + | ||
- | if [[ -z "$1" ]]; then | + | if [[ -z "$1" ]]; then |
- | echo -en "PROGRAMMING ERROR at ${FUNCNAME} - supply a dbusname at \$1!\n" | + | echo -en "PROGRAMMING ERROR at ${FUNCNAME} - supply a dbusname at \$1!\n" |
- | return 1; | + | return 1; |
- | fi | + | fi |
- | + | ||
- | str=""; | + | str=""; |
- | + | ||
- | str=$(qdbus org.schmufu.serialdbus /${1} org.schmufu.serialdbus.receive) | + | str=$(qdbus org.schmufu.serialdbus /${1} org.schmufu.serialdbus.receive) |
- | MEAS="${str}"; | + | SERIALRECV="${str}"; |
- | } | + | } |
</file> | </file> | ||
Zeile 163: | Zeile 212: | ||
Verwendet werden kann dies dann wie folgt | Verwendet werden kann dies dann wie folgt | ||
- | <file bash ser1.sh> | + | <file bash serial_example.sh> |
#!/bin/bash | #!/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 | #include the main functions | ||
. dbusserial.sh | . dbusserial.sh | ||
- | SER=serial1 | + | SER=serial1 # der Name für die serialdbus instanz (frei wählbar!) |
- | serial_init /dev/ttyUSB1 ${SER} 19200 8 none 1 none | + | # ü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 | if [[ $? -ne 0 ]]; then | ||
- | echo "ERROR: could not open /dev/ttyUSB1 as ${SER} for serial communication" | + | # Ein Fehler ist bei der Initialisierung aufgetreten |
- | exit 1 | + | echo "ERROR: could not open /dev/ttyUSB1 as '$SER' for serial communication" |
+ | exit 1 # Script abbrechen | ||
fi | fi | ||
- | # von jetzt an kann über $SER gelesen und geschrieben werden | + | # von jetzt an kann über "serial_send" gelesen und über "serial_receive" geschrieben werden |
- | serial_send ${SER} "Diese Daten werden gesendet" | + | # wenn TxD mit RxD verbunden ist wird das was gesendet wird auch wieder empfangen |
+ | serial_send $SER "Diese Daten " | ||
+ | serial_send $SER "werden gesendet" | ||
- | # wenn TxD mit RxD verbunden ist kann über | + | # wir holen die Empfangen Daten ab |
- | serial_receive ${SER} | + | serial_receive $SER |
- | RX="${MEAS}" | + | # in $SERIALRECV steht jetzt der empfangene String |
- | # auf den gesendeten String reagiuer werden | + | echo "Empfangen wurde:" |
- | ## ${RX} = "Diese Daten werden gesendet" | + | 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 | # zum schluss muss die Schnittstelle wieder geschlossen werden | ||
- | serial_deinit ${SER} | + | serial_deinit $SER |
</file> | </file> | ||
+ | |||
+ | ====== 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 ====== | ====== Weiterführende Links ====== |