Serielle Kommunikation

Lorenz

Mitglied
Hallo Forum,

ich habe eine Frage zu einem Kommunikationsproblem.
Ich kommuniziere mit Java mit meinem uC.
Habe ich die Möglichkeit mit folgendem Code das Byte b nur ein einziges mal zu senden und dann die Kommunikation zu beenden?

Zeile 75 - 77.

[Java]
import java.io.InputStream;
import java.i😵utputStream;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import java.util.Enumeration;

public class Serial implements SerialPortEventListener {
SerialPort serialPort;
/** The port we're normally going to use. */
private static final String PORT_NAMES[] = {"COM4"};
/** Buffered input stream from the port */
private InputStream input;
/** The output stream to the port */
private OutputStream output;
/** Milliseconds to block while waiting for port open */
private static final int TIME_OUT = 2000;
/** Default bits per second for COM port. */
private static final int DATA_RATE = 115200;

public void initialize() {
CommPortIdentifier portId = null;
Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

// iterate through, looking for the port
while (portEnum.hasMoreElements()) {
CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
for (String portName : PORT_NAMES) {
if (currPortId.getName().equals(portName)) {
portId = currPortId;
break;
}
}
}

if (portId == null) {
System.out.println("Could not find COM port.");
return;
}

try {
// open serial port, and use class name for the appName.
serialPort = (SerialPort) portId.open(this.getClass().getName(),
TIME_OUT);

// set port parameters
serialPort.setSerialPortParams(DATA_RATE,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);

// open the streams
input = serialPort.getInputStream();
output = serialPort.getOutputStream();

// add event listeners
serialPort.addEventListener(this);
serialPort.notifyOnDataAvailable(true);
} catch (Exception e) {
System.err.println(e.toString());
}
}


/**
* Handle an event on the serial port. Read the data and print it.
*/
public synchronized void serialEvent(SerialPortEvent oEvent) {
if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
try {
int available = input.available();
byte chunk[] = new byte[available];
input.read(chunk, 0, available);
String Send ="10000";
b = Send.getBytes();
output.write(b);



// Displayed results are codepage dependent
System.out.print(new String(chunk));
} catch (Exception e) {
System.err.println(e.toString());
}
}
// Ignore all the other eventTypes, but you should consider the other ones.
}

public static void main(String[] args) throws Exception {
Serial main = new Serial();
main.initialize();
System.out.println("Started");


}
}

[/Java]

Grüße
 
Wäre mal gut zu wissen, was für ein uC das ist. und wie er programmiert ist. ausserdem lässt sich eine Kommunikation auf mehrere Arten beenden.
1. man hört einfach auf, Daten zu senden bzw. zu empfangen. (removeEventListener)
2. man schliesst die Datenströme.
3. man schliesst den Port.

Bei 1. und 2. bleibt der Port definitiv belegt. bei 3. weis ich nicht, ob zu Freigabe die JVM beendet werden muss, dass andere Software ausserhalb Java drauf zugreifen kann. Auf jeden Fall lässt er sich aber von Java aus afaik erneut öffnen.
 
Moin,

es handelt sich um einen Arduino Uno.

Das "einfach" aufhören wäre warscheinlich am besten, so dass ich gegebenenfalls wieder einen neuen Wert senden kann. Welche möglichkeiten habe ich um "einfach" aufzuhören zu senden? Thread.sleep bringt mich ja hier nicht weiter oder? Ich müsste das ganze solange unterbrechen bis ich einen neuen Wert senden will. Mein Problem ist, dass ich nicht genau weis wo ich das ganze unterbrechen kann!

Grüße
 
Ach der UNO... 😉
Wenn der so programmiert ist, dass er ständig Daten sendet, musst du wohl das EventSystem des Seriellen Ports abstellen, der Arduino sendet seine Daten dann allerdings in den Hades. Besser wäre es, wenn man im Arduino ein "Kommunikations-Protokoll" realisiert mit dem man ihm sagt, wann er senden darf und wann nicht. Ich müsste dazu mal was suchen.
 
Hey Spacerat,

den Uno habe ich eigentlich so weit im griff, der Sendet nur wenn ich ihm das sage.
Mein Problem ist eher, dass mein Java Programm (s.oben) mir die ganze Zeit das erwähnte Byte sendet und ich das eigentlich nur einmalig machen will.

Grüße
 
Tja... aus meiner sicht sieht das gerade so aus:
1. Byte b in deinem Code ist ist scheinbar nirgendwo definiert und würde durch "10000".getBytes() ein Bytearray aus 5 Bytes (49, 48, 48, 48, 48) ergeben, welche dann natürlich auch gesendet werden.
2. Der UNO kann innerhalb eines Loops maximal 128 Bytes (Standard-Serial) senden, diese können von der JVM auch innerhalb eines SerialPortEvents nach "chunk" gelesen werden. Prinzipiell bedeutet ein "Serial.print()" auf dem Arduino exakt ein Event in der JVM.
Sofern die relevanten Zeilen (75 - 77) öfters als einmal aufgerufen werden, kann daraus eigentlich nur folgen, dass auf der Arduino-Seite "Serial.print()" mehr als nur einmal aufgerufen wird. Das die Loop-Methode dort kontinuierlich aufgerufen wird muss ich dir nicht erzählen denk' ich. Vllt. postest du mal den relevanten Arduino-Code möglichst in CODE-Tags.
Eine weitere Fehlerquelle könnte die Beschaltung der digitalen Pins 0 und 1 des UNOs sein, welche bei aktiviertem SerialPort als TX und RX extern verwendet werden und über UART und USB direkt an den virtuellen COM-Port gelangen.
 

Zurück
Oben