تصف هذه المقالة وظيفة الاتصال التسلسلية التي تنفذها Java. شاركه للرجوع إليه ، على النحو التالي:
لتنفيذ الاتصالات التسلسلية باستخدام Java (ضمن نظام Windows) ، تحتاج إلى استخدام حزمة المنفذ التسلسلي JavaComm20-Win32.zip المقدمة من Sun. يتم استخدام ثلاثة ملفات ، والتكوين كما يلي:
1.comm.jar يتم وضعه في java_home/jre/lib/ext ؛
2. place win32com.dll إلى java_home/bin ؛
3.javax.comm.properties يجب وضع كلا المكانين
JRE/LIB (أي ، JRE تحت مجلد Java)
java_home/jre/lib
اسمحوا لي أن أتحدث عن البيئة التي طبقتها. عند وزن مقياس إلكتروني ، يرسل الكمبيوتر الأمر "R" إلى شاشة التحكم في الوزن من خلال المنفذ التسلسلي ، ويرسل جهاز التحكم التحكم في بيانات الوزن إلى المنفذ التسلسلي مرة واحدة ، ثم يقرأ الكمبيوتر البيانات لعرضه على صفحة الويب. هذا يشكل نظام وزن في الوقت الحقيقي.
رمز قراءة وكتابة المنفذ التسلسلي كما يلي:
package com.chengzhong.tools ؛ import java.io.*؛ import javax.comm.commportidentifier ؛ import javax.com. OutputStream Out ؛ inputstream الثابت العام في ؛ // حفظ نتيجة القراءة الناتجة عن السلسلة الثابتة العامة = "" ؛ int static public OpenSignal = 1 ؛/**** Constructor ** param portid معرف المسلسل المراد استخدامه. 1 لـ COM1 ،*2 لـ COM2 ، إلخ. **/Public SerialBean (int portid) {portName = "com" +portid ؛}/**** تهيئة هذه الوظيفة المنفذ التسلسلي للاتصال. يبدأ مؤشر ترابط* الذي يراقب باستمرار المنفذ التسلسلي. يتم تخزين أي إشارة تم التقاطها*من المنفذ التسلسلي في منطقة مخزن مؤقت. حاول {portid = commportidentifier.getPortIdentifier (portName) ؛ حاول {serialport = (serialport) portid.open ("serial_communication" ، 2000) ؛ } catch (portInUseException e) {if (! serialbean.portid.getCurrentOwner (). equals ("serial_communication")) {openSignal = 2 ؛ // يشغل هذا المنفذ التسلسلي من قبل برامج أخرى} if (serialbean.portid.getCurrentOwner (). متساو ("serial_communication")) {openSignal = 1 ؛ العودة opensignal. } الإرجاع 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 ؛ } // عند فتح المنفذ التسلسلي بنجاح ، قم بإنشاء مخزن مؤقت تسلسلي جديد ، // ثم قم بإنشاء مؤشر ترابط يقبل باستمرار الإشارات الواردة من // المنفذ التسلسلي. يتم تخزين الإشارات الواردة في المخزن المؤقت التسلسلي. بينما (in.available ()> 0) {c = in.read () ؛ الحرف d = حرف جديد ((char) c) ؛ serialbean.result = serialbean.result.concat (d.toString ()) ؛ }}} catch (ioException e) {// todo block catch e.printstacktrace () ؛}}/**** ترسل هذه الوظيفة رسالة عبر المنفذ التسلسلي. i ++) out.write (msg.charat (i)) ؛ }} catch (ioException e) {return ؛}}/**** هذه الوظيفة تغلق المنفذ التسلسلي قيد الاستخدام. **/public void closeport () {serialport.close () ؛}} وبهذه الطريقة ، يمكنك الحصول على نتيجة القراءة من خلال SerialBean.result .
أما بالنسبة لوضع البيانات على صفحة ويب ، فيجب استخدام Ajax. فيما يلي إطار AJAX DWR ، يتم استخدام فئة DWR. Java على النحو التالي:
package com.chengzhong.dwr ؛ استيراد java.io.ioException ؛ استيراد com.chengzhong.tools.arith ؛ استيراد com.chengzhong.tools.serialbean ؛ فئة عامة وضعت {//2011.9.17 سلسلة عامة الكتابة () // قراءة البيانات serialbean.readport () ؛ سلسلة temp = serialbean.result.trim () ؛ // أنا مؤقت هنا أن أكون wn125.000kg من البيانات إذا (! temp.equals ("") && temp.length () == 11) {return (change (temp)). toString () ؛ } آخر {return "" ؛ }} // استجابة بدء وزن السلسلة العامة startweight (سلسلة num) {int n = integer.parseint (num.trim ()) ؛ Serialbean SB = New Serialbean (N) ؛ sb.initialize () ؛ إرجاع serialbean.opensignal+"" ؛ // إرجاع معلومات التهيئة} // استجابة توقف وزن الفراغ العام endweight () {try {// إغلاق تدفقات الإدخال والإخراج serialbean.in.close () ؛ serialbean.out.close () ؛ } catch (ioException e) {// todo acto 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 ؛ السلسلة S1 = source.substring (2،9) ؛ حاول {result = double.parsedouble (s1) ؛ النتيجة = arith.round (النتيجة ، 2) ؛ } catch (استثناء e) {E.PrintStackTrace () ؛ يعود ""؛ } return result.toString () ؛ }}ملاحظة: arith.java هو ملف حساب عالي الدقة لـ Java.
package com.chengzhong.tools ؛ import java.math.bigdecimal ؛/*** لأن أنواع Java البسيطة لا يمكنها إجراء عمليات بدقة على أرقام النقطة العائمة ، توفر فئة الأدوات هذه عمليات تعويلية دقيقة ، بما في ذلك الإضافة ، والاستقلال ، والضرب والتقسيم. */فئة عامة arith {// Default Division Operation Accuracy private static int def_div_scale = 10 ؛ // لا يمكن إنشاء هذه الفئة arith () {} /*** توفر عمليات إضافة دقيقة. * param v1 أضيفت* param v2 إضافة* return مجموع المعلمتين*/ add static add double (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 يتم طرحه* regurn الفرق بين المعلمتين*/ public static 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)) ؛ return b1.multiply (b2) .doublevalue () ؛ } /** * يوفر (نسبيًا) عملية تقسيم دقيقة ، عندما لا يكون هناك تقسيم ، يكون دقيقًا إلى * 10 أرقام بعد النقطة العشرية ، ويتم تقريب الأرقام اللاحقة. * param v1 divider* param v2 divider* @return اقتباس من معلمتين*/ public static div (double v1 ، double v2) {return div (v1 ، v2 ، def_div_scale) ؛ } /*** يوفر (نسبيًا) عملية تقسيم دقيقة. عندما لا يكون هناك نهاية لإكمال الفصل ، تشير معلمة المقياس إلى دقة *، ويتم تقريب الأرقام اللاحقة. * Param V1 Divider* Param V2 Divider* param مقياس يعني أنه يجب أن يكون دقيقًا لعدة أرقام بعد النقطة العشرية. * @Regurn quitient of اثنين من المعلمتين*/ public static div (Double V1 ، Double V2 ، int Scale) {if (Scale <0) {throw new alficalargumentexception ("يجب أن يكون المقياس عددًا صحيحًا إيجابيًا أو صفر") ؛ } BigDecimal B1 = new BigDecimal (double.toString (v1)) ؛ BigDecimal B2 = جديد BigDecimal (double.toString (v2)) ؛ return b1.divide (b2 ، scale ، bigdecimal.round_half_up) .doublevalue () ؛ } /*** يوفر تقريب عشري دقيق. * param v التهمات التي يجب تقريبها* مقياس param عدد الأرقام التي يتم الاحتفاظ بها بعد النقطة العشرية* return النتيجة بعد التقريب*/ الجولة المزدوجة الثابتة العامة (double v ، int scale) {if (scale <0) {throw new inchlotalargumentexception ("يجب أن يكون المقياس حديدًا إيجابيًا أو Zero") ؛ } bigdecimal b = new BigDecimal (double.toString (v)) ؛ BigDecimal One = New BigDecimal ("1") ؛ إرجاع B.Divide (واحد ، مقياس ، 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'> var id ؛ وظيفة begin () {id = window.setInterval ('get ()' ، 500) ؛ . // استدعاء طريقة الكتابة في فئة dwr put.java} وظيفة readit (data) {if (data! = null && data! = "") {document.getElementById ("mzbf"). value = data ؛ }} </script>لن أتحدث عن استخدام DWR
لمزيد من المعلومات حول المحتوى المتعلق بـ Java ، يرجى مراجعة موضوعات هذا الموقع: "ملخص لمهارات برمجة مقبس Java" ، "ملخص ملفات Java ومهارات تشغيل الدليل" ، "ملخص لمهارات تشغيل بيانات Java" ، "ملخص مهارات تشغيل Java DOM"
آمل أن يكون هذا المقال مفيدًا لبرمجة Java للجميع.