Serialport Lesen schreiben in java
Ich habe eine Anwendung, wo ich schreiben müssen einige Daten an der seriellen Schnittstelle und die Antwort von ihm. Jetzt die Sequenz ist wie folgt:
- Senden Sie eine Nachricht an den seriellen port.
- auf die Reaktion warten
- Sobald die Antwort eingegangen ist, habe ich die Nachricht zu verarbeiten und bis dahin soll nichts geschehen, um die Anwendung.
Wie soll ich das brechen dieses problem und es lösen können ? Ich bin nicht gut in die serielle Programmierung. Ich habe einen code, aber meine Anwendung wird angehalten, wenn ich führen Sie die Nachricht senden. Kann sein, weil ich bin nach dem Lesen der Nachricht einfach nach dem senden einer Nachricht. Ich weiß wirklich nicht heißen, einen Ausweg aus diesem problem. Habe ich zu Beginn auf dem port lauschen, während Sie die Anwendung starten ? Muss ich ständig den port offen ? Ist es ok, wenn ich den port öffnen jedes mal muss ich das ? und wie soll ich das machen das Programm warten, um zu reagieren, bis die Antwort-Nachricht gelesen wird, bilden die Schnittstelle ? Bitte helfen Sie mir dieses problem lösen..
--EDIT--
package testConn;
import forms_helper.global_variables;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.comm.*;
import java.util.*;
/** Check each port to see if it is open. **/
public class openPort implements SerialPortEventListener {
static Enumeration portList;
static CommPortIdentifier portId;
static String messageString;
public static SerialPort serialPort;
static OutputStream outputStream;
InputStream inputStream;
static boolean outputBufferEmptyFlag = false;
public void open() {
Enumeration port_list = CommPortIdentifier.getPortIdentifiers();
while (port_list.hasMoreElements()) {
//Get the list of ports
CommPortIdentifier port_id = (CommPortIdentifier) port_list.nextElement();
if (port_id.getName().equals("/dev/ttyS1")) {
//Attempt to open it
try {
SerialPort port = (SerialPort) port_id.open("PortListOpen", 20);
System.out.println("Opened successfully");
try {
int baudRate = 9600; //
port.setSerialPortParams(
baudRate,
SerialPort.DATABITS_7,
SerialPort.STOPBITS_1,
SerialPort.PARITY_EVEN);
port.setDTR(true);
/*
port.setFlowControlMode(
SerialPort.FLOWCONTROL_NONE);
*
*/
System.out.println("properties are set");
} catch (UnsupportedCommOperationException e) {
System.out.println(e);
}
try {
//input = new SerialReader(in);
port.addEventListener(this);
System.out.println("listeners attached" + this);
} catch (TooManyListenersException e) {
System.out.println("too many listeners");
}
port.notifyOnDataAvailable(true);
//port.notifyOnOutputEmpty(true);
//sendMessage(port,"@PL");
//port.close ();
try {
inputStream = port.getInputStream();
System.out.println("inputstream" + inputStream.available());
outputStream = (OutputStream) port.getOutputStream();
} catch (IOException e) {
System.out.println(e);
}
//set the created variables to global variables
global_variables.port = port;
global_variables.inputStream = inputStream;
global_variables.outputStream = outputStream;
} catch (PortInUseException pe) {
System.out.println("Open failed");
String owner_name = port_id.getCurrentOwner();
if (owner_name == null) {
System.out.println("Port Owned by unidentified app");
} else //The owner name not returned correctly unless it is
//a Java program.
{
System.out.println(" " + owner_name);
}
}
}
}
}
public static void sendMessage(SerialPort port, String msg) {
if (port != null) {
try {
global_variables.outputStream.write(msg.getBytes());
global_variables.outputStream.flush();
try {
Thread.sleep(2000); //Be sure data is xferred before closing
System.out.println("read called");
//SimpleRead read = new SimpleRead();
//int read = global_variables.inputStream.read();
//System.out.println("read call ended"+read);
} catch (Exception e) {
}
} catch (IOException ex) {
Logger.getLogger(openPort.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
public void serialEvent(SerialPortEvent event) {
System.out.println(event.getEventType());
switch (event.getEventType()) {
/*
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
System.out.println("event.getEventType()");
break;
*
*/
case SerialPortEvent.DATA_AVAILABLE:
System.out.println("inside event handler data available");
byte[] readBuffer = new byte[20];
try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
System.out.print(new String(readBuffer));
System.exit(1);
} catch (IOException e) {
System.out.println(e);
}
break;
}
}
}
Was ist falsch an diesem code ? Ich kann nicht sehen, die Antwort vom terminal angeschlossen serialport, wenn ich senden eines polling-Nachricht. Ich bin dem öffnen der Verbindung auf meine Anwendung starten und ich bin die die Nachricht sendet, wenn eine Taste in meine Anwendung klicken. Wie löse ich das problem ??
InformationsquelleAutor Deepak | 2011-04-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sehen dieses wikibook, Abschnitt ereignisgesteuert Serielle Kommunikation.
Es ist schon eine Weile, wie ich brauchte, um zu sprechen mit einem searial port über java, aber der link, den ich gepostet war alles, was ich brauchte, und so weit ich weiß, hielt ich den serial port öffnen. Spaß haben
du kannst meinen code und lassen Sie mich wissen, was stimmt hier nicht ?
haben Sie die Antwort auf Ihre Frage. Ich habe ein ähnliches problem, wo ich ständig Lesen vom port (wenn Daten verfügbar sind) und je nachdem, welche Aktion des Benutzers auf der Benutzeroberfläche, die brauche ich zum schreiben der port. Sollte ich den port immer offen für lese-und schreibaktionen. Findet man keine Lösung oder eine nützliche Referenz bitte teilen Sie es.
InformationsquelleAutor moritz
Zuvor beantwortete Frage hier: Wie bekomme ich Java auf die serielle Schnittstelle verwenden in Linux?
Abhängig von Ihrer Plattform (wenn man auf einem *NIX-box) können Sie oft Weg mit Hilfe
stty
zum einstellen der baud rate/port-Einstellungen, und klicken Sie dann öffnen Sie einfach die/dev/tty*
port mit einem FileInputStream/FileOutputStream. Früher habe ich ein Stück code, der das Tat, und arbeitete sehr zuverlässig, aber jetzt, dass ich gehen auf der Suche für Sie scheint es abhanden gekommen zu sein. Traurig.aus dem link den du mir gegeben hast, habe ich nicht Probleme bei der öffnung der Hafen und zu schreiben. Aber ich couldnot die Antwort Lesen, bilden den Hafen, sobald die Nachricht geschrieben .. so was ist die Mutter ?
Sie könnte entweder eine Einstellung der Baudrate falsch oder Ihr lest nicht den Zugriff auf den port rechts. Auf welchem Betriebssystem laufen Sie auf, Linux oder Windows? Für Windows, die standard-JavaComm demos auf der oracle.com/technetwork/java/index-jsp-141752.html sollte ausreichen. Für linux, ist es nicht mehr engagiert und ohne Blick auf code, es wäre sehr schwierig zu Debuggen sind Ihre Probleme.
ich bin mit linux und ich bin Entsendung der code jetzt..
dieser code wird aufgehoben, aus dem java-tutorial website und ein bisschen modifiziert. aber es geht trotzdem arbeiten will 🙁
InformationsquelleAutor Femi