이 기사에서는 Java가 구현 한 직렬 통신 기능에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
Java (Windows 시스템에서)를 사용하여 직렬 통신을 구현하려면 SUN에서 제공 한 직렬 포트 패키지 Javacomm20-Win32.zip을 사용해야합니다. 세 가지 파일이 사용되며 구성은 다음과 같습니다.
1.comm.jar는 Java_home/Jre/lib/ext에 배치됩니다.
2. win32com.dll to java_home/bin;
3.javax.comm.properties 두 곳 모두 배치해야합니다
JRE/LIB (즉, JRE Java 폴더의 JRE)
java_home/jre/lib
내가 적용한 환경에 대해 이야기하겠습니다. 전자 스케일의 무게를 측정 할 때 컴퓨터는 직렬 포트를 통해 "R"명령을 계량 제어 모니터로 보내고 제어 모니터는 중량 데이터를 직렬 포트로 한 번 보내고 컴퓨터는 데이터를 읽어 웹 페이지에 표시합니다. 이것은 실시간 계량 시스템을 형성합니다.
직렬 포트를 읽고 쓰는 코드는 다음과 같습니다.
패키지 com.chengzhong.tools; import java.io.*; import javax.comm.commportidentifier; import javax.comm.*;/****이 bean은 일련의 포트를 통해 전체 duplex*정보 교환을 구현하기위한 몇 가지 기본 기능을 제공합니다. outputStream out; public static inputStream in; // 결과 저장 결과 공개 정적 문자열 result = ""; public static int opensignal = 1;/**** 생성자 ** @param portid 사용 할 일련의 ID. com1의 경우 1, com2의 경우*2 등 **/public serialbean (int portid) {portname = "com" +portid;}/****이 함수는 통신을 위해 직렬 포트를 초기화합니다. 직렬 포트를 지속적으로 모니터링하는* 스레드를 시작합니다. 직렬 포트에서 캡처 된 모든 신호*는 버퍼 영역에 저장됩니다. **/public int initialize () {openSignal = 1; try {portid = commportidentifier.getPortidentifier (portname); try {serialport = (serialport) portid.open ( "serial_communication", 2000); } catch (portinuseexception e) {if (! serialbean.portid.getCurrentowner (). Equals ( "serial_communication")) {openSignal = 2; //이 직렬 포트는 다른 프로그램에 의해 점유됩니다.} else if (serialBean.portId.getCurrentowner (). 리턴 OpenSignal; } return openSignal; } // 직렬 포트에서 읽기 위해 InputStream을 사용하고 직렬 포트에 쓰기 위해 outputStream // OUT을 사용하십시오. try {in = serialport.getInputStream (); out = serialport.getOutputStream (); } catch (ioException e) {OpenSignal = 3; // 통신 매개 변수를 9600, 8, 1, 없음으로 초기화합니다. {serialport.setserialportparams (9600, serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } catch (UnsupportedCommoperationException e) {OpenSignal = 4; // 매개 변수가 잘못되었습니다. return openSignal; }} catch (nosuchportException e) {portid = null; OpenSignal = 5; // 직렬 포트 return openSignal이 없습니다. } // 직렬 포트를 성공적으로 열면 새 직렬 버퍼를 작성한 다음 // 직렬 포트에서 들어오는 신호를 일관되게 수락하는 스레드를 만듭니다. 들어오는 신호는 직렬 버퍼에 저장됩니다 .// 반환 성공 정보 소송이 opensignal;}/****이 함수는 들어오는*메시지에서 특정 길이의 문자열을 반환합니다. ** @param 길이는 반환 할 문자열의 길이를 반환합니다. **/public static void readport () {serialbean.result = " while (in.aveailable ()> 0) {c = in.read (); 문자 d = 새로운 문자 ((char) c); serialbean.result = serialbean.result.concat (d.toString ()); }}} catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace ();}}/****이 함수는 직렬 포트를 통해 메시지를 보냅니다. ** @param msg 문자열을 보내야합니다. i ++) out.write (msg.charat (i)); }} catch (ioexception e) {return;}}/****이 함수는 사용중인 직렬 포트를 닫습니다. **/public void closePort () {serialport.close ();}} 이런 식으로 SerialBean.result 를 통해 읽기 결과를 얻을 수 있습니다.
웹 페이지에 데이터를 넣는 것은 Ajax를 사용해야합니다. 다음은 Ajax 프레임 워크 DWR입니다. DWR Class Put.java는 다음과 같이 사용됩니다.
package com.chengzhong.dwr; import java.io.ioexception; import com.chengzhong.tools.arith; import com.chengzhong.tools.serialbean; public class put {//2011.9.17 public string write () {// 송수지 Serialbean.writeport ( "r"); // 데이터 읽기 serialBean.readport (); 문자열 temp = serialbean.result.trim (); // 나는 여기에 wn125.000kg의 데이터가 있다면 (! temp.equals ( "") && temp.length () == 11) {return (change (temp)). toString (); } else {return ""; }} // 응답 시작 public String startweight (string num) {int n = integer.parseint (num.trim ()); SerialBean SB = New SerialBean (N); sb.initialize (); SerialBean을 반환합니다. OpenSignal+""; // 초기화 정보 반환} // 응답 정지 공개 무효 계량 정지 () {try {// 입력을 닫고 출력 스트림 serialBean.in.close (); serialbean.out.close (); } catch (ioexception e) {// todo 자동 생성 캐치 블록 e.printstacktrace (); } if (serialBean.serialport! = null) {serialBean.Serialport.close (); // 직렬 포트를 닫습니다} serialBean.serialport = null; serialbean.portid = null; SerialBean.result = ""; } / ** * 무게를 WN125.000kg 형식으로 변환하여 125.000 (kg) (소수점 이후에 유지되는 2 자리) * / public String Change (문자열 소스) {double result = 0.0; 문자열 s1 = source.substring (2,9); try {result = double.parsedouble (s1); 결과 = arith.round (result, 2); } catch (예외 e) {e.printstacktrace (); 반품 ""; } return result.toString (); }}참고 : Arith.java는 Java의 고정밀 계산 파일입니다.
패키지 com.chengzhong.tools; import java.math.bigdecimal;/*** Java의 간단한 유형은 부동 소수점 번호에 대한 작업을 정확하게 수행 할 수 없으므로이 도구 클래스는 첨가, 뺄셈, 곱셈 및 디비전 및 반올림을 포함한 정확한 부동 소수점 작업을 제공합니다. */public class arith {// 기본 부서 작업 정확도 비공개 정적 최종 최종 int def_div_scale = 10; //이 클래스는 개인 Arith () {} /*** 인스턴스화 할 수 없습니다. 정확한 추가 작업을 제공합니다. * @param v1 adds* @param v2 add* @@return 두 매개 변수의 합*/ public static double add (double v1, double v2) {bigdecimal b1 = new bigdecimal (double.tostring (v1)); bigdecimal b2 = 새로운 bigdecimal (double.tostring (v2)); return b1.add (b2) .doublevalue (); } /*** 정확한 빼기 작업을 제공합니다. * @param v1은 빼면* @param v2는 빼면* @@Return 두 매개 변수의 차이*/ public static double sub (double v1, double v2) {bigdecimal b1 = new bigdecimal (double.tostring (v1)); bigdecimal b2 = 새로운 bigdecimal (double.tostring (v2)); return b1.subtract (b2) .doublevalue (); } /*** 정확한 곱셈 작업을 제공합니다. * @param v1 multiplier* @param v2 multiplier* @ @@return 곱하면*/ public static double mul (double v1, double v2) {bigdecimal b1 = new bigdecimal (double.tostring (v1)); bigdecimal b2 = 새로운 bigdecimal (double.tostring (v2)); B1.Multiply (b2) .doublevalue (); } /** * (상대적으로) 정확한 분할 작업을 제공합니다. 분할이 없으면 소수점 이후 * 10 자리에 정확하며 후속 숫자가 반올림됩니다. * @param v1 divider* @param v2 divider* @@return 두 매개 변수*/ public static double div (double v1, double v2) {return div (v1, v2, def_div_scale); } /*** (비교적) 정확한 분할 작업을 제공합니다. 분리를 완료 할 종료가 없으면 스케일 매개 변수는 *의 정확도를 나타 내고 후속 숫자는 반올림됩니다. * @param v1 divider* @param v2 divider* @param scale은 소수점 이후 몇 자리에 정확해야 함을 의미합니다. * 두 매개 변수의 @return 지수*/ public static double div (double v1, double v2, int scale) {if (scale <0) {throw new new OrgalArgumentException ( "스케일은 양의 정수 또는 0이어야 함"); } bigdecimal b1 = 새로운 bigdecimal (double.tostring (v1)); bigdecimal b2 = 새로운 bigdecimal (double.tostring (v2)); return b1.divide (b2, scale, bigdecimal.round_half_up) .doublevalue (); } /*** 정확한 소수점 반올림을 제공합니다. * @param v round를 반올림 해야하는 카운트* @param scale 소수점 이후 몇 자리 숫자가 유지되는지*/ 공개 정적 이중 라운드 (double v, int scale) {if (scale <0) {new new IllegalArgumentException ( "스케일은 양의 정수 또는 0이어야 함"); } bigdecimal b = 새로운 bigdecimal (double.tostring (v)); bigdecimal one = new bigdecimal ( "1"); return b.divide (하나, scale, bigdecimal.round_half_up) .doublevalue (); }}웹 페이지에서 :
<script type = "text/javaScript"src = "/chengzhong/dwr/engine.js"> </script> <script type = "text/javaScript"src = "/chengzhong/dwr/util.js"> </script> <script> <script> <text/javaScript/javaScript/Srffe/ss. </script> <script type = 'text/javaScript'> var id; 함수 시작 () {id = window.setInterval ( 'get ()', 500); // 0.5 초마다 get () 자동으로 호출하고, 총 중량 데이터를 가져 와서 텍스트 상자에 채 웁니다} 함수 get () {ss.write (readit); // dwr 클래스 put.java}에서 쓰기 메소드를 호출합니다} function readit (data) {if (data! = null && data! = "") {document.getElementById ( "mzbf"). value = data; }} </script>DWR의 사용에 대해서는 이야기하지 않을 것입니다
Java 관련 컨텐츠에 대한 자세한 내용은이 사이트의 주제를 확인하십시오 : "Java 소켓 프로그래밍 기술 요약", "Java 파일 및 디렉토리 운영 기술 요약", "Java 데이터 구조 및 알고리즘에 대한 자습서", "Java 운영 Dom Node Skills의 요약"및 "Java Cache 운영 기술의 요약".
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.