Um curso recente requer escrever uma ferramenta de comunicação serial para computadores superiores. Escrevi uma ferramenta de comunicação serial simples com uma interface gráfica baseada em Java. O processo será descrito em detalhes abaixo para sua referência^_^
um:
Primeiro de tudo, você precisa baixar um pacote de jar adicional que suporta a operação de comunicação por porta serial java. Como o Java.Comm é relativamente antigo e não suporta sistemas de 64 bits, é recomendável que o pacote RXTX JAR (suporte de 32 bits/64 bits).
Endereço oficial do download: http://fizzed.com/oss/rxtx-for-java (Nota: o FQ pode ser necessário para baixar)
Sapatos infantis que não podem ser FQ podem ser baixados aqui:
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (32 bits)
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (64 bits)
dois:
Faça o download do pacote JAR desconfiado e apresente -o no Java Build Path:
capturar
NOTA: Se um erro java.lang.unsatisfiedlinkerror for lançado durante a operação, copie os dois arquivos de rxxparallel.dll e rxxserial.dll no pacote de descompressão RXTX para o diretório C:/Windows/System32 para resolver o erro.
três:
Em relação ao uso deste pacote JAR, escrevi uma classe SerialTool.java, que fornece vários serviços simples para comunicação por porta em série. O código é o seguinte (observe que esta classe está localizada no pacote Serialport):
pacote serialport; importar java.io.ioException; importar java.io.inputStream; importar java.io.outputStream; importar java.util.arraylist; importar java.util.enumeration; importação java.util.toomanySenerSecception; importação gnU.Iport.Commio; importação; Import.tuil.toomanilistenerSecception; import gnu.io.commio; importância; importação; importação.util.toomanilistenerSecception; importação; gNU.io.nosuchportException; importar gnu.io.portinUseexception; importar gnu.io.serialport; importar gnu.io.serialportEventListener; importar gnu.io.unsupportsingCommoPerationException; Importação de seriation (** ** ** Port Serial Service Classing, prestação de serviços de abertura e, conforme o sing de porto e a porto, a base de singentConsception; modo) * @author zhong * */public class Serialtool {private static serialtool serialtool = null; estático {// inicialize um objeto serialtool quando esta classe é carregada por classeLoader se (serialtool == null) {serialtool = new serialtool (); } } //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(); } retornar serialtool; } /*** Encontre todas as portas disponíveis* @return Lista de nomes de portas disponíveis* /public Static Final ArrayList <String> findport () {// obtenha todos os portos seriais atualmente disponíveis <uumeração <mportIdentifier> portList = commportentifier.getIdentifiers (); ArrayList <String> PortNounList = new ArrayList <> (); // Adicione o nome da porta serial disponível para listar e retornar a lista enquanto (portList.hasmoreElements ()) {string portName = portList.nextElement (). GetName (); PortNounElist.add (PortName); } retornar portnamelist; } /*** Abra a porta serial* @Param PortName Nome da porta* @param baudrate baudrate* @return serialport objeto* @throws SerialPortParameterFailure Falha ao definir os parâmetros de porta serial* @THOWSOWSOWSUTHPORT Não é que o dispositivo não seja o dispositivo que não é o dispositivo por portão* @Throws Nosuhport, não é o dispositivo que não é o dispositivo para o dispositivo* @Throws Nosuhport, não é o dispositivo que não é o dispositivo para o dispositivo* @Throws Nosuhport, não é o dispositivo que não é o dispositivo, não é o dispositivo que não é o dispositivo, não é o dispositivo que não é o dispositivo, não é o dispositivo que não é o dispositivo que não é o dispositivo, não é o dispositivo que não é o dispositivo que não é o dispositivo que não é o dispositivo, não é o dispositivo que não é o dispositivo que não é o dispositivo que não é o dispositivo. Ocupado*/public static final Serialport OpenPort (String PortName, int Baudrate) lança serialportParameterFailure, Notaserialport, Nosuchport, portinuse {Try {// Identifique o porto pelo nome da porta CommportIdentifier Atentifier = CommportIdentifier.Getentifier (PortName); // Abra a porta e dê o nome da porta e um tempo limite (tempo limite da operação de abertura) Commport Commport = PortIdentifier.open (PortName, 2000); // Defende se é a porta serial if (commport instanceof serialport) {serialport serialport = (serialport) commport; tente {// Defina a taxa de transmissão e outros parâmetros da porta serial serialport.SetSerialPortParams (Baudrate, Serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } catch (não suportadoCommoperationException e) {lança novo serialportParameterFailure (); } //System.out.println("open " + portName +" com sucesso! "); retornar serialport; } else {// não porta serial lança novo notaRialport (); }} catch (nosuchportException e1) {throw new nosuchport (); } catch (portinuseexception e2) {tiro new Portinuse (); }} / *** Feche a porta serial* @param serialport O objeto da porta serial a ser fechado* / public static void Closeport (serialport serialport) {if (serialport! = Null) {serialport.close (); serialport = nulo; }} / *** Envie dados para a porta serial* @param serialport serialport objeto* @param os dados da ordem a serem enviados* @THOWS sendDatAtoserialPortFailure Falhou ao enviar dados para a porta serial* @THOWSTUTSTICTSTRATTROTROPROTPROTPROT (BETHTRATION) (BETRATION) SERIALPORTSTUTSTRATROPROTROPROT) Fechar o erro de saída do fluxo de série [Public* / PublicTatic Stort Stort. SendDatAtoserialPortFailure, serialportOutputStreamCloseFailure {outputStream out = null; tente {out = serialport.getOutputStream (); out.Write (Order); out.flush (); } catch (ioexception e) {lança novo sendDatAtoserialPortFailure (); } finalmente {tente {if (out! = null) {out.close (); out = null; }} catch (ioexception e) {lança novo serialportOutputStreamCloseFailure (); }}} / *** Leia os dados da porta serial* @param serialport O objeto serialport com uma conexão foi estabelecido* @return os dados lidos* @throws readDataFromSerialPortFailure Ocorreu um erro ao readstício do serial (saterial sTrialTratutic) readstratic) readstratic sTROTRATRATRATRATRATRATRUTRARM REATRATRATRATRATRATRATRARTY [STROTRATRATRATRATRATRATRUTRARTY [STROTRATRATRATRATRATRATRUTRARTY) REATE (STROTRATRATRATRATRATRATRUTARY by) REATEN) ReadDataFromSerialPortFailure, serialportInputStreamCloseFailure {inputStream em = null; byte [] bytes = null; tente {in = serialport.getInputStream (); int bufflenth = in.Available (); // Obtenha o comprimento dos dados no buffer while (bufflenth! = 0) {bytes = novo byte [bufflenth]; // inicialize a matriz de bytes com o comprimento dos dados no buffer in.read (bytes); bufflenth = in.Available (); }} catch (ioexception e) {tiro novo readDataFromSerialPortFailure (); } finalmente {tente {if (in! = null) {in.close (); in = null; }} catch (ioexception e) {lança nova serialorporinputStreamCloseFailure (); }} retornar bytes; } /*** Adicionar ouvinte* @param Porta por porta serial Objeto* @param ouvinte ouvinte serial ouvinte* @ThOsTows ToomanyListeners Há muitos objetos de classe de escuta* /public static void addlistener (portão serialport, add; // Defina para acordar o tópico de recebimento de escuta quando os dados chegarem à porta.NotifyOndataAvailable (true); // Defina para acordar o encadeamento de interrupção quando a comunicação é interrompida. } catch (toomanylistenerSexception e) {lança novos toomanyListeners (); }}}Nota: As exceções de arremesso neste método são todas as minhas exceções personalizadas. O motivo disso é facilitar o processamento correspondente no programa principal. Aqui está uma descrição de uma das exceções:
(Observe que todas as minhas exceções personalizadas são colocadas no pacote de Setriasception)
pacote seriellexception; classe pública serialportParameterFailure estende a exceção { / ** * * / private estático final serialversionuid = 1L; public serialportParameterFailure () {} @Override public String tostring () {return "Definir parâmetros da porta serial falhou! Abrir a operação da porta serial não está concluída!"; }}Reescrevi seu método ToString () para cada classe de exceção personalizada, para que o programa principal possa imprimir a mensagem de erro correspondente depois de capturar a exceção.
Há também uma classe no pacote de seriizexception que extrai as informações de erro no objeto de exceção recebido e a converte em uma string e o retorna. O código é o seguinte:
pacote seriellexception; importar java.io.ioException; importar java.io.printwriter; importar java.io.stringwriter;/*** responsável por extrair e converter a mensagem de erro na exceção aprovada em uma string; * @author zhong * */public classe ExceptionWriter {/** * encapsula a mensagem de erro na exceção em uma string e retorna a string * @param e contém a exceção de erro * @return Error mensagem string */public static string getErrorinfofroMexception (exceção e) {stringWriter sw = null; PrintWriter pw = null; tente {sw = new stringWriter (); pw = new PrintWriter (SW); E.PrintStackTrace (PW); retornar "/r/n" + sw.toString () + "/r/n"; } catch (Exceção e2) {return "Uma mensagem de erro não foi obtida, verifique e tente novamente!"; } finalmente {tente {if (pw! = null) {pw.close (); } if (sw! = null) {sw.close (); }} catch (ioexception e1) {e1.printStackTrace (); }}}}Quatro:
O uso da classe principal do programa, client.java contém o endereço de entrada do programa (método principal). Sua função é exibir uma interface de boas -vindas e chamar a classe DataView.java para exibição real de dados de porta serial.
O código client.java é o seguinte:
pacote serialport; importar java.awt.color; importar java.awt.flowlayout; importar java.awt.font; importar java.awt.frame; importar java.awt.graphics; importar java.awt.gridlayout; import java.awt.image; Java.awt.toolkit; importar java.awt.event.keyadapter; importar java.awt.event.keyevent; importar java.awt.event.windowAdapter; importação*** ^, a javapTer; o javonsexEnPoMEXELPELT.EVENT.EVENT.WindowEvent; import Javax.swing.JOptionPenscence; */public class Client estende o quadro {/** * */private estático final serialversionuid = 1L; / *** Largura da interface do programa*/ public static final int width = 800; / *** Altura da interface do programa*/ public static final int altura = 620; / ** * A localização da interface do programa (coordenadas horizontais) */ public static final int loc_x = 200; / ** * A localização da interface do programa (coordenadas horizontais) */ public static final int loc_y = 70; Cor cor = cor.white; Imagem fora da tela = nulo; // usado para buffer duplo // Defina o ícone da janela (aqui eu personalizei o ícone do ícone da janela do Windows, porque eu realmente acho que qual ícone de café pequeno não é bonito = =) Toolkit Toolkit = getToolkit (); Image ICON = Toolkit.getImage (client.class.getResource ("computador.png")); // segure outras classes DataView dataView = new DataView (this); // classe de interface principal (exibindo o painel principal dos dados de monitoramento)/*** Método principal* @param args //*/public static void main (string [] args) {new client (). LaunchFrame (); } / *** Mostrar interface principal* / public void LaunchFrame () {this.setBounds (loc_x, loc_y, largura, altura); // Defina o local em que o programa aparece na área de trabalho this.setTitle ("CDIO Project"); // Defina o título do programa this.seticonImage (ícone); this.setBackground (color.white); // Defina a cor do plano de fundo this.addwindowlistener (new windowAdapter () {// Adicione a audição ao status da janela public void WindowClosing (WindowEvent arg0) {//system.exit(0); // saia do programa}}); this.addkeyListener (new Keymonitor ()); // Adicione o ouvinte do teclado this.setResizable (false); // O tamanho da janela não pode ser alterado isso.setVisible (true); // a janela de exibição New Thread (new RepintThread ()). Start (); // O Thread de repintura}/*** Desenhe vários elementos componentes da interface do programa*/public void Paint (gráficos g) {color c = g.getColor (); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 40)); g.setColor (color.black); G.DrawString ("Bem-vindo a usar o sistema de monitoramento em tempo real do computador superior", 45, 190); G.SetFont (New Font ("Microsoft Yahei", Font.italic, 26)); g.setColor (color.black); G.DrawString ("Versão: 1.0 Powered by: Zhonglei", 280, 260); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 30)); g.setColor (cor); g.drawString("―--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- = Color.white; GoffScreen.fillerect (0, 0, largura, altura); Eventos*/ classe privada Keymonitor estende KeyAdapter {public void keyreleased (KeyEvent e) {int keyCode = E.getKeyCode (); if (keycode == keyEvent.vk_enter) {// Quando o monitor ouve que o usuário atinge o teclado Enter a tecla, execute a seguinte operação setVisible (false); // Ocultar a interface bem -vindo DataView.SetVisible (true); // Mostra a interface de monitoramento DataView.dataframe (); // Inicialize a interface de monitoramento}}}/ * * Repintar o thread (repintar a cada 250 milissegundos) */classe privada RepintThread implementa Runnable {public void run () {while (true) {Repint (); tente {thread.sleep (250); } catch (interruptedException e) {// Crie uma caixa de diálogo quando um thread de repetição lança uma exceção e exibe a exceção Detalhes String Err = ExceptionWriter.GetRorRorinfofRomexception (e); JoptionPane.showMessagedialog (NULL, ERR, "Erro", JoptionPane.information_message); System.Exit (0); }}}}}Running Screenshot:
NOTA: A tecla "Clique em ENTER para inserir a interface principal" no processo de operação real tem um efeito de flash (é alcançada re-desenhando a interface de vez em quando, permitindo que essa frase apareça repetidamente em cores brancas e pretas). O método de buffer duplo é propício a resolver o problema de agilizar a interface ao re-desenhar (se você não usar o método de buffer duplo, é equivalente a desenhar coisas novas na interface antiga pouco a pouco a cada vez que você re-Draw, e o buffer duplo é essencialmente, primeiro desenhando uma nova interface na memória e, em seguida, cobrindo diretamente a interface antiga na interface na nova interface.
O código DataView.java é o seguinte: (Esta classe é usada para exibir dados de porta serial em tempo real)
Explicação simples:
O dispositivo de hardware envia dados para o computador através da porta serial de vez em quando. Depois que a ferramenta de porta serial é conectada com sucesso ao dispositivo de hardware e adiciona um monitoramento, ela analisará os dados e atualizará a interface sempre que os dados forem recebidos;
É provável que seus requisitos sejam diferentes do meu ao usá -lo. Esta classe é apenas para referência. No uso real, pode ser necessário recriar o método de interface de exibição de dados e análise de dados.
pacote serialport; importar java.awt.button; importar java.awt.choice; importar java.awt.color; importar java.awt.font; importar java.awt.frame; importar java.awt.graphics; import java.awt.image; importação; java.awt.event.actionEvent; importar java.awt.event.actionListener; importar java.awt.event.windowadapter; importar java.awt.event.windowevent; import java.util.list; java.util.aneAnynyStionSexceptionCenscensception; gnu.io.SerialPort; importar gnu.io.SerialPortEvent; importar gnu.io.SerialportEventListener; importar seriizexception. Cliente cliente = nulo; Lista privada <String> CommList = null; // salvar números de porta disponíveis Serialport private Serialport = null; // Salvar objeto de porta serial Fonte Private Font = New Font ("Microsoft Yahei", Font.Bold, 25); Rótulo Private TEM = novo Label ("Sem dados ainda", Label.Center); // temperatura de rótulo privado Hum = novo rótulo ("sem dados ainda", label.center); // Hordagem Private Label PA = New Label ("Sem dados ainda", Label.Center); // Pressão Rain Private Label = New Label ("Sem dados ainda", Label.Center); // Rainfall Private Rótulo win_sp = new Label ("Sem dados ainda", Label.Center); // Velocidade do vento Private Rótulo win_dir = new Label ("Sem dados ainda", Label.Center); // Direção do vento Choice Private CommChoice = new Choice (); // Seleção de porta serial (caixa suspensa) Private Choice BpsChoice = new Choice (); // botão privado de seleção de tarifas de mau Imagem fora da tela = nulo; // tela ao repintar // Defina o ícone do Window Toolkit Toolkit = getToolkit (); ICON da imagem = Toolkit.getImage (DataView.class.getResource ("Computer.png")); / *** Classe Construtor* @param client*/ public dataView (cliente cliente) {this.client = client; CommList = serialtool.findport (); // Digitalize a porta serial válida uma vez quando o programa é inicializado} /*** A janela do menu principal é exibida; * Adicionar rótulo, botão, barra suspensa e escuta de eventos relacionados; */ public void dataframe () {this.setBounds (client.loc_x, client.loc_y, client.width, client.Height); this.setTitle ("CDIO Project"); this.SeticonImage (ícone); this.setBackground (color.white); this.setLayout (nulo); this.addwindowlistener (new windowAdapter () {public void windowclosing (WindowEvent arg0) {if (serialport! = null) {// feche a porta serial quando o programa sair e libera o recurso serialtool.closeport (serialport);} System.exit (0);}}); TEM.setbounds (140, 103, 225, 50); tem.setbackground (color.black); tem.setFont (fonte); tem.setforeground (cor.white); add (tem); Hum.setbounds (520, 103, 225, 50); hum.setbackground (color.black); hum.setFont (Fonte); hum.setforeground (cor.white); adicione (hum); PA.setbounds (140, 193, 225, 50); pa.setbackground (color.black); pa.setFont (fonte); pa.setforeground (cor.white); add (pa); Rain.setbounds (520, 193, 225, 50); chuva.setbackground (color.black); chuva.setFont (fonte); chuva.setforeground (cor.white); adicione (chuva); win_sp.setbounds (140, 283, 225, 50); win_sp.setbackground (color.black); win_sp.setFont (fonte); win_sp.setforeground (color.white); add (win_sp); win_dir.setbounds (520, 283, 225, 50); win_dir.setbackground (color.black); win_dir.setFont (fonte); win_dir.setforeground (color.white); add (win_dir); // Adicionar opção de seleção de porta serial CommChoice.setBounds (160, 397, 200, 200); // Verifique se existe uma porta serial disponível. If (Commlist == null || commList.size () <1) {joptionpane.showMessagedialog (null, "nenhuma porta serial válida foi encontrada!", "Erro", joptionpane.information_message); } else {for (string s: Commlist) {CommChoice.add (s); }} Add (CommChoice); // Adicione a opção de taxa de transmissão 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"); add (bpschoice); // Adicione o botão aberto da porta serial openSerialButton.setBounds (250, 490, 300, 50); OpenSerialButton.SetBackground (color.lightGray); OpenSerialButton.SetFont (New Font ("Microsoft Yahei", Font.Bold, 20)); OpenSerialButton.SetForeRound (color.Darkgray); add (OpenSerialButton); // Adicione a escuta de eventos para o botão de porta serial aberta openSerialButton.addactionListener (new ActionListener () {public void actionPerformed (ActionEvent e) {// Obtenha o nome da porta serial string/sename = COMMCHOICE.GETSELECETEDITEM (); // obtém o Baud Taves strings = BpsCoice.Sel.Sel.SelectItem (); (CommName == null || commName.equals ("" ")) {JoptionPane.showMessagedialog (nulo," nenhuma porta serial válida foi encontrada! "," Erro ", JoptionPane.information_message); JoptionPane.ShowsAgedialog (NULL, "Taxa Bad é obtida Erro!", "Erro", JoptionPane.information_message); Serialtool.openport (commName, bps); // O monitor é solicitado para o monitoramento bem -sucedido JoptionPane.showMessagedialog (null, "O monitor é bem -sucedido, os dados de monitoramento serão exibidos mais tarde!", "Prompt", joptionpane.information_message); } Catch (serialportParameterFailure | NotaserialPort | Nosuchport | Portinuse | ToomanyListeners E1) {// Quando ocorrer um erro, use uma caixa de diálogo para solicitar a mensagem de erro específica joptionpane.Imessation); }}}}}}); this.setResizable (false); novo thread (novo repaintthread ()). start (); // Inicie o thread de repetição}/*** Desenhe o elemento do componente principal da interface*/public void Paint (gráficos g) {color c = g.getColor (); g.setColor (color.black); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Temperatura:", 45, 130); g.setColor (color.black); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Horcar:", 425, 130); g.setColor (color.black); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Pressão:", 45, 220); g.setColor (color.black); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Rain:", 425, 220); g.setColor (color.black); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Velocidade do vento:", 45, 310); g.setColor (color.black); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 25)); G.DrawString ("Direção do vento:", 425, 310); g.setColor (color.gray); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 20)); G.DrawString ("Seleção de porta serial:", 45, 410); g.setColor (color.gray); G.SetFont (New Font ("Microsoft Yahei", Font.Bold, 20)); G.DrawString ("Taxa ruim:", 425, 410); } / *** Método de buffer duplo repiou cada componente de elemento da interface* / public void update (gráficos g) {if (offsecreen == null) Gráficos goffscreen = offscreen.getgraphics (); Cor c = Goffscreen.getColor (); goffscreen.setColor (color.white); goffscreen.fillrect (0, 0, client.width, client.Height); // repintar a tela de fundo this.paint (Goffscreen); // repintar o elemento da interface goffscreen.setColor (c); G.Drawimage (fora da tela, 0, 0, NULL); // "pulverizar" a tela recém -desenhada na tela original}/ * * Repintar thread (repintar a cada 30 milissegundos) */classe privada RepintThread implementa runnable {public void run () {while) {// chama o método de repintura repenção (); // Digitalizar o CommList de porta serial disponível = serialtool.findport (); if (CommList! = null && CommList.size ()> 0) {// Adicione a porta serial disponível recém -digitalizada para (String S: Commlist) {// O nome da porta serial já existe? O padrão inicial não existe (se existir no Commlist, mas não existe no CommChoice, será adicionado recentemente) CommExist booleano = false; para (int i = 0; i <commChoice.getItemCount (); i ++) {if (s.equals (CommChoice.getItem (i))) {// O nome da porta serial atualmente digitalizado já existe no compexista inicial de varredura = true; quebrar; }} if (CommExist) {// O nome da porta serial atualmente digitalizado já existe na varredura inicial e entra diretamente no próximo loop continuar; } else {// Se não existir, adicione o novo nome da porta serial à lista suspensa da porta serial disponível CommChoice.Add (S); }} // Remova a porta serial já indisponível para (int i = 0; i <comitchoice.getItemCount (); i ++) {// Se a porta serial expirou, o inadimplência inicial é inválido (existe no CommChoice, mas não existe no Commlist, foi expirado) o CommNotexist = True; para (String S: Commlist) {if (s.equals (CommChoice.getItem (i))) {Commnotexist = false; quebrar; }} if (commnotexist) {//system.out.println("Remove " + CommChoice.getItem (i)); CommChoice.Remove (i); } else {continue; }}} else {// Se o Commlist digitalizado estiver vazio, remova todas as portas seriais existentes CommChoice.RemoveAll (); } tente {thread.sleep (30); } catch (interruptedException e) {string err = excepcionwriter.getErrorinfofromexception (e); JoptionPane.showMessagedialog (NULL, ERR, "Erro", JoptionPane.information_message); System.Exit (0); } } } } } /** * Create a serial listening class in the form of an internal class* @author zhong * */ private class SerialListener implements SerialPortEventListener { /** * Handle monitored serial port events*/ public void serialEvent(SerialPortEvent serialPortEvent) { switch (serialPortEvent.getEventType()) { case SerialportEvent.bi: // 10 Comunicação interrompa JoptionPane.showMessagedialog (null, "Comunicação interrompa com dispositivo serial", "erro", joptionpane.information_message); quebrar; Caso serialorporevent.oe: // 7 Overflow (Overflow) Caso de erro serialportEvent.fe: // 9 Erro de quadro Caso serialportEvent.pe: // 8 Erro de paridade Caso serialportEvent.cd: // 6 Caso de portadora serialportEvent.cts: // 3 Dados a serem enviados enviados Serial SerialSr. O toque indica caso serialportEvent.output_buffer_empty: // 2 O buffer de saída foi limpo; Case serialportEvent.data_available: // Os dados disponíveis existem na porta serial // System.out.println ("Dados encontrados"); byte [] dados = nulo; tente {if (serialport == null) {joptionpane.showmessagedialog (null, "o objeto da porta serial está vazio! O monitoramento falhou!", "Erro", joptionpane.information_message); } else {data = serialtool.readfromport (serialport); // Leia os dados e armazenam -os em Byte Array // System.out.println (new String (Data)); // Personalize o processo de análise, você pode analisar os dados após receber os dados de acordo com suas próprias necessidades durante o processo de uso real se (dados == null || data.length <1) {// Verifique se os dados são lidos corretamente JoptionPane.ShowMaDialog (NULL, "Não foram obtidos erros válidos durante a leitura dos dados! System.Exit (0); } else {string dataoriginal = new string (dados); // Converter dados de matriz de bytes em uma string que salva a string de dados original DataValid = ""; // dados válidos (usados para salvar a sequência de dados originais e remover a string após o número inicial *) string [] elementos = null; // usado para salvar a matriz de string obtida após dividir a string original por espaços // analisar os dados se (dataoriginal.charat (0) == ' *') {// Quando o primeiro caractere dos dados é o número *, significa que a recepção de dados é concluída e o parsing datavalid = dataoriginal.sbstring (1); Elements = DataValid.split (""); if (elementos == null || elementos.Length <1) {// Verifique se os dados são analisados corretamente JoptionPane.showMessagedialog (nulo ", o processo de análise de dados tem um erro, verifique o dispositivo ou programa!", "Erro", JoptionPane.information_message); System.Exit (0); } else {try {// Atualize o valor do rótulo da interface/*para (int i = 0; i <elements.Length; i ++) {System.out.println (elementos [i]); }*///System.out.println("win_dir: " + elementos [5]); tem.settext (elementos [0] + "℃"); hum.settext (elementos [1] + " %"); pa.settext (elementos [2] + "hpa"); chuva.settext (elementos [3] + "mm"); win_sp.settext (elementos [4] + "m/s"); win_dir.settext (elementos [5] + "°"); } Catch (ArrayIndexoutOfBoundSexception e) {JoptionPane.showMessagedialog (null, "O processo de análise de dados tem um erro, e os dados da interface de atualização falharam! Verifique o dispositivo ou o programa!", "Erro", JoptionPane.information_Message); System.Exit (0); }}}}}}} Catch (readDataFromSerialPortFailure | SerialportInputStreamCloseFailure e) {JoptionPane.showMessagedialog (null, e, "Error", JoptionPane.information_Message); System.Exit (0); // Saia do sistema após a mensagem de erro ser exibida quando ocorre um erro de leitura} quebra; }}}}Running Screenshot:
Faça o download de todo o código fonte do projeto: http://xiazai.vevb.com/201612/yuanma/javaserialmonitor(vevb.com).rar
O exposto acima é todo o conteúdo deste artigo. Espero que seja útil para o aprendizado de todos e espero que todos apoiem mais o wulin.com.