บทความนี้อธิบายฟังก์ชั่นการสื่อสารแบบอนุกรมที่ใช้โดย Java แบ่งปันสำหรับการอ้างอิงของคุณดังนี้:
ในการใช้การสื่อสารแบบอนุกรมโดยใช้ Java (ภายใต้ระบบ Windows) คุณต้องใช้แพ็คเกจพอร์ตอนุกรม JavaComm20-WIN32.ZIP จัดทำโดย Sun มีการใช้ไฟล์สามไฟล์และการกำหนดค่ามีดังนี้:
1.Comm.jar ถูกวางไว้ใน Java_home/jre/lib/ext;
2. สถานที่ win32com.dll ถึง java_home/bin;
3.Javax.Comm.properties ทั้งสองแห่งจะต้องวาง
JRE/LIB (นั่นคือ JRE ภายใต้โฟลเดอร์ Java)
java_home/jre/lib
ให้ฉันพูดถึงสภาพแวดล้อมที่ฉันใช้ เมื่อชั่งน้ำหนักระดับอิเล็กทรอนิกส์คอมพิวเตอร์จะส่งคำสั่ง "R" ไปยังจอภาพควบคุมการชั่งน้ำหนักผ่านพอร์ตอนุกรมและจอภาพควบคุมจะส่งข้อมูลน้ำหนักไปยังพอร์ตอนุกรมหนึ่งครั้งและคอมพิวเตอร์จะอ่านข้อมูลเพื่อแสดงบนหน้าเว็บ นี่เป็นระบบชั่งน้ำหนักแบบเรียลไทม์
รหัสสำหรับการอ่านและการเขียนพอร์ตอนุกรมมีดังนี้:
แพ็คเกจ com.chengzhong.tools; นำเข้า java.io.*; นำเข้า Javax.comm.CommportIdentifier; นำเข้า Javax.Comm.*;/**** ถั่วนี้ให้ฟังก์ชั่นพื้นฐานบางอย่างเพื่อใช้การแลกเปลี่ยนข้อมูลแบบเพล็กซ์ OutputStream Out; InputStream สาธารณะใน; // บันทึกผลการอ่านผลลัพธ์สตริงสแตติกสาธารณะ = ""; int คงที่ public int openSignal = 1;/**** constructor ** @param portid id ของอนุกรมที่จะใช้ 1 สำหรับ com1,*2 สำหรับ com2, ฯลฯ **/public serialBean (int portid) {portname = "com" +portid;}/**** ฟังก์ชั่นนี้เริ่มต้นพอร์ตอนุกรมสำหรับการสื่อสาร มันเริ่มต้น* เธรดซึ่งตรวจสอบพอร์ตอนุกรมอย่างสม่ำเสมอ สัญญาณใด ๆ ที่ถูกจับ*จากพอร์ตอนุกรมจะถูกเก็บไว้ในพื้นที่บัฟเฟอร์ **/int public intixize () {openSignal = 1; ลอง {portid = commportIdentifier.getPortIdentifier (ชื่อพอร์ต); ลอง {serialport = (serialport) portid.open ("serial_communication", 2000); } catch (portinuseException e) {if (! serialBean.portid.getCurrentowner (). เท่ากับ ("serial_Communication")) {openSignal = 2; // พอร์ตอนุกรมนี้ถูกครอบครองโดยโปรแกรมอื่น ๆ } อื่นถ้า (serialBean.portid.getCurrentowner (). เท่ากับ ("serial_Communication")) {openSignal = 1; return opensignal; } return opensignal; } // ใช้ inputstream ในการอ่านจากพอร์ตอนุกรมและ outputstream // out เพื่อเขียนลงในพอร์ตอนุกรม ลอง {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; // พารามิเตอร์ไม่ถูกต้องส่งคืน opensignal; }} catch (nosuchportexception e) {portid = null; OpenSignal = 5; // ไม่มีการส่งคืนพอร์ตแบบอนุกรม } // เมื่อเปิดพอร์ตอนุกรมสำเร็จให้สร้างบัฟเฟอร์อนุกรมใหม่ // จากนั้นสร้างเธรดที่ยอมรับสัญญาณขาเข้าอย่างต่อเนื่องจาก // พอร์ตอนุกรม สัญญาณที่เข้ามาจะถูกเก็บไว้ในบัฟเฟอร์อนุกรม//ส่งคืนข้อมูลที่ประสบความสำเร็จเปิดใช้งาน opensignal;}/**** ฟังก์ชั่นนี้ส่งคืนสตริงด้วยความยาวที่แน่นอนจากข้อความที่เข้ามา*@param ความยาวความยาวของสตริงที่จะส่งคืน **/การอ่านค่าคงที่ ในขณะที่ (in.available ()> 0) {c = in.read (); อักขระ d = อักขระใหม่ ((char) c); serialBean.result = serialBean.result.concat (D.ToString ()); }}} catch (ioexception e) {// toDo บล็อก catch ที่สร้างอัตโนมัติ e.printstacktrace ();}}/**** ฟังก์ชั่นนี้ส่งข้อความผ่านพอร์ตอนุกรม ** @param msg ที่จะส่งสตริง msg.length (); }} catch (ioexception e) {return;}}/**** ฟังก์ชั่นนี้ปิดพอร์ตอนุกรมที่ใช้งาน **/โมฆะสาธารณะ closeport () {serialport.close ();}} ด้วยวิธีนี้คุณสามารถรับผลการอ่านผ่าน SerialBean.result
สำหรับการวางข้อมูลบนหน้าเว็บจำเป็นต้องใช้ AJAX นี่คือเฟรมเวิร์ก AJAX DWR, DWR Class Put.java ใช้ดังนี้:
แพ็คเกจ com.chengzhong.dwr; นำเข้า java.io.ioexception; นำเข้า com.chengzhong.tools.arith; นำเข้า com.chengzhong.tools.serialbean; คลาสสาธารณะใส่ {//2011.17 การเขียนสตริงสาธารณะ () // อ่านข้อมูล serialBean.readport (); String temp = serialBean.result.trim (); // ฉันอยู่ที่นี่เพื่อเป็น wn125.000kg ของข้อมูลถ้า (! temp.equals ("") && temp.length () == 11) {return (เปลี่ยน (temp)). toString (); } else {return ""; }} // การตอบสนองเริ่มชั่งน้ำหนักสตริงสาธารณะ startweight (สตริงจำนวน) {int n = integer.parseint (num.trim ()); SerialBean SB = New SerialBean (N); sb.initialize (); ส่งคืน serialBean.opensignal+""; // ส่งคืนข้อมูลการเริ่มต้น} // การตอบสนองหยุดการชั่งน้ำหนักโมฆะสาธารณะ endweight () {ลอง {// ปิดอินพุตและส่งกระแสสัญญาณ serialBean.in.close (); serialBean.out.close (); } catch (ioexception e) {// todo บล็อก catch block ที่สร้างอัตโนมัติ e.printstacktrace (); } if (serialBean.serialport! = null) {serialBean.serialport.close (); // ปิดพอร์ตอนุกรม} serialBean.serialport = null; serialBean.portid = null; serialBean.result = ""; } / ** * แปลงน้ำหนักในรูปแบบของ WN125.000KG เป็น 125.000 (กก.) (โค้งมนสองหลักเก็บไว้หลังจากจุดทศนิยม) * / การเปลี่ยนแปลงสตริงสาธารณะ (แหล่งสตริง) {ผลลัพธ์สองเท่า = 0.0; String S1 = Source.SubString (2,9); ลอง {result = double.parsedouble (S1); ผลลัพธ์ = arith.round (ผลลัพธ์, 2); } catch (exception e) {e.printstacktrace (); กลับ ""; } return result.toString (); -หมายเหตุ: arith.java เป็นไฟล์การคำนวณที่มีความแม่นยำสูงสำหรับ Java
แพ็คเกจ com.chengzhong.tools; นำเข้า java.math.bigdecimal;/*** เนื่องจากประเภทง่าย ๆ ของ Java ไม่สามารถดำเนินการกับหมายเลขลอยได้อย่างถูกต้องคลาสเครื่องมือนี้ให้การดำเนินการลอยจุดที่ถูกต้องรวมถึงการเพิ่มการลบการคูณและการแบ่งและการปัดเศษ */คลาสสาธารณะ arith {// การทำงานเริ่มต้นความถูกต้องส่วนตัวคงที่คงที่ int final int def_div_scale = 10; // คลาสนี้ไม่สามารถสร้างอินสแตนซ์ส่วนตัว arith () {} /*** ให้การดำเนินการเพิ่มเติมที่ถูกต้อง * @param v1 เพิ่ม* @param v2 เพิ่ม* @return ผลรวมของพารามิเตอร์สองตัว*/ สาธารณะคงที่สองเท่า (คู่ V1, double v2) {bigdecimal b1 = ใหม่ bigdecimal (double.toString (v1)); bigdecimal b2 = ใหม่ bigdecimal (double.tostring (v2)); ส่งคืน b1.add (b2) .doublevalue (); } /*** ให้การดำเนินการลบที่แม่นยำ * @param v1 ถูกลบออก* @param v2 ถูกลบออก* @return ความแตกต่างระหว่างพารามิเตอร์ทั้งสอง*/ สาธารณะย่อยแบบคงที่ (คู่ V1, double v2) {bigdecimal b1 = ใหม่ bigdecimal (double.toString (v1)); bigdecimal b2 = ใหม่ bigdecimal (double.tostring (v2)); ส่งคืน b1.subtract (b2) .doublevalue (); } /*** ให้การคูณการคูณที่แม่นยำ * @param v1 ตัวทวีคูณ* @param v2 ตัวทวีคูณ* @return ผลิตภัณฑ์ของสองพารามิเตอร์*/ public คงที่ double mul (double v1, double v2) {bigdecimal b1 = ใหม่ bigdecimal (double.tostring (v1)); bigdecimal b2 = ใหม่ bigdecimal (double.tostring (v2)); ส่งคืน b1.multiply (b2) .doublevalue (); } /** * ให้ (ค่อนข้าง) การทำงานของการแบ่งที่แม่นยำเมื่อไม่มีการแบ่งจะมีความแม่นยำถึง * 10 หลักหลังจากจุดทศนิยมและตัวเลขที่ตามมาจะถูกปัดเศษ * @param v1 Divider* @param V2 Divider* @return Quotation ของพารามิเตอร์สองตัว*/ สาธารณะคงที่ double div (double v1, double v2) {return div (v1, v2, def_div_scale); } /*** ให้ (ค่อนข้าง) การทำงานของการแบ่งที่แม่นยำ เมื่อไม่มีที่สิ้นสุดในการแยกการแยกพารามิเตอร์สเกลหมายถึงความถูกต้องของ *และตัวเลขที่ตามมาจะถูกปัดเศษ * @param v1 Divider* @param v2 Divider* @param scale หมายความว่ามันจะต้องแม่นยำสำหรับตัวเลขหลายหลักหลังจากจุดทศนิยม * @return Quotient ของสองพารามิเตอร์*/ สาธารณะคงที่ double div (double v1, double v2, scale int) {ถ้า (scale <0) {โยน unlegalargumentException ใหม่ ("มาตราส่วนจะต้องเป็นจำนวนเต็มบวกหรือศูนย์"); } bigdecimal b1 = ใหม่ bigdecimal (double.toString (v1)); bigdecimal b2 = ใหม่ bigdecimal (double.tostring (v2)); ส่งคืน b1.divide (b2, สเกล, bigdecimal.round_half_up) .doublevalue (); } /*** ให้การปัดเศษทศนิยมที่แม่นยำ * @param v นับว่าต้องโค้งมน* @param ขนาดเท่าใดจะถูกเก็บไว้กี่หลักหลังจากจุดทศนิยม* @@return ผลลัพธ์หลังจากการปัดเศษ*/ รอบสองรอบสาธารณะ (คู่ V, สเกล int) {ถ้า (สเกล <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 type = 'text/javascript type = 'text/javascript'> var id; ฟังก์ชั่นเริ่มต้น () {id = window.setInterval ('get ()', 500); // โทรหา GET () โดยอัตโนมัติทุกครึ่งวินาทีรับข้อมูลน้ำหนักรวมและกรอกข้อมูลในกล่องข้อความ} ฟังก์ชั่น get () {ss.write (readit); // การเรียกวิธีการเขียนในคลาส DWR put.java} function readit (data) {ถ้า (data! = null && data! = "") {document.getElementById ("mzbf"). value = data; }} </script>ฉันจะไม่พูดถึงการใช้ DWR
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับเนื้อหาที่เกี่ยวข้องกับ Java โปรดตรวจสอบหัวข้อของเว็บไซต์นี้: "สรุปทักษะการเขียนโปรแกรม Java Socket", "บทสรุปของไฟล์ Java และทักษะการดำเนินงานไดเรกทอรี", "การสอนเกี่ยวกับโครงสร้างข้อมูล Java และอัลกอริทึม", "สรุปทักษะการดำเนินงาน Java
ฉันหวังว่าบทความนี้จะเป็นประโยชน์กับการเขียนโปรแกรม Java ของทุกคน