Un curso reciente requiere escribir una herramienta de comunicación en serie para las computadoras superiores. Escribí una herramienta de comunicación en serie simple con una interfaz gráfica basada en Java. El proceso se describirá en detalle a continuación para su referencia^_^
uno:
En primer lugar, debe descargar un paquete JAR adicional que admite la operación de comunicación del puerto serie Java. Dado que Java.comm es relativamente antiguo y no admite sistemas de 64 bits, se recomienda que el paquete RXTX JAR (soporte de 32 bits/64 bits).
Dirección de descarga oficial: http://fizzed.com/oss/rxtx-for-java (nota: se puede requerir FQ para descargar)
Los zapatos para niños que no pueden ser FQ se pueden descargar aquí:
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (32 bit)
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (64 bit)
dos:
Descargue el paquete JAR de desacuerdo y preséntelo en Java Build Rath:
captura
Nota: Si un error Java.lang.unsatisfiedlinkError se lanza durante la operación, copie los dos archivos del directorio rxtxparallel.dll y rxtxserial.dll en el paquete de descompresión rxtx al directorio C:/Windows/System32 para resolver el error.
tres:
Con respecto al uso de este paquete JAR, escribí una clase SerialTool.Java, que proporciona varios servicios simples para la comunicación de puertos serie. El código es el siguiente (tenga en cuenta que esta clase se encuentra en el paquete Serialport):
paquete serialport; import java.io.ioException; import java.io.inputstream; import java.io.outputstream; import java.util.arrayList; import java.util.enumeration; import java.util.toomanylistenerSexception; importar gnu.io.commport; importar; import gnu.io.nosuchportException; import gnu.io.portinuseException; import gnu.io.serialport; import gnu.io.serialportEventListener; import gnu.io.unsupportedComMoperationException; importación de importación.*;/*** CLASE SERICIAL DEL PORTO SERICIO AS APORTE ASPRESA A LA APERTURA Y CERNA DEL PORTO SERIAL, SERVICIO (SERVICIO SERIAL. Modo de diseño Singleton) * @author zhong * */public class SerialTool {private static serialtool serialTool = null; static {// Inicializar un objeto SerialTool cuando esta clase está cargada por ClassLoader if (SerialTool == NULL) {SerialTool = new SerialTool (); }} // El constructor de la clase privada serialtool no está permitido generar objetos serialtool private serialtool () {} /*** Obtener el objeto SerialTool que proporciona el servicio* @return serialtool* /public static serialtool getalTool () {si (serialtool == null) {serialtool = new SerialTool (); } return serialTool; } /*** Encuentre todos los puertos disponibles* @return Lista de nombres de puertos disponibles* /public static final ArrayList <String> findport () {// Obtenga todas las enumeración de puertos seriales disponibles actualmente <CommportIdentifier> PortList = CommportIdidentifier.getPortAdidentifiers (); ArrayList <String> PortnamElist = new ArrayList <> (); // Agregue el nombre del puerto serie disponible para enumerar y devolver la lista mientras (portList.hasmoreElements ()) {String PortName = PortList.NextElement (). GetName (); portnamelist.add (portname); } return PortnamElist; } /*** Abra el puerto serie* @param Nombre del puerto de Portname* @param Baudrate Baudrate* @return Serialport Object* @throws SerialPortParameterFailure No se pudo establecer los parámetros del puerto de serie* @throws Notaserialport El puerto que apunta al dispositivo no es el tipo de puerto de serial* @throws to: Ocupado*/public static final Serialport OpenPort (String PortName, int Baudrate) lanza SerialPortParameterFailure, NotAserialport, Nosuchport, Portinuse {try {// Identifica el puerto por el nombre del puerto CommportIdidentifier Portidentifier = Commportidentifier.getPortidentifier (PortName); // Abra el puerto y proporcione el nombre del puerto y un tiempo de espera (tiempo de tiempo de espera de la operación de apertura) Commport Commport = PortIdentifier.open (Portname, 2000); // Defender si es el puerto serie if (Commport instanceOf Serialport) {Serialport Serialport = (Serialport) Commport; Pruebe {// Establezca la tasa de baudios y otros parámetros del puerto serie Serialport.SetSerialPortParams (Baudrate, Serialport.databits_8, Serialport.stopbits_1, serialport.parity_none); } Catch (UnsupportedComMoperationException e) {tirar nueva SerialPortParameterFailure (); } //System.out.println("open " + portname +" con éxito! "); Return Serialport; } else {// no portuarios seriales tirar nueva notaSerialPort (); }} Catch (nosuchportException e1) {lanzar new nosuchport (); } Catch (PortInUseException e2) {Throw New PortInuse (); }} / *** Cierre el puerto serie* @param Serialport El objeto del puerto serie se cerrará* / public static void ClosePort (Serialport Serialport) {if (serialport! = Null) {serialport.close (); Serialport = nulo; }} / *** Envíe datos al puerto serie* @param Serialport Serialport Object* @param Los datos de pedidos se enviarán* @throws sendDatatoserialPortfailure No se pudo enviar datos al puerto de serie* @throws SerialportutputputStreamCloseFailure Cerrar el error de flujo de salida del objeto de puerto serial* / Público no SendDatatoserialPortFailure, SerialPortOutputStreamCloseFailure {outputStream out = null; intente {out = serialport.getOutputStream (); out.write (orden); out.flush (); } Catch (ioException e) {tire nuevo sendDatatoserialPortFailure (); } finalmente {try {if (out! = null) {out.close (); out = nulo; }} Catch (ioException e) {tire nuevo serialportOutputStreamCloseFailure (); }}} / *** Lea los datos del puerto serie* @param Serialport El objeto Serialport con una conexión se ha establecido* @return los datos lectura* @throws readDataFromSerialPortfailure un error ocurrido mientras lee datos del puerto serial* @throws SerialputStReamCloSeFailure Close Serial Entrada de entrada de puerto Opjeto fluido* / Public static byte [] [] ReadDataFromSerialPortFailure, SerialPortInputStreamCloseFailure {inputStream in = null; byte [] bytes = null; intente {in = serialport.getInputStream (); int bufflenth = in.available (); // Obtenga la longitud de los datos en el búfer mientras (Bufflenth! = 0) {bytes = new byte [bufflenth]; // Inicializar la matriz de bytes a la longitud de los datos en buffer in.read (bytes); bufflenth = in.available (); }} catch (ioException e) {tire readDataFromSerialPortFailure (); } finalmente {try {if (in! = null) {in.close (); in = nulo; }} Catch (ioException e) {tire nuevo serialportInputStreamCloseFailure (); }} bytes de retorno; } /*** Agregue el oyente* @param objeto de puerto serie* @param oyente oyente de puerto serie* @throws toomanylisteners Hay demasiados objetos de clase de escucha* /public static void addlistener (puerto de puerto de serial, serialportEntener listener) lanza toomanylistener {intit {// add oyeGeur // Establecer para despertar el hilo de recepción de escucha cuando llegan los datos Port.notifyondataAVailable (verdadero); // Establecer para despertar el hilo de interrupción cuando la comunicación se interrumpe el puerto. NoTifyOnbreakInterrupts (verdadero); } Catch (ToomanyListeneReSexception e) {arrojar nuevos toomanylisteners (); }}}Nota: Las excepciones de lanzamiento en este método son todas mis excepciones personalizadas. La razón de esto es facilitar el procesamiento correspondiente en el programa principal. Aquí hay una descripción de una de las excepciones:
(Tenga en cuenta que todas mis excepciones personalizadas se colocan en el paquete SeriaException)
paquete SeriaException; public class SerialPortParameterFailure extiende la excepción { / ** * * * / private static final Long SerialVersionUid = 1l; public SerialPortParameterFailure () {} @Override public String toString () {return "Establezca los parámetros del puerto serie! }}He reescrito su método ToString () para cada clase de excepción personalizada, para que el programa principal pueda imprimir el mensaje de error correspondiente después de atrapar la excepción.
También hay una clase en el paquete SeriaException que extrae la información de error en el objeto de excepción recibido y la convierte en una cadena y la devuelve. El código es el siguiente:
paquete SeriaException; import java.io.ioException; import java.io.printwriter; import java.io.stringwriter;/*** Responsable de extraer y convertir el mensaje de error en la excepción pasada en una cadena; * @author zhong * */public class ExceptionWriter {/** * Encapsula el mensaje de error en excepción en una cadena y devuelve la cadena * @param e contiene la excepción de error * @return Mensaje de error String */public static String getErrorInfofromException (excepción e) {stringwriter sw = null; PrintWriter pw = null; intente {sw = new StringWriter (); PW = nuevo PrintWriter (SW); E.PrintStackTrace (PW); return "/r/n" + sw.ToString () + "/r/n"; } capt (excepción e2) {return "no se obtuvo un mensaje de error, por favor verifique y vuelva a intentarlo!"; } finalmente {try {if (pw! = null) {pw.close (); } if (sw! = null) {sw.close (); }} catch (ioException e1) {e1.printstackTrace (); }}}}Cuatro:
El uso de la clase de programa principal, Client.java contiene la dirección de entrada del programa (método principal). Su función es mostrar una interfaz de bienvenida y llamar a la clase DataView.java para la visualización de datos de puerto serie real.
El código Java Client.Java es el siguiente:
paquete 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.awt.awt.image; import java.awt.awt.laBel; import.awt.awt.awt; import; 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; import serialexception.exception;/*** @Author Zhhor ZhiTor Zhhor ZhiTor ZHUNTOR ZHONTOR ZHONTOR ZHONTOR ZHONTOR ** ** ** ** ** ** ** ** ** ** ** ** ** ** ** *** @AUTHOR ZHONTOR */Public Class Client extiende el marco {/** * */Private Static final Long SerialVersionUid = 1l; / *** Ancho de interfaz del programa*/ public static final int width = 800; / *** Altura de la interfaz del programa*/ public static final int homent = 620; / ** * La ubicación de la interfaz del programa (coordenadas horizontales) */ public static final int loc_x = 200; / ** * La ubicación de la interfaz del programa (coordenadas horizontales) */ public static final int loc_y = 70; Color color = color.white; Imagen fuera de la pantalla = nulo; // Utilizado para el búfer doble // Establecer el icono de la ventana (aquí personalicé el icono del icono de la ventana de Windows, porque realmente creo que qué pequeño icono de café no es bueno = =) Toolkit toolkit = getToolkit (); Icon de imagen = Toolkit.getImage (cliente.class.getResource ("Computer.png")); // Mantenga otras clases DataView DataView = new DataView (this); // Clase de interfaz principal (que muestra el panel principal de datos de monitoreo)/*** Método principal* @param args //*/public static void main (string [] args) {new Client () .unchFrame (); } / *** Mostrar interfaz principal* / public void Launchframe () {this.setBounds (loc_x, loc_y, ancho, altura); // Establecer la ubicación donde aparece el programa en el escritorio this.settitle ("Proyecto CDIO"); // establecer el título del programa this.SeticOnImage (icono); this.setbackground (color.white); // Establezca el color de fondo this.addwindowlistener (new WindowAdapter () {// Agregar escucha al estado de la ventana public void WindowClosing (WindowsEvent Arg0) {//system.exit(0); // Salir del programa}}); this.addkeylistener (new KeyMonitor ()); // Agregar el escucha del teclado this.setResizable (falso); // El tamaño de la ventana no se puede cambiar esto.setVisible (verdadero); // La ventana de visualización nueva hilo (nueva Repainthread ()). Start (); // El hilo de repintado}/*** Dibuja varios elementos de componentes de la interfaz del programa*/public void Paint (Graphics g) {color c = g.getColor (); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 40)); G.SetColor (color.black); G.DrawString ("Bienvenido a usar el sistema de monitoreo en tiempo real de la computadora superior", 45, 190); G.SetFont (nueva fuente ("Microsoft Yahei", Font.italic, 26)); G.SetColor (color.black); G.DrawString ("Versión: 1.0 alimentado por: Zhonglei", 280, 260); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 30)); G.SetColor (color); G.DrawString ("" "--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Color.white; GoffScreen.SetColor (Color.White); El Canvas original} /** la clase interna implementa el monitoreo de los eventos de teclado* / Kymonitor de clase privada extiende KeyAdapter {public void KeyReleaded (KeyEvent E) {int KeyCode = E.GetKeyCode (); if (keycode == keyEvent.vk_enter) {// Cuando el monitor escucha que el usuario presenta la tecla Ingrese del teclado, ejecute la siguiente operación setVisible (false); // ocultar la interfaz de bienvenida DataView.SetVisible (true); // Mostrar la interfaz de monitoreo DataView.DataFrame (); // Inicializar la interfaz de monitoreo}}}/ * * Repaint el hilo (repintado cada 250 milisegundos) */private class RepaintThread implementa runnable {public void run () {while (true) {repint (); intente {thread.sleep (250); } Catch (InterruptedException e) {// Cree un cuadro de diálogo cuando un hilo de repintado lanza una excepción y muestra la excepción Detalles String Err = ExceptionWriter.getErrorInfofromException (e); JOptionPane.ShowMessEdialog (NULL, ERR, "Error", JOptionPane.Information_Message); System.exit (0); }}}}}Ejecución de captura de pantalla:
Nota: La tecla Interior "Haga clic en ENTRAR para ingresar a la interfaz principal" en el proceso de operación real tiene un efecto de flash (se logra redrazando la interfaz de vez en cuando, lo que permite que esta oración aparezca repetidamente en colores blancos y negros). El método de doble almacenamiento en búfer es propicio para resolver el problema de parpadear la interfaz al volver a dibujar (si no usa el método de doble almacenamiento en búfer, es equivalente a dibujar cosas nuevas en la interfaz de la vieja interfaz cada vez que vuelve a dibujar, y el doble buffering es esencialmente dibujando una nueva interfaz en la memoria, y luego cubrir directamente la interfaz anterior con la nueva interfaz a la vez)
El código DataView.java es el siguiente: (esta clase se utiliza para mostrar datos de puerto serie en tiempo real)
Explicación simple:
El dispositivo de hardware envía datos a la computadora a través del puerto serie de vez en cuando. Después de que la herramienta del puerto serie se conecta correctamente al dispositivo de hardware y agrega un monitoreo, analizará los datos y actualizará la interfaz cada vez que se reciban los datos;
Es probable que sus requisitos sean diferentes de los míos al usarlo. Esta clase es solo de referencia. En uso real, es posible que deba recrear la interfaz de visualización de datos y el método de análisis de datos.
paquete 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; import java.awt.Abel; import java.awt.event.ActionEvent; import java.awt.event.actionListener; import java.awt.event.windowadapter; import java.awt.event.windowevent; import java.util.list; import java.util.toomanylistenerxception; import javax.swing.jope gnu.io.serialport; import gnu.io.serialportEvent; import gnu.io.serialportEventListener; import serialexception.*;/*** Monitoreo de la pantalla de visualización de datos* @author zhong**/public class dataView extiende el marco {/****/privado estatico final longitud larga = 1l; Cliente cliente = nulo; Lista privada <String> CommList = NULL; // Guardar números de puerto disponibles privado serialport serialport = null; // Guardar objeto de puerto serie Fuente privado Font = nueva fuente ("Microsoft Yahei", Font.Bold, 25); Etiqueta privada TEM = nueva etiqueta ("No hay datos todavía", etiqueta.center); // Etiqueta privada de temperatura Hum = nueva etiqueta ("Sin datos todavía", etiqueta.center); // Etiqueta privada de humedad PA = nueva etiqueta ("No hay datos todavía", etiqueta.center); // Presión de etiqueta privada lluvia = nueva etiqueta ("sin datos todavía", etiqueta.center); // Label de lluvia privada win_sp = nueva etiqueta ("sin datos todavía", etiqueta.center); // etiqueta privada de velocidad de viento win_dir = nueva etiqueta ("sin datos todavía", etiqueta.center); // Dirección del viento Choice privado comChoice = new Choice (); // Selección de puerto en serie (cuadro desplegable) Choice privado bpschoice = new Choice (); // Selección de tarifa mala botón privado OpenSerialButton = botón nuevo ("Abrir puerto serie"); Imagen fuera de la pantalla = nulo; // lienzo cuando se reproduce // Establezca el icono de Window Toolkit Toolkit = getToolkit (); Icon de imagen = Toolkit.getImage (dataView.class.getResource ("Computer.png")); / *** constructor de clases* @param client*/ public dataView (cliente cliente) {this.client = client; commList = SerialTool.FindPort (); // Escanear el puerto serie válido una vez cuando se inicializa el programa} /*** se muestra la ventana del menú principal; * Agregar etiqueta, botón, barra desplegable y escucha de eventos relacionados; */ public void dataFrame () {this.setBounds (client.loc_x, client.loc_y, client.width, client.height); this.settitle ("Proyecto CDIO"); this.seticOnImage (icono); this.setbackground (color.white); this.setLayout (nulo); this.AddWindowlistener (New WindowAdapter () {public void WindowClosing (WindowEvent Arg0) {if (Serialport! = Null) {// Cierre el puerto serie cuando el programa sale y libera el recurso SerialTool.ClosePort (Serialport);} System.exit (0);}); Tem.setBounds (140, 103, 225, 50); tem.setbackground (color.black); tem.setFont (fuente); tem.setForeground (color.white); agregar (tem); Hum.setBounds (520, 103, 225, 50); hum.setbackground (color.black); hum.setfont (fuente); hum.setforeground (color.white); agregar (hum); PA.SetBounds (140, 193, 225, 50); Pa.setBackground (color.black); Pa.setFont (fuente); PA.setForeground (color.white); agregar (pa); Rain.setbounds (520, 193, 225, 50); Rain.setBackground (color.black); Rain.setFont (fuente); Rain.setForeground (color.white); agregar (lluvia); win_sp.setBounds (140, 283, 225, 50); win_sp.setbackground (color.black); win_sp.setFont (fuente); win_sp.setforeground (color.white); agregar (win_sp); win_dir.setBounds (520, 283, 225, 50); win_dir.setbackground (color.black); win_dir.setfont (fuente); win_dir.setforeground (color.white); agregar (win_dir); // Agregar opción de selección de puerto serie Comschoice.setBounds (160, 397, 200, 200); // Verifique si hay un puerto serie disponible. If (commList == null || commlist.size () <1) {joptionPane.showMessEdialog (nulo, "¡No se encontró un puerto serie válido!", "Error", jOptionPane.Information_Message); } else {para (String S: CommList) {comChoice.Add (s); }} add (comChoice); // AGREGAR OPCIÓN DE TIEZA DE BAUDA BPSCHOICE.SetBounds (526, 396, 200, 200); bpschoice.add ("1200"); bpschoice.add ("2400"); bpschoice.add ("4800"); bpschoice.add ("9600"); bpschoice.add ("14400"); bpschoice.add ("19200"); bpschoice.add ("115200"); agregar (bpschoice); // Agregar el botón Open Serial Port OpenSerialButton.setBounds (250, 490, 300, 50); OpenSerialButton.SetBackground (color.lightgray); OpenSerialButton.setFont (nueva fuente ("Microsoft Yahei", Font.Bold, 20)); OpenSerialButton.setForeground (color.DarkGray); Agregar (OpenSerialButton); // Agregue el evento escucha para el botón Open Serial Port OpenSerialButton.AdDActionListener (new ActionListener () {public void ActionPerformed (ActionEvent E) {// Obtenga la cadena de nombre del puerto serie CommName = comChoice.getSeledItem (); // Obtener la calificación Baud BPSSTR = BPSCHOICE.getSelectedItem (); (CommName == NULL || CommName.equals ("")) {jOptionPane.ShowMessEdialog (nulo, "No se encontró un puerto serie válido!", "Error", joptionPane.Information_Message); JoptionPane.ShowMessEdialog (NULL, "¡La tasa incobrable se obtiene error!", "Error", JoptionPane.Information_Message); SerialTool.openport (Commname, BPS); // se solicita al monitor para monitorear exitoso joptionPane.ShowMessEdialog (nulo, "El monitor es exitoso, ¡los datos de monitoreo se mostrarán más tarde!", "Aviso", jOptionPane.Information_Message); } Catch (SerialPortParameterFailure | Notaserialport | Nosuchport | Portinuse | ToomanyListeners e1) {// Cuando ocurre un error, use un cuadro de diálogo para solicitar el mensaje de error específico JOptionPane.ShowMessedialog (NULL, E1, "Error", jOptionPane.information_message); }}}}}}); this.setResizable (falso); nuevo hilo (new RepaintThread ()). Start (); // Inicie el hilo de repintado}/*** Dibuja el elemento componente de la interfaz principal*/public void Paint (Graphics g) {color c = g.getColor (); G.SetColor (color.black); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Temperatura:", 45, 130); G.SetColor (color.black); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Humedad:", 425, 130); G.SetColor (color.black); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Presión:", 45, 220); G.SetColor (color.black); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Lluvia:", 425, 220); G.SetColor (color.black); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Velocidad del viento:", 45, 310); G.SetColor (color.black); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Dirección del viento:", 425, 310); G.SetColor (color.gray); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 20)); G.DrawString ("Selección de puerto serie:", 45, 410); G.SetColor (color.gray); G.SetFont (nueva fuente ("Microsoft Yahei", Font.Bold, 20)); G.DrawString ("Tasa mala:", 425, 410); } / *** El método de doble almacenamiento en búfer se reproduce cada componente de elemento de la interfaz* / public void Update (Graphics g) {if (OffScreen == NULL) OffScreen = this.CreateImage (Client.Width, Client.Height); Graphics goffScreen = OffScreen.getGraphics (); Color c = goffscreen.getColor (); goffscreen.setColor (color.white); goffscreen.fillrect (0, 0, client.width, client.height); // repinte el lienzo de fondo this.Paint (GoffScreen); // repinte el elemento de interfaz goffscreen.setColor (c); G.DrawImage (fuera de pantalla, 0, 0, nulo); // "rociar" el lienzo recién dibujado en el lienzo original}/ * * hilo de repintado (repintar cada 30 milisegundos) */private class repinthread implementa runnable {public void run () {while (true) {// llame al método de repintado repintear (); // escanear el puerto serie disponible commlist = serialtool.findport (); if (commlist! = null && commlist.size ()> 0) {// Agregar el puerto serie disponible recién escaneado para (String S: CommList) {// ¿El nombre del puerto serie ya existe? No se existen el valor inicial (si existe en Commlist pero no existe en Comchoice, se agregará recientemente) Boolean CommExist = false; for (int i = 0; i <comschoice.getItemCount (); i ++) {if (s.equals (comChoice.getItem (i))) {// El nombre del puerto serie actualmente escaneado ya existe en el escaneo inicial comexist = true; romper; }} if (comexist) {// El nombre del puerto serie escaneado actualmente ya existe en el escaneo inicial, y ingresa directamente el siguiente bucle continúa; } else {// Si no existe, agregue el nuevo nombre del puerto serie a la lista desplegable del puerto serie disponible comChoice.Add (s); }} // Eliminar el puerto serie ya no disponible para (int i = 0; i <comschoice.getItemCount (); i ++) {// Si el puerto serie ha expirado, el valor predeterminado inicial no es válido (existen en comChoice pero no existe en comlist, ha caducado) boolean Commnotexist = verdadero; verdadero; para (String S: CommList) {if (s.equals (comChoice.getItem (i))) {commnotexist = false; romper; }} if (commnotexist) {//system.out.println("remove " + comschoice.getItem (i)); comChoice.remove (i); } else {continuar; }}} else {// Si la lista de comunicación escaneada está vacía, elimine todos los puertos seriales existentes comChoice.removeAll (); } try {thread.sleep (30); } capt (interruptedException e) {string err = excepcionwriter.getErrorInfofromException (e); JOptionPane.ShowMessEdialog (NULL, ERR, "Error", JOptionPane.Information_Message); System.exit (0); }}}} Ial SerialPortEvent.bi: // 10 Interrupción de comunicación JOptionPane.ShowMessEdialog (NULL, "Interrupción de comunicación con dispositivo serie", "Error", jOptionPane.Information_Message); romper; caso SerialPorteVent.oe: // 7 Overflow (Overflow) Error Case SerialPortEvent.fe: // 9 Error de marco Case SERIALPORTEVENT.PE: // 8 Error de paridad Caso SerialPortEvent.cd: // 6 Case de detección de portería Case SerialPortEvent.cts: // 3 Datos claros para que se envíe el caso SerialPortEvent.dsrr: // 4 Los datos de los datos se listan en serie: 5 El rumbo indica el caso SerialPortEvent.output_buffer_empty: // 2 El búfer de salida se ha eliminado el ruptura; case serialporteVent.data_available: // 1 Los datos disponibles existen en el puerto serie // system.out.println ("datos encontrados"); byte [] data = null; Pruebe {if (serialport == null) {joptionPane.showMessageDialog (NULL, "El objeto de puerto serie está vacío! ¡El monitoreo fallido!", "Error", jOptionPane.Information_Message); } else {data = SerialTool.ReadFromPort (Serialport); // Leer datos y almacenarlos en la matriz de bytes // system.out.println (nueva cadena (datos)); // Personalizar el proceso de análisis, puede analizar los datos después de recibir los datos de acuerdo con sus propias necesidades durante el proceso de uso real si (data == null || data.length <1) {// verifica si los datos se leen correctamente joptionpane.showMessedialog (null ", no se obtuvieron datos válidos durante la lectura! System.exit (0); } else {String dataRiginal = new String (datos); // Convertir los datos de la matriz de bytes en una cadena que guarda la cadena de datos original dataValid = ""; // Datos válidos (se usan para guardar la cadena de datos original y eliminar la cadena después del número * número *) String [] Elements = null; // Se utiliza para guardar la matriz de cadenas obtenida después de dividir la cadena original por espacios // analizar los datos if (dataRiginales elements = dataValid.split (""); if (elements == null || Elements.length <1) {// verifique si los datos se analizan correctamente joptionPane.ShowMessEdialog (nulo, "El proceso de análisis de datos tiene un error, verifique el dispositivo o el programa", "Error", jOptionPane.Information_Message); System.exit (0); } else {try {// Actualice el valor de la etiqueta de la interfaz/*for (int i = 0; i <elements.length; i ++) {System.out.println (Elements [i]); }*///System.out.println("win_dir: " + Elements [5]); Tem.Settext (Elementos [0] + "℃"); hum.settext (elementos [1] + " %"); Pa.settext (elementos [2] + "HPA"); Rain.settext (elementos [3] + "mm"); win_sp.settext (elementos [4] + "m/s"); win_dir.settext (elementos [5] + "°"); } Catch (ArrayIndexoUtofBoundsexception e) {jOptionPane.showMessEdialog (nulo, "El proceso de análisis de datos tiene un error, y la interfaz de actualización ha fallado! System.exit (0); }}}}}}} Catch (readDataFromSerialPortFailure | SerialportInputStreamCloseFailure e) {jOptionPane.ShowMessEdialog (NULL, E, "Error", jOptionPane.Information_Message); System.exit (0); // Salga del sistema después de que se muestra el mensaje de error cuando ocurre un error de lectura} ruptura; }}}}Ejecución de captura de pantalla:
Descargue todo el código fuente del proyecto: http://xiazai.vevb.com/201612/yuanma/javaserialmonitor(vevb.com).rar
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.