Guten Tag zusammen,
ich verzweifle zurzeit an folgendem Problem, und wäre wirklich sehr dankbar für Hilfe.
Mein Projekt ist es ein Ambilight zu bauen. Dafür verwende ich an der Led Steuerungs Seite einen Mikrocontroller welcher mit Arduino arbeitet. Dieser ist direkt an den Computer über USB angebunden und gibt sich dort als Virtuellen COM Port aus.
Das Funktionier auch alles ohne Probleme.
Als Steuerung am Computer greife ich mit der Robot Classe die einzelnen Pixel ab und will die RGB werte an den Mikrocontroller senden.
Um die Daten von Java an den COM Port zu bekommen habe ich folgenden Code genutzt
Dieser Stammt bis auf eine Änderung Komplet hierher:
Meine Änderung am Original Code ist das die Gesendete Nachricht "r255*" ist, also die Farbe Rot maximal aufleuchte soll.
Mein Problem ist nun das die Pause in der run void() zu lang ist mit 900 Millisekunden und ich sie gerne um einiges tiefer setzen würde. Allerdings kommt ab einer Pause von ca 800 Millisekunden am Mikrocontroller keine Reaktion mehr.
Andere Terminal Programme welche ebenfalls den Virtuellen COM Port nutzen machen bei weitaus kürzeren Pausen keine Probleme.
Ebenfalls habe ich zu Testzwecken eine "Virtuelle COM Brücke" erzeugt, also das zwei neue COM Ports erstellt werden welche miteinander Verbunden sind.
Auf meinem Terminal Programm hat das Komplett funktionier, auch bei sehr kurzen Pausen, und die Daten kamen auch immer Komplett an.:noe:
Hat irgendwer eine Ahnung wo die Bremse liegt die dafür sorgt das ich die Daten nicht schnell senden darf? Oder ist es einfach eine schlechte Idee mit Java so Hardware nah zu Arbeiten?
ich verzweifle zurzeit an folgendem Problem, und wäre wirklich sehr dankbar für Hilfe.
Mein Projekt ist es ein Ambilight zu bauen. Dafür verwende ich an der Led Steuerungs Seite einen Mikrocontroller welcher mit Arduino arbeitet. Dieser ist direkt an den Computer über USB angebunden und gibt sich dort als Virtuellen COM Port aus.
Das Funktionier auch alles ohne Probleme.
Als Steuerung am Computer greife ich mit der Robot Classe die einzelnen Pixel ab und will die RGB werte an den Mikrocontroller senden.
Um die Daten von Java an den COM Port zu bekommen habe ich folgenden Code genutzt
Java:
package com;
import gnu.io.*;
import java.io.IOException;
//import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
//import java.util.TooManyListenersException;
//import OeffnenUndSenden.serialPortEventListener;
public class SerialTest implements Runnable {
/**
* @param args
*/
public static void main(String[] args)
{
Runnable runnable = new SerialTest();
new Thread(runnable).start();
System.out.println("main finished");
}
/**
*
*/
CommPortIdentifier serialPortId;
Enumeration enumComm;
SerialPort serialPort;
OutputStream outputStream;
// InputStream inputStream;
Boolean serialPortGeoeffnet = false;
int baudrate = 9600;
int dataBits = SerialPort.DATABITS_8;
int stopBits = SerialPort.STOPBITS_1;
int parity = SerialPort.PARITY_NONE;
String portName = "COM8";
int secondsRuntime = 20;
public SerialTest()
{
System.out.println("Konstruktor: EinfachSenden");
}
public void run()
{
Integer secondsRemaining = secondsRuntime;
if (oeffneSerialPort(portName) != true)
return;
while (secondsRemaining > 0) {
System.out.println("Sekunden verbleiben: " + secondsRemaining.toString() );
secondsRemaining--;
try {
Thread.sleep(900);
} catch(InterruptedException e) { }
sendeSerialPort("r255*");
}
schliesseSerialPort();
}
boolean oeffneSerialPort(String portName)
{
Boolean foundPort = false;
if (serialPortGeoeffnet != false) {
System.out.println("Serialport bereits geöffnet");
return false;
}
System.out.println("Öffne Serialport");
enumComm = CommPortIdentifier.getPortIdentifiers();
while(enumComm.hasMoreElements()) {
serialPortId = (CommPortIdentifier) enumComm.nextElement();
if (portName.contentEquals(serialPortId.getName())) {
foundPort = true;
break;
}
}
if (foundPort != true) {
System.out.println("Serialport nicht gefunden: " + portName);
return false;
}
try {
serialPort = (SerialPort) serialPortId.open("Öffnen und Senden", 500);
} catch (PortInUseException e) {
System.out.println("Port belegt");
}
try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {
System.out.println("Keinen Zugriff auf OutputStream");
}
/*
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {
System.out.println("Keinen Zugriff auf InputStream");
}
try {
serialPort.addEventListener(new serialPortEventListener());
} catch (TooManyListenersException e) {
System.out.println("TooManyListenersException für Serialport");
}
serialPort.notifyOnDataAvailable(true);
*/
try {
serialPort.setSerialPortParams(baudrate, dataBits, stopBits, parity);
} catch(UnsupportedCommOperationException e) {
System.out.println("Konnte Schnittstellen-Paramter nicht setzen");
}
serialPortGeoeffnet = true;
return true;
}
void schliesseSerialPort()
{
if ( serialPortGeoeffnet == true) {
System.out.println("Schließe Serialport");
serialPort.close();
serialPortGeoeffnet = false;
} else {
System.out.println("Serialport bereits geschlossen");
}
}
void sendeSerialPort(String nachricht)
{
System.out.println("Sende: " + nachricht);
if (serialPortGeoeffnet != true)
return;
try {
outputStream.write(nachricht.getBytes());
} catch (IOException e) {
System.out.println("Fehler beim Senden");
}
}
}
Dieser Stammt bis auf eine Änderung Komplet hierher:
Meine Änderung am Original Code ist das die Gesendete Nachricht "r255*" ist, also die Farbe Rot maximal aufleuchte soll.
Mein Problem ist nun das die Pause in der run void() zu lang ist mit 900 Millisekunden und ich sie gerne um einiges tiefer setzen würde. Allerdings kommt ab einer Pause von ca 800 Millisekunden am Mikrocontroller keine Reaktion mehr.
Andere Terminal Programme welche ebenfalls den Virtuellen COM Port nutzen machen bei weitaus kürzeren Pausen keine Probleme.
Ebenfalls habe ich zu Testzwecken eine "Virtuelle COM Brücke" erzeugt, also das zwei neue COM Ports erstellt werden welche miteinander Verbunden sind.
Auf meinem Terminal Programm hat das Komplett funktionier, auch bei sehr kurzen Pausen, und die Daten kamen auch immer Komplett an.:noe:
Hat irgendwer eine Ahnung wo die Bremse liegt die dafür sorgt das ich die Daten nicht schnell senden darf? Oder ist es einfach eine schlechte Idee mit Java so Hardware nah zu Arbeiten?