تتطلب الدورة الأخيرة كتابة أداة اتصال متسلسلة لأجهزة الكمبيوتر العليا. كتبت أداة اتصال تسلسلية بسيطة مع واجهة رسومية تعتمد على Java. سيتم وصف العملية بالتفصيل أدناه للرجوع إليها^_^
واحد:
بادئ ذي بدء ، تحتاج إلى تنزيل حزمة جرة إضافية تدعم عملية الاتصالات المنفذ التسلسلي Java. نظرًا لأن Java.comm قديم نسبيًا ولا يدعم أنظمة 64 بت ، فمن المستحسن أن تكون حزمة jar rxtx (دعم 32 بت/64 بت).
عنوان التنزيل الرسمي:
يمكن تنزيل أحذية الأطفال التي لا يمكن أن تكون FQ هنا:
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (32-bit)
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (64-bit)
اثنين:
قم بتنزيل حزمة JAR غير المصدفة وقدمها تحت مسار Build Java:
يأسر
ملاحظة: إذا تم إلقاء خطأ java.lang.unsatisfiedlinkerror أثناء العملية ، فيرجى نسخ ملفين من RxtXparalled.dll و rxtxserial.dll في حزمة إلغاء الضغط Rxtx إلى دليل C:/windows/system32 لحل الخطأ.
ثلاثة:
فيما يتعلق باستخدام حزمة الجرة هذه ، كتبت فئة SerialTool.java ، والتي توفر خدمات بسيطة مختلفة لاتصالات المنفذ التسلسلي. الرمز كما يلي (لاحظ أن هذه الفئة موجودة في حزمة SerialPort):
Package SerialPort ؛ import java.io.ioException ؛ استيراد java.io.inputstream ؛ استيراد java.io.outputstream ؛ استيراد java.util.arraylist ؛ استيراد java.util.enumeration ؛ استيراد java.util.toomanylistenersexception ؛ gnu.io.nosuchportException ؛ import gnu.io.portinuseexception ؛ استيراد gnu.io.serialport ؛ استيراد gnu.io.serialporteventeventender ؛ استيراد gnu.io.unsupportedCommoperationexception ؛ استيراد serialexception. * Author Zhong * */public Class SerialTool {private static serialtool serialTool = null ؛ ثابت {// تهيئة كائن serialTool عندما يتم تحميل هذه الفئة بواسطة classloader if (serialTool == null) {serialTool = new SerialTool () ؛ }} // غير مسموح بمنشئ فئة SerialTool الخاصة بإنشاء كائنات SerialTool الخاصة serialtool () {} /*** احصل على كائن serialtool الذي يوفر الخدمة* @returntool* /public static serialtool getialtool () {if (serialtool) } إرجاع SerialTool ؛ } /*** ابحث عن جميع المنافذ المتوفرة* قائمة أسماء المنافذ المتاحة* /public static finallist <string> findport () {// الحصول على جميع المنافذ التسلسلية المتاحة حاليًا التعداد <SaintidentIdentifier> portlist = commportidentifier.getportidentifiers () ؛ ArrayList <string> portnamelist = new ArrayList <> () ؛ // إضافة اسم المنفذ التسلسلي المتاح لإدراج القائمة وإرجاعها بينما (portlist.hasmoreElements ()) {String portName = portlist.nextElement (). getName () ؛ portnamelist.add (PortName) ؛ } إرجاع portnamelist ؛ } /*** فتح المنفذ التسلسلي* param portname اسم المنفذ* param baudrate baudrate* return serialport object* throws serialportparameterfailure فشل في تعيين معلمات المنفذ التسلسلي* thrats notaserialport يشير إلى الجهاز إلى الجهاز من نوع المنفذ التسلسلي* throws nosuchport هناك لا يتوافق احتلت*/عامة ثابتة للسلسلة النهائية OpenPort (سلسلة PortName ، int baudrate) يلقي SerialPortParameterFailure ، notaserialport ، nosuchport ، portinuse {try {// تحديد المنفذ بواسطة اسم المنفذ commportidentifier = commportidentifier.getPortIdentIdiveier (portname) ؛ // افتح المنفذ واعطي اسم المنفذ ومهلة (وقت مهلة العملية) // الدفاع عما إذا كان المنفذ التسلسلي إذا (مثيل commport serialport) {serialport serialport = (serialport) commport ؛ جرب {// تعيين معدل البذور والمعلمات الأخرى للميناء التسلسلي serialport.SetSerialPortParams (baudrate ، serialport.databits_8 ، serialport.stopbits_1 ، serialport.parity_none) ؛ } catch (UnsupportedCommoperationException e) {رمي SerialPortParameterFailure () ؛ } //system.out.println("open " + portName +" sucectly! ") ؛ إرجاع Serialport ؛ } آخر {// ليس المنفذ التسلسلي رمي notaserialport جديد () ؛ }} catch (nosuchportException e1) {throw new nosuchport () ؛ } catch (portInuseexception e2) {throw new portinuse () ؛ }} / *** أغلق المنفذ التسلسلي* param serialport كائن المنفذ التسلسلي ليتم إغلاقه* / public static void closeport (serialport serialport) {if (serialport! = null) {serialport.close () ؛ SerialPort = null ؛ ستر sendDatatoSerialPortFailure ، SerialPortOutPutStreamCloseFailure {outputStream out = null ؛ حاول {out = serialport.getOutputStream () ؛ out.write (أمر) ؛ out.flush () ؛ } catch (ioException e) {رمي sendDatatoSerialPortFailure () ؛ } أخيرًا {try {if (out! = null) {out.close () ؛ خارج = فارغ ؛ }} catch (ioException e) {رمي SerialPortOutPutTreamCloseFailure () ؛ }}} / *** اقرأ البيانات من المنفذ التسلسلي* param serialport تم تأسيس كائن SerialPort مع اتصال* return قراءة البيانات* throws readDataFromSerialPortFailure حدث خطأ أثناء قراءة البيانات من port serial serialportertreamtreamtremclosefailure. readDataFromSerialPortFailure ، SerialPortInputStreamCloseFailure {inputStream in = null ؛ بايت [] بايت = فارغة ؛ حاول {in = serialport.getInputStream () ؛ int bufflenth = in.available () ؛ // احصل على طول البيانات في المخزن المؤقت بينما (bufflenth! = 0) {bytes = new byte [bufflenth] ؛ // تهيئة صفيف البايت إلى طول البيانات في المخزن المؤقت في القراءة (بايت) ؛ bufflenth = in.available () ؛ }} catch (ioException e) {رمي جديد readDataFromSerialPortFailure () ؛ } أخيرًا {try {if (in! = null) {in.close () ؛ في = خالية ؛ }} catch (ioException e) {رمي SerialPortInputStreamCloseFailure () ؛ }} إرجاع بايت ؛ } /*** أضف مستمع* param port consure* @param مستمع مستمع المنفذ التسلسلي* throws toomanylisteners هناك الكثير من كائنات فئة الاستماع* /public addud addlistener (serialport port ، serialporteventender beanser) يلقي toomanylisteners {try {// add adderd.addeventlisterener (الاستماع) ؛ // تعيين لإيقاظ مؤشر ترابط استلام الاستماع عند وصول البيانات. // تعيين لإيقاظ مؤشر ترابط المقاطعة عند مقاطعة الاتصال. } catch (toomanylistenersexception e) {رمي toomanylisteners () ؛ }}}ملاحظة: استثناءات الرمي في هذه الطريقة كلها استثناءات مخصصة. والسبب في ذلك هو تسهيل المعالجة المقابلة في البرنامج الرئيسي. فيما يلي وصف لأحد الاستثناءات:
(لاحظ أن جميع استثناءاتي المخصصة يتم وضعها في حزمة Serialexception)
حزمة serialexception ؛ الطبقة العامة SerialPortParameterFailure يمتد الاستثناء { / ** * * / خاص ثابت نهائي الطويل المسلسل = 1L ؛ Public PublicportParameterFailure () {} Override السلسلة العامة ToString () {return "فشلت تعيين معلمات المنفذ التسلسلي! فتح عملية المنفذ التسلسلي لم تكتمل!" ؛ }}لقد قمت بإعادة كتابة طريقة TOSTRING () لكل فئة استثناء مخصصة ، بحيث يمكن للبرنامج الرئيسي طباعة رسالة الخطأ المقابلة بعد التقاط الاستثناء.
يوجد أيضًا فئة في حزمة Serialexception التي تستخرج معلومات الخطأ في كائن الاستثناء المستلم وتحولها إلى سلسلة وإرجاعها. الرمز كما يلي:
حزمة serialexception ؛ استيراد java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد java.io.stringWriter ؛/*** المسؤول عن استخراج رسالة الخطأ وتحويلها في الاستثناء الذي تم تمريره إلى سلسلة ؛ * Author Zhong * */public class stisplyWriter {/** * تغليف رسالة الخطأ في استثناء في سلسلة وإرجاع السلسلة * param e تحتوي على استثناء خطأ * @regurn errice string */public static string geterrorinfromexception (استثناء e) {stringWriter sw = null ؛ printWriter pw = null ؛ جرب {sw = new StringWriter () ؛ PW = New PrintWriter (SW) ؛ E.PrintStackTrace (PW) ؛ إرجاع "/r/n" + sw.toString () + "/r/n" ؛ } catch (استثناء E2) {return "لم يتم الحصول على رسالة خطأ ، يرجى التحقق والمحاولة مرة أخرى!" ؛ } أخيرًا {try {if (pw! = null) {pw.close () ؛ } if (sw! = null) {sw.close () ؛ }} catch (ioException e1) {e1.printStackTrace () ؛ }}}}أربعة:
استخدام فئة البرنامج الرئيسية ، Client.java يحتوي على عنوان إدخال البرنامج (الطريقة الرئيسية). تتمثل وظيفتها في عرض واجهة ترحيب والاتصال بفئة DataView.java لعرض بيانات المنفذ التسلسلي الفعلي.
رمز client.java كما يلي:
Package SerialPort ؛ import java.awt.color ؛ import java.awt.flowlayout ؛ import java.awt.font ؛ import java.awt java.awt.toolkit ؛ استيراد java.awt.event.keyadapter ؛ استيراد java.awt.event.keyevent ؛ استيراد java.awt.event.windowadapter ؛ استيراد java.awt.event.windowevent ؛ */عميل الفئة العامة يمتد الإطار {/** * */private Static Final Long SerialVersionuid = 1L ؛ / *** عرض واجهة البرنامج*/ عرض int الثابت العام = 800 ؛ / *** ارتفاع واجهة البرنامج*/ ارتفاع int static int static = 620 ؛ / ** * موقع واجهة البرنامج (الإحداثيات الأفقية) *// ثابتة ثابتة int loc_x = 200 ؛ / ** * موقع واجهة البرنامج (الإحداثيات الأفقية) */ عام ثابتة ثابتة int loc_y = 70 ؛ لون اللون = اللون. صورة خارج الشاشة = فارغة ؛ // المستخدمة في التخزين المؤقت المزدوج // قم بتعيين أيقونة النافذة (هنا قمت بتخصيص أيقونة أيقونة نافذة Windows ، لأنني أعتقد حقًا أي رمز قهوة صغير ليس ذو مظهر جيد = =) مجموعة أدوات أدوات = getToolkit () ؛ Image Icon = Toolkit.getImage (client.class.getResource ("computer.png")) ؛ // عقد فئات أخرى dataview dataview = جديد dataview (هذا) ؛ // فئة الواجهة الرئيسية (عرض اللوحة الرئيسية لبيانات المراقبة)/*** الطريقة الرئيسية* param args //*/public static void main (string [] args) {new client (). LaunchFrame () ؛ } / *** إظهار الواجهة الرئيسية* / public void laffframe () {this.setBounds (loc_x ، loc_y ، العرض ، الارتفاع) ؛ // قم بتعيين الموقع الذي يظهر فيه البرنامج على سطح المكتب this.settitle ("CDIO Project") ؛ // قم بتعيين عنوان البرنامج this.seticOnimage (icon) ؛ this.setbackground (color.hite) ؛ // قم بتعيين لون الخلفية this.addwIndOwListener (new WindowAdapter () {// إضافة الاستماع إلى حالة النافذة public void windowsclosing (windowevent arg0) {//system.exit(0) ؛ // exit the program}}) ؛ this.addKeyListener (new keymonitor ()) ؛ // أضف مستمع لوحة المفاتيح this.setResible (false) ؛ // لا يمكن تغيير حجم النافذة هذا. // نافذة العرض الجديدة (REPAINTTHREAD ()). start () ؛ // مؤشر ترابط إعادة التوطين}/*** ارسم عناصر مكون مختلفة من واجهة البرنامج*/public void paint (Graphics g) {color c = g.getColor () ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 40)) ؛ G.SetColor (color.black) ؛ G.DrawString ("مرحبًا بك لاستخدام نظام المراقبة في الوقت الفعلي في الكمبيوتر العلوي" ، 45 ، 190) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.italic ، 26)) ؛ G.SetColor (color.black) ؛ G.DrawString ("الإصدار: 1.0 مدعوم من: Zhonglei" ، 280 ، 260) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 30)) ؛ G.SetColor (اللون) ؛ g.drawString("―--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- = color.white ؛ GoffScreen.SetColor (color.hite) ؛ Canvas الأصلي} /** يطبق الفئة الداخلية مراقبة أحداث لوحة المفاتيح* / خاص Keymonitor يمتد KeyAdapter {public void keyrelest (keyevent e) {int keycode = e.getKeyCode () ؛ if (keycode == keyevent.vk_enter) {// عندما يسمع الشاشة أن المستخدم يضرب مفتاح إدخال لوحة المفاتيح ، قم بتنفيذ العملية التالية setVisible (false) ؛ // إخفاء واجهة الترحيب dataview.setVisible (true) ؛ // إظهار واجهة المراقبة dataview.dataframe () ؛ // تهيئة واجهة المراقبة}}}/ * * إعادة تهيئة الموضوع (إعادة طلاء كل 250 مللي ثانية) */قم بإعادة صياغة الفئة الخاصة تنفذ Runnable {public void run () {بينما (true) {REPAINT () ؛ حاول {thread.sleep (250) ؛ } catch (interruptedException e) {// إنشاء مربع حوار عندما يلقي مؤشر ترابط إعادة التخصيص استثناءً ويعرض تفاصيل استثناء erric err = stisplyWriter.getErrorInfOfRomexception (e) ؛ joptionpane.showmessagedialog (null ، err ، "error" ، joptionpane.information_message) ؛ System.exit (0) ؛ }}}}}تشغيل لقطة الشاشة:
ملاحظة: يكون للمفتاح السفلي "انقر فوق إدخال إدخال الواجهة الرئيسية" في عملية التشغيل الفعلية تأثير فلاش (يتم تحقيقه عن طريق إعادة السحب على الواجهة كل مرة ، مما يسمح لهذه الجملة بالظهور مرارًا وتكرارًا بالألوان البيضاء والأسود). إن طريقة التخزين المؤقت المزدوجة مفضية إلى حل مشكلة الخفقان في الواجهة عند إعادة السحب (إذا لم تستخدم طريقة التخزين المؤقت المزدوجة ، فهذا يعادل رسم أشياء جديدة على الواجهة القديمة شيئًا فشيئًا في كل مرة تقوم فيها بإعادة السحب ، ويكون التخزين المؤقت المزدوج بشكل أساسي عن طريق رسم واجهة جديدة في الذاكرة ، ثم تغطي الواجهة القديمة مباشرة مع الواجهة الجديدة في وقت واحد)
رمز dataview.java كما يلي: (يتم استخدام هذه الفئة لعرض بيانات المنفذ التسلسلي في الوقت الحقيقي)
شرح بسيط:
يقوم جهاز الأجهزة بإرسال البيانات إلى الكمبيوتر من خلال المنفذ التسلسلي كل مرة. بعد توصيل أداة المنفذ التسلسلي بنجاح بجهاز الأجهزة ويضيف مراقبة ، ستقوم بتحليل البيانات وتحديث الواجهة في كل مرة يتم فيها استلام البيانات ؛
من المحتمل أن تكون متطلباتك مختلفة عني عند استخدامه. هذا الفصل هو للرجوع فقط. في الاستخدام الفعلي ، قد تحتاج إلى إعادة إنشاء واجهة عرض البيانات وطريقة تحليل البيانات.
Package SerialPort ؛ import java.awt.button ؛ استيراد java.awt.choice ؛ استيراد java.awt.color ؛ استيراد java.awt.font ؛ استيراد java.awt.frame ؛ import java.awt.graphics ؛ import java.awt.image ؛ java.awt.event.actionevent ؛ استيراد java.awt.event.ActionListener ؛ استيراد java.awt.event.windowadapter ؛ import java.awt.event.windowevent ؛ import java.Util.list ؛ import java.util.toomanylistexpice gnu.io.serialportevent ؛ استيراد gnu.io.serialporteventileListener ؛ استيراد serialexception.* ؛/*** مراقبة فئة عرض البيانات* Author Zhong**/Public Class Dataview يمتد الإطار {/****/private static static statialuversuredudversiv = 1l ؛ عميل العميل = فارغ ؛ قائمة خاصة <string> commList = null ؛ // حفظ أرقام المنفذ المتاحة SerialPort SerialPort = NULL ؛ // حفظ كائن المنفذ التسلسلي font font = new font ("Microsoft Yahei" ، font.bold ، 25) ؛ تسمية خاصة TEM = تسمية جديدة ("لا توجد بيانات بعد" ، label.center) ؛ // درجة حرارة التسمية الخاصة hum = تسمية جديدة ("لا توجد بيانات بعد" ، label.center) ؛ // الرطوبة الملصق الخاص pa = new label ("لا توجد بيانات بعد" ، label.center) ؛ // الضغط الخاص تسمية Rain = New Label ("لا توجد بيانات بعد" ، label.center) ؛ // Raininal Private Label win_sp = تسمية جديدة ("لا بيانات بعد" ، label.center) ؛ // Wind Speed Private Label Win_dir = New Label ("لا توجد بيانات بعد" ، label.center) ؛ // Wind Direction الاختيار الخاص commchoice = اختيار جديد () ؛ // اختيار المنفذ التسلسلي (مربع منسد) اختيار خاص bpschoice = اختيار جديد () ؛ // اختيار معدل سيئة زر OpenSerialButton = زر جديد ("فتح المنفذ التسلسلي") ؛ صورة خارج الشاشة = فارغة ؛ // canvas عند إعادة الطلاء // قم بتعيين أيقونة مجموعة أدوات Window Toolkit = getToolKit () ؛ Image Icon = toolkit.getImage (dataview.class.getResource ("computer.png")) ؛ / *** Class Constructor* param client*/ public dataview (عميل العميل) {this.client = client ؛ commList = serialTool.findport () ؛ // مسح المنفذ التسلسلي الصحيح مرة واحدة عند تهيئة البرنامج} /*** يتم عرض نافذة القائمة الرئيسية ؛ * إضافة التسمية ، الزر ، شريط منسد والاستماع الحدث ذات الصلة ؛ */ public void dataframe () {this.setBounds (client.loc_x ، client.loc_y ، client.width ، client.height) ؛ this.settitle ("Project Project") ؛ this.SeticOnimage (icon) ؛ this.setbackground (color.hite) ؛ this.setLayout (null) ؛ this.addwIndOwListener (new windowadapter () {public void windowsclosing (windowevent arg0) {if (serialport! = null) {// أغلق المنفذ التسلسلي عندما يخرج البرنامج ويطلقه serialtool.closeport (serialport) ؛} system.exit (0) ؛}) ؛}) ؛ Tem.SetBounds (140 ، 103 ، 225 ، 50) ؛ tem.setbackground (color.black) ؛ tem.setfont (الخط) ؛ tem.setforeground (color.hite) ؛ إضافة (TEM) ؛ Hum.SetBounds (520 ، 103 ، 225 ، 50) ؛ hum.setbackground (color.black) ؛ hum.setfont (الخط) ؛ hum.setforeground (color.hite) ؛ إضافة (همهمة) ؛ Pa.SetBounds (140 ، 193 ، 225 ، 50) ؛ pa.setbackground (color.black) ؛ pa.setfont (الخط) ؛ pa.setforeground (color.hite) ؛ إضافة (PA) ؛ Rain.setBounds (520 ، 193 ، 225 ، 50) ؛ Rain.setBackground (color.black) ؛ Rain.setFont (الخط) ؛ Rain.setForeground (color.hite) ؛ إضافة (المطر) ؛ Win_sp.setBounds (140 ، 283 ، 225 ، 50) ؛ win_sp.setbackground (color.black) ؛ win_sp.setfont (الخط) ؛ win_sp.setforeground (color.hite) ؛ إضافة (win_sp) ؛ Win_dir.setBounds (520 ، 283 ، 225 ، 50) ؛ win_dir.setbackground (color.black) ؛ win_dir.setfont (font) ؛ win_dir.setForeGround (color.hite) ؛ إضافة (win_dir) ؛ // إضافة خيار اختيار المنفذ التسلسلي commchoice.setBounds (160 ، 397 ، 200 ، 200) ؛ // تحقق مما إذا كان هناك منفذ تسلسلي متاح. if (commList == null || commlist.size () <1) {joptionpane.showmessagedialog (null ، "لم يتم العثور على منفذ تسلسلي صالح!" ، "خطأ" ، joptionpane.information_message) ؛ } else {for (string s: comminlist) {commchoice.add (s) ؛ }} إضافة (commchoice) ؛ // إضافة خيار معدل Baud 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") ؛ إضافة (bpschoice) ؛ // أضف زر المنفذ التسلسلي المفتوح OpenSerialButton.setBounds (250 ، 490 ، 300 ، 50) ؛ OpenSerialButton.SetBackground (color.lightgray) ؛ OpenSerialButton.setfont (New Font ("Microsoft Yahei" ، font.bold ، 20)) ؛ OpenSerialButton.SetForeGround (color.darkgray) ؛ إضافة (OpenSerialButton) ؛ // أضف الحدث الاستماع إلى زر المنفذ التسلسلي المفتوح openserialbutton.addActionListener (جديد actionListener () {public void actionperformed (ActionEvent e) {// احصل على سلسلة اسم المنفذ التسلسلي commName = commchoice.getselected () == NULL ||. joptionpane.showmessagedialog (Null ، "يتم الحصول على خطأ سيء!" ، "خطأ" ، joptionpane.information_message) ؛ serialtool.openport (commname ، bps) ؛ // تتم مطالب الشاشة بمراقبة joptionpane.showmessagedialog (NULL ، "الشاشة ناجحة ، سيتم عرض بيانات المراقبة لاحقًا!" ، "موجه" ، joptionpane.information_message) ؛ } catch (SerialPortParameterFailure | notaserialport | nosuchport | portinuse | toomanylisteners e1) {// حدوث خطأ ، استخدم حوارًا للمطالبة برسالة الخطأ المحددة joptionpane.showmessagedialog (null ، e1 ، "error" ، joptionpane.information_message) ؛ }}}}}}) ؛ this.setResible (false) ؛ موضوع جديد (جديد REPAINTTHREAD ()). start () ؛ // ابدأ تشغيل مؤشر ترابط إعادة التوطين}/*** ارسم عنصر مكون الواجهة الرئيسي*/public void paint (Graphics g) {color c = g.getColor () ؛ G.SetColor (color.black) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 25)) ؛ G.DrawString ("درجة الحرارة:" ، 45 ، 130) ؛ G.SetColor (color.black) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 25)) ؛ G.DrawString ("الرطوبة:" ، 425 ، 130) ؛ G.SetColor (color.black) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 25)) ؛ G.DrawString ("الضغط:" ، 45 ، 220) ؛ G.SetColor (color.black) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 25)) ؛ G.DrawString ("Rain:" ، 425 ، 220) ؛ G.SetColor (color.black) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 25)) ؛ G.DrawString ("سرعة الرياح:" ، 45 ، 310) ؛ G.SetColor (color.black) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 25)) ؛ G.DrawString ("اتجاه الرياح:" ، 425 ، 310) ؛ G.SetColor (color.gray) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 20)) ؛ G.DrawString ("اختيار المنفذ التسلسلي:" ، 45 ، 410) ؛ G.SetColor (color.gray) ؛ G.SetFont (خط جديد ("Microsoft Yahei" ، font.bold ، 20)) ؛ G.DrawString ("المعدل السيئ:" ، 425 ، 410) ؛ } / *** يعيد طريقة التخزين المؤقت المزدوجة كل مكون عنصر من الواجهة* / تحديث الفراغ العام (الرسومات G) {if (Offscreen == null) Offscreen = this.createImage (client.width ، client.height) ؛ Graphics goffscreen = Offscreen.getGraphics () ؛ color c = goffscreen.getColor () ؛ goffscreen.setColor (color.white) ؛ goffscreen.fillRect (0 ، 0 ، client.width ، client.height) ؛ // إعادة طلاء القماش الخلفي this.paint (goffscreen) ؛ // إعادة تهيئة عنصر الواجهة goffscreen.setColor (C) ؛ G.DrawImage (خارج الشاشة ، 0 ، 0 ، null) ؛ // "رش" اللوحة القماشية المرسومة حديثًا على خيط إعادة التدوير الأصلي/ * * // مسح المنفذ التسلسلي المتاح commList = serialTool.findport () ؛ if (commList! = null && commList.size ()> 0) {// أضف المنفذ التسلسلي المتاح الذي تم مسحه حديثًا لـ (سلسلة S: commList) {// هل يوجد اسم المنفذ التسلسلي بالفعل؟ الافتراضي الأولي غير موجود (إذا كان موجودًا في CommList ولكنه غير موجود في Commchoice ، فسيتم إضافته حديثًا) لـ (int i = 0 ؛ i <commchoice.getItemCount () ؛ i ++) {if (s.equals (commchoice.getitem (i))) {// اسم المنفذ التسلسلي الذي تم مسحه ضوئيًا حاليًا موجود بالفعل في Scanexist الأولي = true ؛ استراحة؛ }} if (commexist) {// اسم المنفذ التسلسلي الممسوح ضوئيًا حاليًا موجود بالفعل في الفحص الأولي ، ويدخل مباشرة الحلقة التالية ؛ } آخر {// إذا لم يكن موجودًا ، فأضف اسم المنفذ التسلسلي الجديد إلى القائمة المنسدلة للمنفذ التسلسلي المتاح commchoice.add (s) ؛ }} // قم بإزالة المنفذ التسلسلي غير المتاح بالفعل لـ (int i = 0 ؛ i <commchoice.getItemCount () ؛ i ++) {// ما إذا كان المنفذ التسلسلي قد انتهى ، فإن الافتراضي الأولي غير صالح (موجود في commchoice ولكنه غير موجود في قائمة commlist ، فقد انتهى الأمر) لـ (String s: commList) {if (s.equals (commchoice.getItem (i))) {commNotexist = false ؛ استراحة؛ }} if (commNotExist) {//system.out.println("Remove " + commchoice.getItem (i)) ؛ commchoice.remove (i) ؛ } آخر {متابعة ؛ }}} آخر {// إذا كان comminist تم مسحه ضوئيًا فارغًا ، فقم بإزالة جميع المنافذ التسلسلية الحالية commchoice.removeall () ؛ } جرب {thread.sleep (30) ؛ } catch (interruptedException e) {string err = inspectWriter.geterRorInfOfRomexception (e) ؛ joptionpane.showmessagedialog (null ، err ، "error" ، joptionpane.information_message) ؛ System.exit (0) ؛ }}} ستر SerialPortEvent.BI: // 10 اتصالات مقاطعة joptionpane.showmessagedialog (لاغية ، "Communication Construct مع الجهاز التسلسلي" ، "خطأ" ، joptionpane.information_message) ؛ استراحة؛ CASE SerialPortEvent.oe: // 7 Overflow (Overflow) ERRR ERRR ERROR SERIALPORTEVENT.FE: // 9 frame error case serialportevent.pe: // 8 parity case case serialportevent.cd: 5 يشير الرنين إلى Case SerialPortEvent.output_buffer_empty: // 2 تم مسح المخزن المؤقت للإخراج ؛ CASE SerialPortEvent.data_available: // 1 توجد بيانات متاحة على المنفذ التسلسلي // system.out.println ("dative data") ؛ بايت [] البيانات = فارغة ؛ حاول {if (serialport == null) {joptionpane.showmessagedialog (null ، "كائن المنفذ التسلسلي فارغ! فشل المراقبة!" ، "خطأ" ، joptionpane.information_message) ؛ } آخر {data = serialTool.ReadFromport (SerialPort) ؛ // قراءة البيانات وتخزينها في صفيف البايت // system.out.println (سلسلة جديدة (بيانات)) ؛ // تخصيص عملية التحليل ، يمكنك تحليل البيانات بعد استلام البيانات وفقًا لاحتياجاتك الخاصة أثناء عملية الاستخدام الفعلي إذا (data == null || data.length <1) {// تحقق من قراءة ما إذا كانت البيانات قد تم التحقق بشكل صحيح! " System.exit (0) ؛ } آخر {string dataoriginal = new string (data) ؛ // تحويل بيانات صفيف البايت إلى سلسلة تحفظ سلسلة البيانات الأصلية datavalid = "" ؛ // بيانات صالحة (المستخدمة لحفظ سلسلة البيانات الأصلية وإزالة السلسلة بعد رقم * رقم *) العناصر [] = NULL ؛ // المستخدمة لحفظ صفيف السلسلة الذي تم الحصول عليه بعد تقسيم السلسلة الأصلية بالمساحات // تحليل البيانات إذا (dataoriginal.charat (0) == ' *') {// عندما يكون الحرف الأول من البيانات هو الرقم * ، فهذا يعني أن استقبال البيانات قد اكتمل ، و aciling datavalid = dataoriginal.substring (1) ؛ عناصر = datavalid.split ("") ؛ if (عناصر == null || elements.length <1) {// تحقق مما إذا كانت البيانات يتم تحليلها بشكل صحيح joptionpane.showmessagedialog (null ، "عملية تحليل البيانات لها خطأ ، يرجى التحقق من الجهاز أو البرنامج!" ، "خطأ" ، joptionpane.information_message) ؛ System.exit (0) ؛ } آخر {try {// تحديث قيمة تسمية الواجهة/*لـ (int i = 0 ؛ i <elements.length ؛ i ++) {system.out.println (elements [i]) ؛ }*///system.out.println("win_dir: " + عناصر [5]) ؛ tem.settext (عناصر [0] + "℃") ؛ hum.settext (عناصر [1] + "٪") ؛ pa.settext (عناصر [2] + "HPA") ؛ Rain.settext (عناصر [3] + "مم") ؛ win_sp.settext (عناصر [4] + "m/s") ؛ win_dir.settext (عناصر [5] + "°") ؛ } catch (ArrayIndExOutofBoundSexception e) {joptionpane.showmessagedialog (NULL ، "عملية تحليل البيانات لها خطأ ، وفشلت بيانات واجهة التحديث! يرجى التحقق من الجهاز أو البرنامج!" ، "خطأ" ، joptionpane.information_message) ؛ System.exit (0) ؛ }}}}}}} catch (readDataFromSerialPortFailure | serialportInputStreamCloseFailure e) {joptionpane.showmessagedialog (null ، e ، "error" ، joptionpane.information_message) ؛ System.exit (0) ؛ // الخروج من النظام بعد عرض رسالة الخطأ عند حدوث خطأ في القراءة}. }}}}تشغيل لقطة الشاشة:
قم بتنزيل رمز مصدر المشروع بأكمله:
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.