PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : JAVA: String über RS232 senden/empfangen


tsaG
2011-04-21, 12:55:59
Hi!

Ich habe damals mal ein Programm in vb.net geschrieben das über den Com Anschluss ein String versendet. Das alles war extrem kurz gehalten. Es sah in etwa so aus:

dim SP as new Serialport;
SP.open();
SP.write("blablabla");
SP.close()


So, das wars. Ich kenne die genaue Syntax leider auch nichtmehr. Es waren jedoch nur ein paar Zeilen. Wenn ich das ganze nun für Java suche (versuche es gerade darin zu realisieren) finde ich nur immer beispiele mit über 100 Zeilen. Mit Exception, verschiedenen Fehlermeldungen, Port einstellungen etc pipapo... das ganze brauche ich aber nicht (im Moment nicht).


das ganze suche ich auch um den Port auszulesen.. ging afaik mit etwas ala

dim ausgabe as String
ausgabe = SP.ReadExisting


ich finde es leider im Moment nicht :(


EDIT: Achja, ich benutze RXTX

huha
2011-04-21, 13:00:13
Für Java nimmt man da sinnvollerweise rxtx (http://rxtx.qbang.org/wiki/index.php/Main_Page). Dort gibt's auch Beispiele und Zeug.

-huha

tsaG
2011-04-21, 15:31:09
Hm, alles was ich bisher probiert habe funktioniert leider nicht und ist auch größer als 100 Zeilen Code.... Gibt es nicht etwas simpleres? einen einfachen 10 Zeiler oder sowas? Habe jetzt RXTX und die Java Communication API ausprobiert, alles ziemlicher overkill

huha
2011-04-21, 15:45:51
In diesem Beispiel (http://rxtx.qbang.org/wiki/index.php/Two_way_communcation_with_the_serial_port) ist eigentlich alles, was du brauchst.

connect dürfte interessant für dich sein. Das mußt du entsprechend umschreiben, um direkt an die beiden Streams ranzukommen und fertig.

-huha

tsaG
2011-04-21, 16:08:51
Hm, irgendwie klappt es noch nicht so ganz.

Ich habe per Nullmodemkabel den ausgabe Port mit einem anderen Port verbunden und einen Portlistener gestartet.

Wenn ich das Programm Compiliere und starte erhalte ich bei dem listener (also bei dem externen Programm folgende Meldung):

Status:(15:55:53)Clear to Send (CTS) signal changed state. CTS State = True
Status:(15:55:53)Clear to Send (CTS) signal changed state. CTS State = False
Status:(15:55:53)Clear to Send (CTS) signal changed state. CTS State = False

Das war es dann auch schon. Wenn ich über das Programm eine Nachricht sende, passiert in meinem Kompilat garnichts.

Warscheinlich habe ich noch nicht ganz durchgeblickt... aber was muss ich denn aufrufen um etwas zu empfangen bzw welche Funktion um etwas abzusenden?

Gast
2011-04-21, 16:32:38
Dafür hast du den InputStream und outputStream

senden
String str = "Hallo";
outputStream.write(str.getBytes());

empfangen
byte[] buffer = new byte[256];
int readedBytes = inputStream.read(buffer);

tsaG
2011-04-21, 17:37:15
Danke, das scheint schon etwas weiter zu helfen. Ich bin jedoch wie gesagt komplett neu im Objektorientierten Bereich (habe vorher mit vb.net geschrieben).

Ich habe jetzt mein TwoWaySerialComm.java, dieser Quelltext enthält den Code aus huhas Link.

in vb.net würde ich mir jetzt einen anderen *.java code (klasse) erstellen in dem ich einen knopf und eine textbox habe. auf den knopf würde ich jetzt

textbox1.text= TwoWaySerialComm.outputStream.write(str.getBytes());

legen.

bzw ein System.out.println(TwoWaySerialComm.outputStream.write(str.getBytes())); schreiben.....:redface::redface:

Gast
2011-04-21, 19:48:11
Probier mal das (ist ungetestet)

package rxtxhilfe;

import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;


public class Main {

JavaSerialPort port;
JTextField textField;

Main() {
port = new JavaSerialPort();

JFrame f = new JFrame("");
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
f.setSize( 170, 160 );
f.getContentPane().setLayout(new FlowLayout());

textField = new JTextField();
textField.setPreferredSize(new Dimension(100, 20));

JButton openButton = new JButton("open");
openButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
port.connect();
}
});

JButton receiveButton = new JButton("receive");
receiveButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
byte[] buffer = new byte[256];
int receivedBytes = port.receive(buffer);
if(receivedBytes > 0) {
String inputText = new String(buffer);
System.out.println(inputText);
}
}
});

JButton sendButton = new JButton("send");
sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
port.send(textField.getText().getBytes());
}
});

f.add(openButton);
f.add(receiveButton);
f.add(sendButton);
f.add(textField);

f.setVisible( true );
}

public static void main(String[] args) {
new Main();
}

}

package rxtxhilfe;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class JavaSerialPort {
CommPort commPort;
InputStream in;
OutputStream out;
boolean opened = false;

void connect() {
String portName = "COM3";
int baud = 57600;
int databits = SerialPort.DATABITS_8;
int stopbits = SerialPort.STOPBITS_1;
int parity = SerialPort.PARITY_NONE;

try {
CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

if ( portIdentifier.isCurrentlyOwned() )
{
System.out.println("Port wird schon benutzt");
}
else
{
CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

if ( commPort instanceof SerialPort )
{
SerialPort serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(baud,databits,stopbits,parity);

in = serialPort.getInputStream();
out = serialPort.getOutputStream();

System.out.println("Erfolgreich geöffnet");
opened = true;
}
else
{
System.out.println("Error: Only serial ports are handled by this example.");
}
}
}
catch(PortInUseException e) {
System.out.println("Port bereits offen");
}
catch(NoSuchPortException e) {
System.out.println("Port unbekannt");
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}

void send(byte[] buffer) {
if(opened) {
try {
out.write(buffer);
}
catch(IOException e) {
System.out.println(e.getMessage());
}
}
}

int receive(byte[] buffer) {
if(opened) {
try {
return in.read(buffer);
}
catch(IOException e) {
System.out.println(e.getMessage());
return 0;
}
}
else
{
return 0;
}
}

void close() {
if(opened) {
try {
in = null;
out = null;
commPort.close();
commPort = null;
opened = false;
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
}
}