Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

mit Mikrokontroller kommunizieren

Empfohlene Antworten

Veröffentlicht

Hi ich habe gerade ein kleines Verständnisproblem bei meinem Projekt.

Ich habe einen Mikrokontroller der je nach Eingabe bestimmte Werte liefert.

Eine Java-Server-Applikation soll nun mit den Mikrokontroller kommunizieren, dazu suche ich den richtigen USB-Port, öffne ihn und starte die Streams (Input/Output). Mit einem EventListener prüfe ich ob Daten vorhanden sind.

Nun habe ich das Problem, das mit der Beispieleingabe "OC" Daten einmal (vom Mikrokontroller) gesendet werden, diese aber anscheinend dauerhaft zur Verfügung stehen und dadurch obwohl nur einmal gefordert immer und immer wieder bearbeitet wird.

Darum die Frage, benutze ich im Moment vielleicht einen falschen EventListener, denn in der Doc steht "Data available at the serial port. This event will be generated once when new data arrive at the serial port. Even if the user doesn't read the data, it won't be generated again until next time new data arrive."?

public synchronized void serialEvent(SerialPortEvent oEvent) {

		try {

			output.write("OC\n".getBytes());

		} catch (Exception e) {

			System.err.println(e.toString());

		}

		if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {

			try { ...}catch (Exception e) {

				System.err.println(e.toString());

			}}

Der Mikrokontroller sendet erst Daten wenn er eine Eingabe erhält.

  • Autor

Ok Ich benutze den Arduino und benutze die SerialPort-Libaries von sun:

import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.io.OutputStream;

import java.util.Enumeration;


import javax.comm.SerialPort;

import javax.comm.SerialPortEvent;

import javax.comm.SerialPortEventListener;

Meine letzten Mikrocontroller Versuche sind etwas her aber wieso schreibst du in der event Methode als erstes erstmal wieder in den Outputstream? Was macht dein Controller damit? Kann es sein das er im Moment so eingestellt ist das alles was in den Controller rein kommt sofort wieder gesendet wird? Du so also eine Endlosschleife bekommst.

Ansonsten versuche dich erstmal mit folgenden Tutorial Arduino Playground - Java damit hatte ich vor längerem erfolg gehabt. Leider habe ich meine Hardware im Moment nicht in der nähe das ich es selbst noch mal versuchen könnte.

  • Autor

Hi danke für den Tipp ;)

Ich habe jetzt die Funktion ausgelagert, der EventListener hört jetzt auf das "ready" vom Mikrokontroller, sendet dann die Daten und verarbeitet sie.

Beim nächsten Schritt habe ich nur eine Verständnissfrage, wenn man die Java-Applikation starten soll, soll es eine Start-Methode geben, diese startet den Kontroller und der Eventlistener passt die Daten ab, gleichzeitig soll eine Getter-Methode Eben jene Werte jederzeit nach außen liefern können. Dafür muss ich Multithreading verwenden, oder?

  • Autor

Ok, also der Mikrokontroller wird als Klassenobjekt initialisiert, dabei wird die Verbindung (zum Mikrokontroller) aufgebaut und ein Eventlistener schreibt die erhaltenen Daten in Variablen. Eine Get-Methode greift diese ab und liefert diese gebündelt in einem Array zurück. Der Hauptthread der Klasse wird für 1000 Sekunden am Leben erhalten, damit weitere Daten ausgelesen werden können.

Initialisiert man nun diese Service-Klasse bekommt man mit der oben genannten Get-Methode die Daten, welche allerdings anfangs noch leer sind. Mithilfe eines weiteren Threads rufe ich die Get-Methode solange auf bis ich Daten habe.

Soweit zu meinem jetzigen Programm, die eigentliche Frage ist jetzt, gesetzt dem Fall das der Eventlistener zum selben Zeitpunkt Daten in die Variablen schreibt, wie die Get-Methode diese aufruft, bekomme ich dann noch die alten Daten, oder die neuen, oder irgendein Humbuk? (Ich kann diesen Fall im Moment leider nicht erzwingen um es selbst zu prüfen)

p.s. Ich habe es jetzt mit Multithreading gemacht

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.