Ein aktueller Kurs erfordert das Schreiben eines seriellen Kommunikationstools für obere Computer. Ich schrieb ein einfaches serielles Kommunikationstool mit einer grafischen Schnittstelle basierend auf Java. Der Prozess wird unten ausführlich für Ihre Referenz^_^beschrieben
eins:
Zunächst müssen Sie ein zusätzliches JAR -Paket herunterladen, das den Java Serial Port Communication Operation unterstützt. Da Java.comm relativ alt ist und 64-Bit-Systeme nicht unterstützt, wird empfohlen, dass RXTX JAR-Paket (sowohl 32-Bit/64-Bit-Unterstützung).
Offizielle Download-Adresse: http://fizzed.com/oss/rxtx-for-java (Hinweis: FQ kann zum Herunterladen erforderlich sein)
Kinderschuhe, die nicht FQ werden können, können hier heruntergeladen werden:
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (32-bit)
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (64-bit)
zwei:
Laden Sie das nicht gepackte Jar -Paket herunter und stellen Sie es unter Java Build -Pfad vor:
erfassen
Hinweis: Wenn ein Fehler von Java.lang.unsatisfiedLinkerror während des Betriebs geworfen wird, kopieren Sie bitte die beiden Dateien von rxtxParallel.dll und rXtxserial.dll in das Dekompressionspaket von RXTX in das Verzeichnis c:/window/system32, um den Fehler zu beheben.
drei:
In Bezug auf die Verwendung dieses JAR -Pakets schrieb ich eine serialtool.java -Klasse, die verschiedene einfache Dienste für die serielle Portkommunikation anbietet. Der Code ist wie folgt (beachten Sie, dass sich diese Klasse im Serialport -Paket befindet):
Paket serialport; import Java.io.ioxception; import Java.io.inputstream; Import Java.io.outputStream; Import Java.util.ArrayList; Import Java.util.enumeration; Import Java.util.toomanylistensException; Import Gnu.io.commport; gnu.io.nosuchportexception; importnu.io.portinusexception; import gnu.io.Serialport; importnu.io.io.ioSerialPortEventListener; importnu.io.ioNSupportedCommoperationException; importieren serialexception. @Author Zhong * */öffentliche Klasse Serialtool {private statische Serialtool Serialtool = NULL; static {// initialisieren Sie ein Serialtool -Objekt, wenn diese Klasse von Classloader if (serialtool == null) {serialtool = new Serialtool () geladen wird; } } //The constructor of the private SerialTool class is not allowed to generate SerialTool objects private SerialTool() {} /** * Get the SerialTool object that provides the service* @return serialTool */ public static SerialTool getSerialTool() { if (serialTool == null) { serialTool = new SerialTool(); } return serialtool; } /*** Finden Sie alle verfügbaren Ports* @return Liste der verfügbaren Portnamen* /public static Final ArrayList <string> findPort () {// Alle aktuell verfügbaren seriellen Ports Enumeration <Kommportidentifier> portlist = commportidentifier.getPortidentifiers (); ArrayList <string> portnamelist = new ArrayList <> (); // Der verfügbare serielle Portname zur Liste hinzufügen und die Liste zurückgeben (portlist.hasmoreElements ()) {String portname = portlist.nextElement (). GetName (); portnamelist.add (portname); } return portnamelist; } /*** Serienport öffnen* @param portname port name* @param baudrate baudrate* @return Serialport -Objekt* @Throws SerialPortParameterFailure fehlgeschlagen die seriellen Portparameter* @Wuts Notaserialport Der Port, der auf dem Seriennport entspricht. besetzt*/public static Final Serialport OpenPort (String Portname, int BaudRate) löscht SerialPortParameterFailure, Notaserialport, NoSuchport, Portinuse {try {// den Port identifizieren, indem der Port mit dem Portnamen portIdentifier portidentifier = commportidentifier.getIdentifier (Portname); // den Port öffnen und den Portnamen und eine Zeitüberschreitung (Zeitüberschreitungszeit des Öffnungsbetriebs) commport commport = portIdentifier.open (Portname, 2000); // verteidigen Sie, ob es sich um den seriellen Port handelt, wenn (commport -Instanz von Serialport) {Serialport Serialport = (Serialport) comport; Versuchen Sie {// Setzen Sie die Baud -Rate und andere Parameter des seriellen Ports serialport.setSerialPortParams (BauDrate, serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } catch (nicht unterstütztescommoperationException e) {neue SerialportParameterFailure () werfen; } //System.out.println("open " + portname +" Sucessition! "); Serialport zurückgeben; } else {// kein serieller Port werfen neuer notaserialport (); }} catch (NoSuchportException e1) {throw New NoSuchport (); } catch (portinusexception e2) {throw New Portinuse (); }} / *** Schließen Sie den seriellen Port* @param serialport Das serielle Port -Objekt, das geschlossen werden soll serialport = null; }} / *** Daten an den seriellen Port senden* @param Serialport Serialport -Objekt* @Param -Bestelldaten, die zugesandt werden sollen SendDatatoSerialPortFailure, SerialPortputStreamCloseFailure {outputStream out = null; try {out = serialport.getOutputStream (); out.write (order); out.flush (); } catch (ioException e) {throw New sendDatatoSerialPortFailure (); } endlich {try {if (out! = null) {out.close (); out = null; }} catch (ioException e) {neue SerialportputStreamClosefailure () werfen; }}} / *** Daten aus dem seriellen Port* @param serialport Das Serialport -Objekt mit einer Verbindung wurde festgelegt. ReadDatafromSerialPortFailure, SerialportInputStreamCloseFailure {InputStream in = null; byte [] bytes = null; try {in = serialport.getInputStream (); int bufflenth = in.Available (); // Die Datenlänge im Puffer abrufen (bufflenth! = 0) {bytes = new byte [bufflenth]; // Initialisieren Sie das Byte -Array auf die Datenlänge in Puffer in.read (Bytes); bufflenth = in.Available (); }} catch (ioException e) {neue readDatafromSerialPortfailure () werfen; } endlich {try {if (in! = null) {in.close (); in = null; }} catch (ioException e) {neue SerialportInputStreamClosefailure () werfen; }} return bytes; } /*** Hörer hinzufügen* @param Port Serial Port Object* @param Listener Serienport -Hörer* @throws toomanylistener Es gibt zu viele Hörklassenobjekte* /public static void addlistener (Serialport porte, serialPortEventIneNeer). // Setzen Sie den Aufwachen des Hörempfehungs -Threads, wenn Daten port ankommen. // So aufwecken Sie den Interrupt -Thread, wenn die Kommunikation unterbrochen wird. } catch (toomanylistenersException e) {werfen toomanylisteners (); }}}Hinweis: Die Ausnahmen in dieser Methode sind alle meine benutzerdefinierten Ausnahmen. Der Grund dafür ist, die entsprechende Verarbeitung im Hauptprogramm zu erleichtern. Hier finden Sie eine Beschreibung einer der Ausnahmen:
(Beachten Sie, dass alle meine benutzerdefinierten Ausnahmen im Serialexception -Paket platziert sind)
Paket SeriaLexception; öffentliche Klasse SerialportParameterFailure erweitert die Ausnahme { / ** * * / Private statische endgültige lange Serialversionuid = 1L; public serialPortParameterFailure () {} @Override public String toString () {return "SET SERIAL -Port -Parameter fehlgeschlagen! Das Öffnen des seriellen Portbetriebs ist nicht abgeschlossen!"; }}Ich habe seine Methode toString () für jede benutzerdefinierte Ausnahmeklasse neu geschrieben, damit das Hauptprogramm die entsprechende Fehlermeldung nach dem Auffang der Ausnahme drucken kann.
Es gibt auch eine Klasse im seriaLexception -Paket, in dem die Fehlerinformationen im empfangenen Ausnahmungsobjekt extrahiert und in eine Zeichenfolge umgewandelt und zurückgegeben werden. Der Code ist wie folgt:
Paket seriaLexception; import Java.io.ioException; import Java.io.printwriter; import Java.io.StringWriter;/*** verantwortlich für das Extrahieren und Konvertieren der Fehlermeldung in der bestandenen Ausnahme in eine Zeichenfolge; * @Author Zhong * */public class ExceptionWriter {/** * Die Fehlermeldung in der Ausnahme in eine Zeichenfolge inkapituliert und die Zeichenfolge zurückgibt. Printwriter PW = NULL; try {sw = new StringWriter (); PW = neuer Pressewriter (SW); E. Printstacktrace (PW); return "/r/n" + sw.toString () + "/r/n"; } catch (Ausnahme E2) {return "Eine Fehlermeldung wurde nicht erhalten, bitte überprüfen Sie und versuchen Sie es erneut!"; } endlich {try {if (pw! = null) {pw.close (); } if (sw! = null) {sw.close (); }} catch (ioException e1) {e1.printstacktrace (); }}}}Vier:
Die Verwendung der Hauptprogrammklasse, Client.java, enthält die Eintragsadresse des Programms (Hauptmethode). Seine Funktion besteht darin, eine Begrüßungsschnittstelle anzuzeigen und die Dataview.java -Klasse für die tatsächliche serielle Portdatenanzeige aufzurufen.
Client.java Code lautet wie folgt:
Paket Serialport; Import Java.awt.Color; Import Java.awt.flowlayout; Import Java.awt.font; Import Java.awt.Frame; Import Java.awt.graphics; Import Java.awt.gridlayout; Import Java.awt.image; java.awt.toolkit; import java.awt.event.keyadapter; import Java.awt.event.keyevent; import Java.awt.event.windowadapter; import Java.awt.event.windowEvent; Import Javax.swing.joptionPane; */public class Client erweitert Frame {/** * */private statische endgültige lange Serialversionuid = 1L; / *** Programmschnittstellenbreite*/ public static final int width = 800; / *** Programmschnittstellenhöhe*/ öffentliches statisches endgültiges int Höhe = 620; / ** * Der Ort der Programmschnittstelle (horizontale Koordinaten) */ öffentliches statisches Final int loc_x = 200; / ** * Der Ort der Programmschnittstelle (horizontale Koordinaten) */ öffentliches statisches Final int loc_y = 70; Farbe Farbe = Farbe.White; Bild offscreen = null; // verwendet zum Doppelpuffer // Setzen Sie das Symbol des Fensters (hier habe ich das Symbol des Fensters des Fensters angepasst, da ich wirklich denke, welches kleine Kaffee-Symbol nicht gut aussehend ist = =) Toolkit Toolkit = GetToolkit (); Image icon = Toolkit.getImage (client.class.getResource ("computer.png")); // andere Klassen dataview dataview = new Dataview (this) halten; // Hauptschnittstellenklasse der Hauptschnittstelle (Anzeige des Hauptdaten -Main -Panels)/*** Hauptmethode* @param args //*/public static void main (String [] args) {new client (). LaunchFrame (); } / *** Hauptschnittstelle anzeigen* / public void stirpframe () {this.setBounds (loc_x, loc_y, width, Höhe); // Setzen Sie den Ort, an dem das Programm auf dem Desktop this.settitle angezeigt wird ("CDIO -Projekt"); // Setzen Sie den Programmtitel this.seticonimage (Icon); this.setbackground (color.white); // Die Hintergrundfarbe this.addwindowlistener (neuer Fensteradapter () {// Anhörungen des Fensters status public void WindowsClosen (windowEvent arg0) {//system.exit(0); // das Programm}}) hinzufügen; this.addKeyListener (neuer Keymonitor ()); // den Tastaturhörer this.setResibable (false) hinzufügen; // Die Fenstergröße kann nicht geändert werden. // Das neue Thread für Anzeigefenster (neuer RepaintThread ()). Start (); // Der Repaint -Thread}/*** Zeichnen Sie verschiedene Komponentenelemente der Programmschnittstelle*/public void Paint (Grafik g) {Farbe c = g.getColor (); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 40)); g.setColor (color.black); G.Drawstring ("Willkommen, um das Echtzeitüberwachungssystem des oberen Computers zu verwenden", 45, 190); G.SetFont (neue Schriftart ("Microsoft Yahei", font.italic, 26)); g.setColor (color.black); G.Drawstring ("Version: 1.0 Angetrieben von: Zhonglei", 280, 260); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 30)); G.SetColor (Farbe); G.Drawstring ("" "" "" ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Color.White; Goffscreen.FillRect (0, 0, Höhe) // die Hintergrund-Leinwand this.setColor (C) neu aufnehmen; Ereignisse*/ private Klasse Keymonitor erweitert den Keyadapter {public void keyRepest (keyEvent e) {int keycode = e.getKeyCode (); if (keyCode == KeyEvent.vk_enter) {// Wenn der Monitor hört, dass der Benutzer die Tastatur eingabet, führen Sie die folgende Operation setvisible (false) aus; // Die Begrüßungsschnittstelle dataview.setvisible (true) ausblenden; // Die Überwachungsschnittstelle dataview.dataframe () anzeigen; // Initialisieren Sie die Überwachungsschnittstelle}}}/ * * den Thread neu ausarbeiten (Repaint alle 250 Millisekunden) */private Klasse Repaintthread implementiert Runnable {public void run () {while (true) {repaint (); try {thread.sleep (250); } catch (InterruptedException e) {// Erstellen Sie einen Dialogfeld, wenn ein Repaint -Thread eine Ausnahme ausgelegt hat und die Ausnahmedetails String err = exceptionWriter.GetErrorinFromexception (e) an zeigt; Joptionpane.showMessagedialog (null, err, "error", joptionpane.information_message); System.exit (0); }}}}}Laufen Screenshot:
HINWEIS: Der untere "Klicken Sie auf Taste ein, um die Hauptschnittstelle einzugeben" im tatsächlichen Betriebsprozess hat einen Flash-Effekt (er wird erreicht, indem die Schnittstelle von Zeit zu Zeit neu gestaltet wird, sodass dieser Satz wiederholt in weißen und schwarzen Farben angezeigt wird). Die doppelte Puffermethode löst das Problem des Flackerns der Schnittstelle beim Umbau (wenn Sie die doppelte Puffermethode nicht verwenden, ist gleichbedeutend mit dem Zeichnen neuer Dinge auf die alte Schnittstelle Bit für Stück jedes Mal, wenn Sie erneut abbauen, und das Doppelpufferung im Wesentlichen, indem Sie zuerst eine neue Schnittstelle in Erinnerung zeichnen und dann direkt das alte Interface mit dem neuen Interface mit dem neuen Interface mit dem neuen Interface mit dem neuen Interface einmal einsteht.
Der Code von Dataview.java lautet wie folgt: (Diese Klasse wird verwendet, um serielle Portdaten in Echtzeit anzuzeigen)
Einfache Erklärung:
Das Hardware -Gerät sendet von Zeit zu Zeit Daten über den seriellen Port über den seriellen Port. Nachdem das serielle Port -Tool erfolgreich mit dem Hardware -Gerät verbunden ist und eine Überwachung hinzufügt, wird die Daten analysiert und die Schnittstelle jedes Mal aktualisiert, wenn die Daten empfangen werden.
Ihre Anforderungen unterscheiden sich wahrscheinlich von meiner, wenn Sie sie verwenden. Diese Klasse dient nur als Referenz. In der tatsächlichen Verwendung müssen Sie möglicherweise die Datenanzeige- und Datenanalysemethode neu erstellen.
Paket Serialport; Import Java.awt.button; Import Java.awt.Choice; Import Java.awt.Color; Import Java.awt.font; import Java.awt.Frame; Import Java.awt.graphics; Import Java.awt.image; java.awt.event.actionEvent; import Java.awt.event.ActionListener; Import Java.awt.event.Windowadapter; Import Java.awt.event.windowEvent; Import Java.util.List; Importion Java.util.toomanylistenException; gnu.io.serialport; importnu.io.SerialPortEvent; import GNU.IO.ISERIALPORTEVENTLITILEER; Importieren seriaLexception. Client Client = null; private list <string> commlist = null; // verfügbare Portnummern speichern private serialport serialport = null; // Serienportobjekt private Schriftart font = new Font ("Microsoft Yahei", font.bold, 25); Private Label TEM = New Label ("NICHT Daten noch", label.Center); // Temperatur Private Label HUM = New Label ("NICHT Daten noch", label.Center); // Luftfeuchtigkeit Private Label PA = New Label ("NOT -Daten noch", label.Center); // Druck privatetikett Rain = New Label ("NOT Daten noch", label.Center); // Niederschlag private Label Win_SP = New Label ("No Data Noch", Label.Center); // Windgeschwindigkeit Private Label Win_DIR = New Label ("No Data Noch", Label.Center); // Windrichtung Private Choice commcoice = new Choice (); // serielle Portauswahl (Dropdown-Box) Private Choice bpSchoice = new Choice (); // schlechte Ratenauswahl private Taste OpenSerialButton = New Button ("Serielle Port öffnen"); Bild offscreen = null; // Leinwand beim Wiederholen // das Symbol des Fenster -Toolkit -Toolkits = GetToolkit () festlegen; Image icon = Toolkit.getImage (dataview.class.getResource ("computer.png")); / *** Klassenkonstruktor* @param Client*/ public dataview (Client Client) {this.client = client; commlist = serialtool.findport (); // scannen Sie den gültigen seriellen Port einmal, wenn das Programm initialisiert wird} /*** Das Hauptmenüfenster wird angezeigt. * Fügen Sie Etikett, Schaltfläche, Dropdown-Leiste und das zugehörige Ereignisanhören hinzu. */ public void dataframe () {this.setBounds (client.loc_x, client.loc_y, client.width, client.height); this.settitle ("CDIO -Projekt"); this.seticonimage (Ikone); this.setbackground (color.white); this.setLayout (null); this.addwindowlistener (neuer Fensteradapter () {public void windowsClosing (windowEvent arg0) {if (serialport! tem.setBounds (140, 103, 225, 50); tem.setbackground (color.black); tem.setfont (Schriftart); tem.setforenground (color.white); add (tem); Hum.Setbounds (520, 103, 225, 50); hum.setbackground (color.black); Hum.setFont (Schriftart); hum.setforegrown (color.white); hinzufügen (hum); Pa.SetBounds (140, 193, 225, 50); Pa.Setbackground (color.black); Pa.SetFont (Schriftart); pa.setforenground (color.white); add (pa); Rain.Setbounds (520, 193, 225, 50); Rain.Setbackground (color.black); Rain.setFont (Schriftart); Rain.setforenground (color.white); hinzufügen (Regen); win_sp.setBounds (140, 283, 225, 50); win_sp.setbackground (color.black); win_sp.setfont (font); win_sp.setforground (color.white); add (win_sp); win_dir.setBounds (520, 283, 225, 50); win_dir.setbackground (color.black); win_dir.setfont (font); win_dir.setforenground (color.white); add (win_dir); // serielle Portauswahloption für serielle Anschlüsse hinzufügen. // Überprüfen Sie, ob ein serieller Anschluss verfügbar ist. If (commist == null || commlist.size () <1) {joptionpane.showMessagedialog (null, "kein gültiger serieller Port wurde gefunden!", "Fehler", joptionpane.information_message); } else {for (string s: commlist) {commcoice.add (s); }} add (commkoice); // Die Option BPSchoice der Baudrate Rate hinzufügen. BpSchoice.add ("1200"); BpSchoice.add ("2400"); BpSchoice.add ("4800"); BpSchoice.add ("9600"); BpSchoice.add ("14400"); BpSchoice.add ("19200"); BpSchoice.add ("115200"); add (bpSchoice); // Fügen Sie die OpenSerial -Button -Taste der Seriennport hinzu. OpenSerialButton.Setbackground (color.Lightgray); OpenSerialButton.setFont (neue Schriftart ("Microsoft Yahei", Font.bold, 20)); OpenSerialButton.setforenground (color.darkgray); add (OpenSerialButton); // Ereignisanhörungen für die offene serielle Port -Taste OpenSerialButton.AddactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {// Erhalten Sie den seriellen Portnamen String Commname = commChoice (commname == null || commname.equals ("") {joptionpane.showMessagedialog (null, "kein gültiger serieller Anschluss!", "Fehler", joptionpane.information_message); JOPTIONPANE.SHOWMESSAGEDIALOG (NULL, "Schlechter Rate wird Fehler erhalten!", "Fehler", joptionpane.information_message); Serialtool.openport (Commname, BPS); // Der Monitor wird für eine erfolgreiche Überwachung von joptionpane.showmessagedialog (NULL, "Der Monitor ist erfolgreich, die Überwachungsdaten später angezeigt!", "Eingabeaufforderung", joptionpane.information_message); } catch (SerialPortParameterFailure | Notaserialport | NoSuchport | Portinuse | toomanylistener e1) {// Wenn ein Fehler auftritt, verwenden Sie einen Dialog, um die spezifische Fehlermeldung JOPTIONPANE.ShowMessagedialog (Null, E1, "Fehler", joptionpane.information_message) zu fordern; }}}}}}); this.setResizable (falsch); neuer Thread (neuer RepaintThread ()). start (); // den Repaint -Thread starten}/*** Zeichnen Sie das Haupt -Schnittstellenkomponentenelement*/public void Paint (Graphics g) {Farbe c = g.getColor (); g.setColor (color.black); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 25)); G.Drawstring ("Temperatur:", 45, 130); g.setColor (color.black); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 25)); G.Drawstring ("Feuchtigkeit:", 425, 130); g.setColor (color.black); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 25)); G.Drawstring ("Druck:", 45, 220); g.setColor (color.black); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 25)); G.Drawstring ("Rain:", 425, 220); g.setColor (color.black); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 25)); G.Drawstring ("Windgeschwindigkeit:", 45, 310); g.setColor (color.black); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 25)); G.Drawstring ("Windrichtung:", 425, 310); g.setColor (color.gray); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 20)); G.Drawstring ("Serielle Portauswahl:", 45, 410); g.setColor (color.gray); G.SetFont (neue Schriftart ("Microsoft Yahei", Font.bold, 20)); g.drawstring ("schlechter Rate:", 425, 410); } / *** Double Puffering -Methode reflektiert jede Elementkomponente der Schnittstelle. Grafik goffscreen = offscreen.getGraphics (); Farbe c = goffscreen.getColor (); goffscreen.setColor (color.white); goffscreen.fillRect (0, 0, client.width, client.height); // Die Hintergrundkanal danach this.paint (Goffscreen) neu streichen; // das Schnittstellenelement goffscreen.setColor (c) neu streichen; G.Drawimage (Offscreen, 0, 0, Null); // "Spray" die neu gezeichnete Leinwand auf den ursprünglichen Leinwand}/ * * Repaint -Thread (alle 30 Millisekunden neu reportieren) */private Klasse RepaintThread -Geräte Runnable {public void run () {while (true) {// rufen Sie die Repaint -Methode Repaint () an; // scannen Sie den verfügbaren seriellen Port commlist = serialtool.findport (); if (commlist! Der anfängliche Standard ist nicht existiert (wenn es in Comm -Liste vorhanden ist, aber in Commkoice nicht existiert, wird es neu hinzugefügt) boolean prexist = false; für (int i = 0; i <commcoice.getItemCount (); i ++) {if (s.equals (commChoice.getItem (i))) {// Der aktuell gescannte serielle Portname existiert bereits im ersten Scan capexist = true; brechen; }} if (cmaxist) {// Der aktuell gescannte serielle Portname ist bereits im ersten Scan vorhanden und tritt direkt in die nächste Schleife ein. } else {// Wenn es nicht vorhanden ist, fügen Sie den neuen seriellen Portnamen dem verfügbaren seriellen Port-Dropdown-Liste commcoice.add (s) hinzu; }} // Entfernen Sie den bereits nicht verfügbaren seriellen Port für (int i = 0; i <commChoice.getItemCount (); i ++) {// Ob der serielle Port abgelaufen ist, ist der anfängliche Standard ungültig. für (String S: CommList) {if (s.equals (commcoice.getItem (i)) {commnotexist = false; brechen; }} if (commnotexist) {//system.out.println("remove " + commChoice.getItem (i)); commkoice.remove (i); } else {Fortsetzung; }}} else {// Wenn die gescannte Komml. } try {thread.sleep (30); } catch (InterruptedException e) {String err = exceptionWriter.getErrorinfoFromexception (e); Joptionpane.showMessagedialog (null, err, "error", joptionpane.information_message); System.exit (0); }}}}} / *** Erstellen Sie eine serielle Hörklasse in Form einer internen Klasse. SerialPortEvent.bi: // 10 Kommunikation Interrupt joptionpane.showMessagedialog (null, "Kommunikation unterbrechen mit seriellem Gerät", "Fehler", joptionpane.information_message); brechen; Fall serialPortEvent.oe: // 7 Überlauf (Überlauf) Fehlerfall serialPortEvent.fe: // 9 Frame Fehler Fall SerialPortEvent.pe: // 8 Paritätsfehler Fall SerialPortEvent.cd: // 6 Carrier Detection Fall SerialPortEvent.CTS: // 3 klare Daten, die serialportevent.ddsr: // /4 die Daten sind, die gesendet werden. 5 Ringing zeigt Case serialPortEvent.output_Buffer_Empty: // 2 Der Ausgangspuffer wurde gelöscht. Fall serialPorteVent.data_available: // 1 verfügbare Daten sind auf dem seriellen Port // system.out.println ("Found Data") vorhanden; byte [] data = null; try {if (serialport == null) {joptionpane.showMessagedialog (null, "Das serielle Portobjekt ist leer! Überwachung fehlgeschlagen!", "Fehler", joptionpane.information_message); } else {data = serialtool.readfromport (Serialport); // Daten lesen und in Byte -Array speichern // system.out.println (neue String (Daten)); // Anpassen des Analyseprozesses können die Daten nach dem Empfangen der Daten während des tatsächlichen Gebrauchsprozesses analysieren, wenn (Data == NULL || Data.Length <1) {// Überprüfen Sie, ob die Daten korrekt gelesen werden. System.exit (0); } else {String dataOriginal = new String (Daten); // Byte -Array -Daten in eine Zeichenfolge konvertieren, die die ursprüngliche Datenzeichenfolge Datavalid = "" speichert; // Gültige Daten (verwendet, um die Originaldatenzeichenfolge zu speichern und die Zeichenfolge nach Beginn * Nummer zu entfernen) String [] Elements = null; // zum Speichern des String -Array, das nach dem Aufteilen der ursprünglichen Zeichenfolge durch Spaces erhalten wurde // Die Daten analysieren if (DataOriginal.Charat (0) == ' *') {// Wenn das erste Zeichen der Daten die * Nummer ist, bedeutet dies, dass der Datenempfang abgeschlossen ist und das Parsen datavalid = dataoriginal.substring (1); Elements = datavalid.split (""); if (elements == null || elements.length <1) {// Überprüfen Sie, ob die Daten korrekt analysiert werden. System.exit (0); } else {try {// Aktualisieren Sie den Interface -Label -Wert/*für (int i = 0; i <elements.length; i ++) {System.out.println (Elements [i]); }*///System.out.println("win_dir: " + Elemente [5]); tem.setText (Elemente [0] + "℃"); Hum.setText (Elemente [1] + " %"); pa.setText (Elemente [2] + "HPA"); Rain.setText (Elemente [3] + "mm"); win_sp.setText (Elemente [4] + "m/s"); win_dir.setText (Elemente [5] + "°"); } catch (arrayIndexoutOfBoundSexception e) {joptionpane.showMessagedialog (NULL, "Der Datenanalyseprozess hat einen Fehler, und die Daten zur Aktualisierung der Schnittstelle sind fehlgeschlagen! Bitte überprüfen Sie das Gerät oder das Programm!", "Fehler", joptionpane.information_message); System.exit (0); }}}}}}} catch (readDatafromSerialPortfailure | serialportInputStreamClosefailure e) {joptionpane.showMessagedialog (null, e, "error", joptionpane.information_message); System.exit (0); // das System beenden, nachdem die Fehlermeldung angezeigt wurde, wenn ein Lesefehler auftritt} BREAK; }}}}Laufen Screenshot:
Laden Sie den gesamten Projektquellcode herunter: http://xiazai.vevb.com/201612/yuanma/javaserialmonitor(vevb.com).rar
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.