Este artigo descreve a função de comunicação serial implementada por Java. Compartilhe -o para sua referência, como segue:
Para implementar a comunicação serial usando Java (no sistema Windows), você precisa usar o pacote de porta serial javacomm20-win32.zip fornecido pelo Sun. Três arquivos são usados e a configuração é a seguinte:
1.Comm.Jar é colocado em java_home/jre/lib/ext;
2.place win32com.dll para java_home/bin;
3.javax.comm.properties Ambos os lugares devem ser colocados
jre/lib (isto é, jre sob a pasta java)
Java_home/jre/lib
Deixe -me falar sobre o ambiente que me apliquei. Ao pesar uma escala eletrônica, o computador envia o comando "R" para o monitor de controle de pesagem através da porta serial e o monitor de controle envia os dados de peso para a porta serial uma vez e o computador lê os dados para exibi -los na página da web. Isso forma um sistema de pesagem em tempo real.
O código para ler e escrever a porta serial é a seguinte:
pacote com.chengzhong.tools; importar java.io. OutputStream out; public estático inputStream em; // salvar o resultado da leitura public static string resultado = ""; public static int openSignal = 1;/**** construtor ** @param portid O ID da série a ser usado. 1 para COM1,*2 para COM2, etc. **/Public SerialBean (int PortID) {PortName = "com" +PortID;}/**** Esta função inicializa a porta serial para comunicação. Ele inicia um thread que monitora consistentemente a porta serial. Qualquer sinal capturado*da porta serial é armazenado em uma área de buffer. **/public int Initialize () {OpenSignal = 1; tente {PortID = CommportIdentifier.GetIdentifier (PortName); tente {serialport = (serialport) portid.open ("serial_comunication", 2000); } catch (portinUseexception e) {if (! Serialbean.portId.getCurReRowner (). Equals ("serial_communication")) {openSignal = 2; // Esta porta serial é ocupada por outros programas} else if (serialbean.portid.getCurReRowner (). Igual ("serial_communication")) {openSignal = 1; retornar openSignal; } retornar openSignal; } // Use o InputStream para ler na porta serial e outputStream // para gravar na porta serial. tente {in = serialport.getInputStream (); out = serialport.getOutputStream (); } catch (ioexception e) {openSignal = 3; // Inicialize os parâmetros de comunicação para 9600, 8, 1, nenhum. tente {serialport.setSerialportParams (9600, serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } Catch (não suportadoCommoperationException e) {OpenSignal = 4; // O parâmetro é o retorno incorreto OpenSignal; }} catch (nosuchportException e) {PortID = null; OpenSignal = 5; // Não há retorno de porta serial openSignal; } // Ao abrir com êxito a porta serial, crie um novo buffer serial, // Crie um thread que aceite consistentemente sinais recebidos em // da porta serial. Os sinais de entrada são armazenados no tampão serial.// Retorno informações de sucesso OpenSignal;}/**** Esta função retorna uma string com um certo comprimento das mensagens de entrada*** @param o comprimento da sequência a ser retornada. while (in.Available ()> 0) {c = in.read (); Caractere d = novo caractere ((char) c); Serialbean.result = serialbean.result.concat (d.toString ()); }}} catch (ioexception e) {// TODO BLOCO DE CAPAGEM AUTOGERATIDO E.PrintStackTrace ();}}/**** Esta função envia uma mensagem através da porta serial. ** @param msg a string a ser enviada. i ++) out.write (msg.charat (i)); }} catch (ioexception e) {return;}}/**** Esta função fecha a porta serial em uso. **/public void Closeport () {serialport.close ();}} Dessa forma, você pode obter o resultado da leitura através SerialBean.result .
Quanto a colocar dados em uma página da web, o AJAX precisa ser usado. Aqui está uma estrutura AJAX DWR, a classe dwr put.java é usada da seguinte maneira:
pacote com.chengzhong.dwr; importar java.io.ioexception; importar com.chengzhong.tools.arith; importar com.chengzhong.tools.serialbean; classe pública put {//2011.9.9.17 public string write () {// envia a instrução r, o instrumento de envio de dados de rede de peso. // leia dados serialbean.readport (); String temp = serialbean.result.trim (); // Estou temporário aqui para ser WN125.000kg de dados se (! Temp.equals ("") && temp.length () == 11) {return (altere (temp)). Tostring (); } else {return ""; }} // Resposta Comece a pesar public string string startweight (string num) {int n = intoger.parseint (num.trim ()); Serialbean sb = novo serialbean (n); Sb.initialize (); retornar serialbean.opensignal+""; // retorna informações de inicialização} // Resposta Pare de pesar public void endweight () {try {// Fechar os fluxos de entrada e saída serialbean.in.close (); Serialbean.out.close (); } catch (ioexception e) {// TODO GATO GENERADO AUTOMENTADO BLOCO E.PRINTSTACKTRACE (); } if (serialbean.serialport! = null) {serialbean.serialport.close (); // fechar a porta serial} serialBean.Serialport = null; SerialBean.portId = null; Serialbean.result = ""; } / ** * Converta o peso no formato de WN125.000 kg a 125.000 (kg) (arredondado, dois dígitos retidos após o ponto decimal) * / public string alteração (fonte da sequência) {resultado duplo = 0,0; String s1 = fonte.substring (2,9); tente {resultado = duplo.parsedouble (s1); resultado = arith.ound (resultado, 2); } catch (Exceção e) {e.printStackTrace (); retornar ""; } return result.toString (); }}Nota: Aith.java é um arquivo de cálculo de alta precisão para Java.
Pacote com.chengzhong.tools; importar java.math.bigdecimal;/*** Como os tipos simples de Java não podem executar com precisão operações em números de ponto flutuante, essa classe de ferramentas fornece operações precisas de ponto flutuante, incluindo adição, subtração, multiplicação e divisão e arredondamento. */classe pública arith {// Divisão padrão Operação Precuracy private static final int def_div_scale = 10; // Esta classe não pode ser instanciada private arith () {} /*** fornece operações de adição precisas. * @param v1 adicionado* @param v2 Adicione* @return A soma dos dois parâmetros*/ public static duplo add (duplo v1, duplo v2) {bigdecimal b1 = novo bigdecimal (duplo.toString (v1)); Bigdecimal b2 = novo bigdecimal (duplo.toString (v2)); return b1.add (b2) .doubleValue (); } /*** fornece operações de subtração precisas. * @param v1 é subtraído* @param v2 é subtraído* @return a diferença entre os dois parâmetros*/ public static duplo sub (V1 duplo, duplo v2) {bigdecimal b1 = novo bigdecimal (duplo.toString (v1)); Bigdecimal b2 = novo bigdecimal (duplo.toString (v2)); Retornar B1.Subtract (B2) .DoubleValue (); } /*** fornece operações de multiplicação precisas. * Multiplicador @param v1* Multiplicador @param v2* @return Produto de dois parâmetros*/ public static duplo mul (v1 duplo, duplo v2) {bigdecimal b1 = novo bigdecimal (duplo.toString (v1)); Bigdecimal b2 = novo bigdecimal (duplo.toString (v2)); return b1.multiply (b2) .doubleValue (); } /** * fornece (relativamente) operação de divisão precisa, quando não há divisão, é preciso * 10 dígitos após o ponto decimal e os números subsequentes são arredondados. * @param v1 divisor* @param v2 divisor* @return citação de dois parâmetros*/ public static duplo div (duplo v1, duplo v2) {return div (v1, v2, def_div_scale); } /*** fornece (relativamente) operação de divisão precisa. Quando não há fim para concluir a separação, o parâmetro de escala refere -se à precisão de *e os números subsequentes são arredondados. * Divisor @param v1* @param v2 divisor* @param escala significa que precisa ser preciso para vários dígitos após o ponto decimal. * @return quociente de dois parâmetros*/ public static duplo div (duplo v1, v2 duplo, int) {if (escala <0) {lança new ilegalargumentException ("a escala deve ser um número inteiro positivo ou zero"); } Bigdecimal b1 = novo bigdecimal (duplo.toString (v1)); Bigdecimal b2 = novo bigdecimal (duplo.toString (v2)); Retornar B1.Divida (B2, Scale, BigDecimal.Round_Half_Up) .DoubleValue (); } /*** fornece arredondamento decimal preciso. * @param v contagens que precisam ser arredondadas* @param escala Quantos dígitos são retidos após o ponto decimal* @return o resultado após arredondar*/ public estático duplo redondo (Double V, int Scale) {if (escala <0) {lança nova ilegalargumentException ("a escala deve ser um inteiro positivo ou zero"); } BigDecimal b = novo bigdecimal (duplo.toString (v)); BigDecimal One = novo BigDecimal ("1"); retornar b.divida (um, escala, bigdecimal.round_half_up) .doubleValue (); }}Na página da web:
<script type="text/javascript" src="/ChengZhong/dwr/engine.js"></script><script type="text/javascript" src="/ChengZhong/dwr/util.js"></script><script type='text/javascript' src='/ChengZhong/dwr/interface/ss.js' > </script> <script type = 'text/javascript'> var id; function begin () {id = window.setInterval ('get ()', 500); // Ligue automaticamente a get () a cada meio segundo, obtenha os dados de peso bruto e preencha -os na função da caixa de texto} get () {ss.write (leitura); // chamando o método de gravação na classe dwr put.java} function readit (data) {if (data! = Null && data! = "") {Document.getElementById ("mzbf"). Value = data; }} </script>Não vou falar sobre o uso de DWR
Para obter mais informações sobre o conteúdo relacionado a Java, consulte os tópicos deste site: "Resumo das habilidades de programação do soquete Java", "Resumo dos arquivos Java e habilidades de operação de diretório", "Tutorial sobre estrutura de dados Java e algoritmo", "Resumo da operação Java Dom Node Skills" e "Resumo de Java Cache Skills Skills Operation Skills"
Espero que este artigo seja útil para a programação Java de todos.