staging.inyokaproject.org

Arduino ausgaben von Seriellem Anschluss lesen und dann befehl/skript starten

Status: Ungelöst | Ubuntu-Version: Ubuntu GNOME 17.04 (Zesty Zapus)
Antworten |

Deavy

Anmeldungsdatum:
11. Oktober 2012

Beiträge: 126

Hallo,

ich möchte gerne die Ausgabe von meinem Arduino (über den seriellen Anschluss /dev/ttyACM0), auslesen und dann jeh nach Ausgabe ein skript/shotcut/befehl ausführen lassen.

Und zwar geht es um Funksignale welche jeweils einen Code wie z.b. 0x30459 an den Funkempfänger, der an den Arduino angeschlossen ist,

für die gedrückte Taste auf der Fernbedienung in der Arduino IDE kann ich diese ja im Seriellen Monitor empfangen.

Ich weiß das es möglich ist (ist ja linux da ist in der richtung alles möglich 😛) und vielleicht ist es ja sogar viel einfacher als den Lösungsweg den ich jetzt im Kopf hab aber ich hab den Arduino noch nicht so lang und kenn mich noch nicht gut aus damit und deswegen frag ich einfach mal so in die runde.

Deavy

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

Deavy In welcher Programmiersprache soll das denn geschehen? In FreeBASIC könnte der Ansatz beispielsweise so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
DIM f AS INTEGER
DIM s AS STRING

f = FreeFile
OPEN COM "/dev/ttyACM0:9600,N,8,1" AS #f
DO UNTIL EOF(f)
  LINE INPUT #f, s
  SELECT CASE s
    CASE "0x30459"
      EXEC("sh", "-c 'echo Hallo'")
    CASE ELSE
      PRINT "Unknown command ";s
  END SELECT
LOOP
CLOSE #f

In anderen Programmiersprachen entsprechend ähnlich.

Deavy

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2012

Beiträge: 126

Also ich kenn mich nur bisschen mit der bash und minimal C/c++ aus.

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

@Deavy: Na das sind doch dann immerhin schon mal drei Programmiersprachen. In Bash könnte das (ungetestet) ungefähr so aussehen:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
readonly SerialDevice='/dev/ttyACM0'


Main() {
    local serial

    exec {serial}<> "$SerialDevice"
    sleep 1
    stty -F "$SerialDevice" 9600 cread clocal cs8
    while read -r line; do
        if [[ $line == '0x30459' ]]; then
            echo 'Hallo'
        else
            echo "Unknown command: $line"
        fi
    done <&$serial
    exec {serial}>&-
}


[[ ${BASH_SOURCE[0]} = "$0" ]] && Main "$@"

Deavy

(Themenstarter)

Anmeldungsdatum:
11. Oktober 2012

Beiträge: 126

Hi, Sorry für die späte Antwort aber jetzt habe ich mal die Zeit, müsste es nicht auf einen Tick einfacher gehen an sich verstehe ich die ganzen Vorgänge aber es wäre nett wenn du mit den Exec Befehl etwas mehr erklären könntest. Das gibt an sich so funktioniert nicht habe auch schon bisschen rumgebastelt aber kriege es nicht so zum Laufen wie ich will habe mir von stty die Hilfe durchgelesen und daraufhin da auch ein bisschen rumgespielt dennoch ohne Erfolg. Und Ruth verlangt der auch immer wobei das eher unwichtig jetzt erstmal ist, könntest du mir eventuell schon einfach den Befehl geben dass er überhaupt eine Ausgabe von dem Anschluss aus als eine Line

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4735

exec führt ein Kommando aus und man kann Ein-/Ausgabe-Umleitungen angeben. Wenn man kein Kommando angibt, dann gelten die Umleitungen für den aktuellen Shell-Prozess. Ich habe da kein Kommando angegeben, sondern nur die Ein- und Ausgabe von $SerialDevice umgeleitet werden soll und zwar an einen Dateideskriptor den die Bash aussucht und der Variablen $serial zuweist. Für das vorliegende Skript hätte wahrscheinlich eine Eingabeumleitung gereicht. Denn den Dateideskriptor in der Variablen $serial wird dann verwendet um die Daten aus dieser Datei in die while-Schleife umzuleiten.

In anderen Programmiersprachen ist das was dort mit exec gemacht wird mit Anweisungen oder Funktionen die open und close oder so ähnlich heissen gelöst. Also die Zeilen 5 und 15 in dem FreeBASIC-Programm weiter oben. Das f dort entspricht dem serial im Bash-Skript.

Ein Fehler den ich da gemacht habe ist das stty hinter das Öffnen zu schreiben. Das solltest Du davor verschieben.

Dann könnte es noch ein Problem geben wenn die Gegenseite keine Zeilenendezeichen am Ende der Zeilen sendet sondern Wagenrücklaufzeichen. Das müsste man dem read mit der entsprechenden Option beibringen.

Ich würde erst einmal nach dem Einstellen der seriellen Schnittstellenparameter und dem öffnen der Datei, die Datei in ein Programm wie hd (hexdump) umleiten und schauen was die Gegenseite tatsächlich an Bytewerten sendet.

Antworten |