Недавний курс требует написания инструмента последовательного общения для верхних компьютеров. Я написал простой инструмент последовательной связи с графическим интерфейсом на основе Java. Процесс будет подробно описан ниже для вашей ссылки^_^
один:
Прежде всего, вам нужно загрузить дополнительный пакет JAR, который поддерживает операцию последовательного порта Java. Поскольку java.comm относительно старый и не поддерживает 64-битные системы, рекомендуется, чтобы пакет rxtx jar (как 32-битная/64-битная поддержка).
Официальный адрес загрузки: http://fizzed.com/oss/rxtx-for-java (примечание: FQ может потребоваться для загрузки)
Детская обувь, которая не может быть FQ, можно скачать здесь:
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (32-битный)
http://xiazai.vevb.com/201612/yuanma/javamfzrxtx(vevb.com).rar (64-бит)
два:
Загрузите распах с неразрытостью JAR и представьте его по пути сборки Java:
захватывать
ПРИМЕЧАНИЕ. Если во время операции ошибки java.lang.unsatisfiedlinkerror , пожалуйста, скопируйте два файла rxtxparallel.dll и rxtxserial.dll в пакете декомпрессии RXTX в Directory C:/Windows/System32, чтобы разрешить ошибку.
три:
Что касается использования этого пакета JAR, я написал класс SerialTool.java, который предоставляет различные простые услуги для связи последовательных портов. Код заключается в следующем (обратите внимание, что этот класс находится в пакете Serialport):
Package Serialport; импорт java.io.ioexception; import java.io.inputStream; импорт java.io.outputstream; import java.util.arraylist; импорт java.util.enumeration; импорт java.util.toMonylistenersexexception; импорт gnu.io.comport; импорт gnupertexex; gnu.io.portinuseexception; import gnu.io.serialport; import gnu.io.serialporteventlistener; import gnu.io.unsupportedCommoperationException; импорт serialexception. *;/** * Serialtool {private static serialtool serialtool = null; static {// инициализировать объект SerialTool, когда этот класс загружается ClassLoader if (serialTool == null) {serialTool = new SerialTool (); }} // Конструктор частного класса SerialTool не разрешается генерировать объекты SerialTool Private SerialTool () {} /*** Получить объект SerialTool, который предоставляет услугу* @return serialtool* /public static serialtool geterialtool () {if (serialtool == null) {serialtool =; if (if (serialtool == null) {serialtool =; } return serialtool; } /*** Найти все доступные порты* @return Список доступных названий портов* /public Static Final ArrayList <string> findport () {// Получить все доступные в настоящее время последовательные порты enumeration <comportidentifier> portlist = commportientifier.getportientifiers (); Arraylist <string> portnamelist = new ArrayList <> (); // Добавить доступное имя последовательного порта для списка и вернуть список while (portlist.hasmoreelements ()) {string portname = portlist.nextelement (). GetName (); portnamelist.add (portname); } вернуть портаntist; } /*** Открыть последовательный порт* @param portname name* @param baudrate baudrate* @return serialport obj Занимается*/public Static Final Serialport Openport (String portname, int baudrate) бросает serialportparameterfailure, notaSerialport, nosuchport, portinuse {try {// идентифицировать порт с помощью названия порта commportientifier = comportidentifier.getportidentifier (portname); // Откройте порт и дайте название порта и тайм -аут (время ожидания операции открытия) Comport Comport = Portidentifier.open (PortName, 2000); // защищать, является ли это последовательным портом if (Commport Instance Of serialport) {serialport serialport = (serialport) Comport; try {// Установить скорость передачи и другие параметры серийного порта serialport.seterialportparams (baudrate, serialport.databits_8, serialport.stopbits_1, serialport.parity_none); } catch (unsupportedComperationException e) {бросить новый serialportparameterfailure (); } //System.out.println("open " + portname +" успешно! "); вернуть serialport; } else {// не последовательный порт бросить новый notaSerialPort (); }} catch (nosuchportException e1) {бросить новый nosuchport (); } catch (portinuseexception e2) {throw new portinuse (); }} / *** Закройте последовательный порт* @param serialport. Объект последовательного порта, который должен быть закрыт* / public void closeport (serialport serialport) {if (serialport! = Null) {serialport.close (); serialport = null; }} / *** Отправить данные в последовательный порт* @param serialport serialport object* @param Заказ данных, которые будут отправлены* @throws sendatatoserialportfailure Не удалось отправить данные в серийный порт* @throws serialportoutptreamclosefailure закрыть погрешность потока вывода погрешного порта). SendatatoSerialPortFailure, serialPortOutputStreamCloseFailure {outputStream Out = null; try {out = serialport.getOutputStream (); out.write (order); out.flush (); } catch (ioException e) {бросить новый SendatatoSerialPortFailure (); } наконец {try {if (out! = null) {out.close (); out = null; }} catch (ioException e) {бросить новый serialportOutputStreamCloseFailure (); }}} / *** Читать данные из последовательного порта* @param serialport. Объект Serialport с подключением был установлен* @return the Data Read* @Throws ReadDataFromSerialPortFailure Происходимость при чтении данных с прочтением погрешной погрешной погрешности () SerialPortInptreamCloseFailure Close Port Propport Propport Pertport -Pertport -Serial ReaddataFromSerialPortFailure, serialPortInputStreamCloseFailure {inputStream in = null; байт [] байты = null; try {in = serialport.getInputStream (); int bufflenth = in.vailable (); // Получить длину данных в буфере while (bufflenth! = 0) {bytes = new Byte [bufflenth]; // инициализировать байт массив к длине данных в буфере in.read (байты); bufflenth = in.vailable (); }} catch (ioException e) {throw new ReadDataFromSerialPortFailure (); } наконец {try {if (in! = null) {in.close (); in = null; }} catch (ioException e) {бросить новый serialPortInputStreamCloseFailure (); }} вернуть байты; } /*** Добавить слушатель* @param порт порт последовательный порт* @param слушатель слушатель последовательный слушатель* @throws toomanylisteners. Слишком много объектов класса прослушивания* /public static void addlistener (serialport port, serialporteventliester slusterer) tomonylisteners {try {// add uliderventlister (прослушивание); // Установите, чтобы разбудить поток при прослушивании, когда данные прибывают в port.notifyondataavailable (true); // Установите, чтобы разбудить поток прерывания, когда коммуникация прервана port.notifyonbreakintrupt (true); } catch (toomanylistenersException e) {бросить новые томанолистенеры (); }}}Примечание: исключения броска в этом методе - все мои пользовательские исключения. Причина этого состоит в том, чтобы облегчить соответствующую обработку в основной программе. Вот описание одного из исключений:
(Обратите внимание, что все мои пользовательские исключения размещены в пакете Serialexception)
пакет serialexception; public class serialportparameterfailure Excelless exection { / ** * * / private static final long serialversionuid = 1l; public serialportparameterfailure () {} @Override public String toString () {return »Установите параметры последовательного порта. Не удалось! Открытие операции последовательного порта не завершена!»; }}Я переписал его метод ToString () для каждого пользовательского класса исключений, так что основная программа может распечатать соответствующее сообщение об ошибке после улавливания исключения.
В пакете Serialexception также есть класс, который извлекает информацию об ошибке в объекте полученного исключения и преобразует ее в строку и возвращает ее. Код заключается в следующем:
Пакет Serialexception; импорт java.io.ioexception; import java.io.printwriter; импортировать java.io.stringwriter;/*** Отвечает за извлечение и преобразование сообщения об ошибке в переданное исключение в строку; * @author Zhong * */public Class ExceptionWriter {/** * Инкапсулируйте сообщение об ошибке в исключении в строку и возвращайте строку * @param E Содержит исключение ошибки * @return Message string */null Static String getErrorInfroMexception (Exception E) {StringWriter SW = null; Printwriter pw = null; try {sw = new StringWriter (); pw = new Printwriter (SW); e.printstacktrace (pw); вернуть "/r/n" + sw.toString () + "/r/n"; } catch (Exception 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; импорт java.awt.color; import java.awt.flowlayout; импорт java.awt.font; import java.awt.frame; импорт java.awt.graphics; импорт java.awt.gridlayout; импорт java.awt.image; import java.awt.label; java.awt.toolkit; import java.awt.event.keyadapter; import java.awt.event.keyevent; import java.awt.event.windowadapter; import java.awt.event.windowevent; импорт javax.shiption. */public Class Client Extends Frame {/** * */Private Static Long Long SerialVersionUID = 1L; / *** Ширина интерфейса программы*/ public static final int width = 800; / *** Высота интерфейса программы*/ public static final int height = 620; / ** * Местоположение интерфейса программы (горизонтальные координаты) */ public static final int loc_x = 200; / ** * Местоположение интерфейса программы (горизонтальные координаты) */ public static final int loc_y = 70; Цвет = color.white; Изображение вне экрана = null; // Используется для двойной буферизации // Установить значок окна (здесь я настраивал значок значка окна Windows, потому что я действительно думаю, какой маленький кофейный значок не очень красивый = =) Toolkit toolkit = getToolkit (); Image icon = toolkit.getimage (client.class.getresource ("computer.png")); // удерживать другие классы DataView DataView = new DataView (this); // Основной класс интерфейса (отображение основной панели данных мониторинга)/*** Основной метод* @param args //*/public static void main (string [] args) {new Client (). LaunchFrame (); } / *** Показать основной интерфейс* / public void launchframe () {this.setBounds (loc_x, loc_y, width, height); // Установить местоположение, где программа появляется на рабочем столе This.SetTitle ("CDIO Project"); // Установить заголовок программы this.seTicOnimage (значок); this.setbackground (color.white); // Установить цвет фона this.addwindowlistener (new windowdapter () {// добавить статус прослушивания окна public void windowclose (windowevent arg0) {//system.exit(0); // Выйти из программы}}); this.addkeylistener (new Keymonitor ()); // Добавить клавиатуру слушатель this.SetReSizable (false); // размер окна не может быть изменен. // новое поток окна дисплея (New 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 Powered By: Zhonglei», 280, 260); g.setfont (новый шрифт ("Microsoft Yahei", Font.bold, 30)); g.setcolor (цвет); g.drawString("―--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- = Color.white; Goffscreen.setcolor (Color.white); Оригинальный Canvas} /** Внутренний класс реализует мониторинг событий клавиатуры* / private class keymonitor extends keyadapter {public void keyreleaded (keyevent e) {int keycode = e.getkeycode (); if (keycode == keyevent.vk_enter) {// Когда монитор слышит, что пользователь достигает клавиши ввода клавиатуры, выполните следующую операцию setVisible (false); // скрыть интерфейс приветственного интерфейса dataView.setVisible (true); // Показать интерфейс мониторинга dataView.dataFrame (); // Инициализировать интерфейс мониторинга}}}/ * * Перекрасить поток (перекрашивать каждые 250 миллисекунд) */частное класс RepaintThread реализует runnable {public void run () {while (true) {repaint (); try {thread.sleep (250); } catch (прерывание Exception e) {// Создание диалога, когда перекрашенный поток бросает исключение и отображает детали исключения string err = exceptionWriter.getErrorInfOfroMexception (e); Joptionpane.showmessageDialog (null, err, "erron", joptionpane.information_message); System.Exit (0); }}}}}Скриншот работает:
ПРИМЕЧАНИЕ. Внизу «Нажмите кнопку ввода, чтобы ввести основной интерфейс» в фактическом процессе работы имеет эффект вспышки (он достигается путем повторного демонстрации интерфейса время от времени, что позволяет этому предложению неоднократно появляться в белых и черных цветах). Метод двойного буферизации способствует решению проблемы мерцания интерфейса при повторном разряде (если вы не используете метод двойного буферизации, он эквивалентен рисованию новых вещей на старом интерфейсе бит по биту каждый раз, когда вы повторно выпили, а двойной буферизатор по существу-сначала рисовать новый интерфейс в памяти, а затем напрямую покрывает старый интерфейс с новым интерфейсом).
Код dataView.java выглядит следующим образом: (этот класс используется для отображения данных последовательных портов в режиме реального времени)
Простое объяснение:
Аппаратное устройство время от времени отправляет данные на компьютер через последовательный порт. После того, как инструмент последовательного порта успешно подключен к аппаратному устройству и добавляет мониторинг, он будет анализировать данные и обновлять интерфейс каждый раз, когда данные получаются;
Ваши требования, вероятно, будут отличаться от моих при его использовании. Этот класс только для справки. В фактическом использовании вам может потребоваться воссоздать интерфейс отображения данных и метод анализа данных.
пакет serialport; импорт java.awt.button; импорт java.awt.choice; импорт java.awt.color; импорт java.awt.font; импорт java.awt.frame; импорт java.awt.graphics; импорт java.awt.image; импорт. java.awt.event.actionevent; import java.awt.event.actionlistener; импорт java.awt.event.windowadapter; import java.awt.event.windowevent; импорт java.util.list; импорт java.util.toomanylistenersexception; импорт javax.swing. gnu.io.serialportevent; import gnu.io.serialporteventlistener; import serialexception.*;/*** Класс дисплея данных мониторинга* @author Zhong**/public Class DataView Extends Frame {/****/private static final long serialversionuid = 1l; Клиент клиент = null; Частный список <string> commlist = null; // Сохранить доступные номера портов Private SerialPort SerialPort = null; // Сохранить объект серийного порта частное шрифт font = new Font ("Microsoft Yahei", Font.Bold, 25); частная маркировка TEM = новая метка («Нет данных пока», Label.Center); // температура частная метка Hum = новая метка («Нет данных еще», Label.center); // влажность частная метка pa = new Label («Нет данных еще», label.center); // давление частной маркировки дождя = новая метка («Нет данных еще», label.center); // дождь частная метка win_sp = new Label («Нет данных еще», Label.center); // Скорость ветра частная метка win_dir = new Label («Нет данных еще», Label.center); // направление ветра частный выбор Commchoice = новый выбор (); // Выбор последовательного порта (раскрывающаяся коробка) Частный выбор bpschoice = new Choice (); // Плохое выбор ставок частной кнопки openserialbutton = новая кнопка («Открыть последовательный порт»); Изображение вне экрана = null; // холст при перекраске // Установить значок Window Toolkit 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 ("проект cdio"); это. Seticonimage (икона); this.setbackground (color.white); this.setlayout (null); this.addwindowlistener (new windowdapter () {public void windowsclose (windowevent arg0) {if (serialport! = null) {// Закройте последовательный порт, когда программа выходит и выпускает ресурс serialtool.closeport (serialport);} system.exit (0);}}); Tem.SetBounds (140, 103, 225, 50); tem.setbackground (color.black); Tem.SetFont (Font); tem.setforeground (color.white); добавить (TEM); Hum.SetBounds (520, 103, 225, 50); hum.setbackground (color.black); hum.setfont (шрифт); hum.setforeground (color.white); добавить (гул); PA.SetBounds (140, 193, 225, 50); pa.setbackground (color.black); pa.setfont (font); pa.setforeground (color.white); добавить (pa); Rain.SetBounds (520, 193, 225, 50); rain.setbackground (color.black); rain.setfont (шрифт); rain.setforeground (color.white); добавить (дождь); win_sp.setbounds (140, 283, 225, 50); win_sp.setbackground (color.black); win_sp.setfont (font); win_sp.setforeground (color.white); добавить (win_sp); win_dir.setbounds (520, 283, 225, 50); win_dir.setbackground (color.black); win_dir.setfont (font); win_dir.setforeground (color.white); добавить (win_dir); // Добавить опцию выбора последовательного порта CommChoice.SetBounds (160, 397, 200, 200); // Проверьте, есть ли доступный последовательный порт. If (commlist == null || commlist.size () <1) {joptionpane.showmessageDialog (null, «Нет действительного последовательного порта!», «Ошибка», joptionpane.information_message); } else {for (string s: commlist) {commchoice.add (s); }} add (commchoice); // Добавить опцию скорости передачи данных 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 (новый шрифт («Microsoft Yahei», Font.Bold, 20)); openserialbutton.setforeground (color.darkgray); Добавить (OpenSerialButton); // Добавить событие прослушивание для открытого кнопки серийного порта openserialbutton.addactionListener (new ActionListener () {public void actionPerformed (actionEvent e) {// Получить строку имени последовательного порта commname = commchoice.getSelectedItem (); // Получить строку бода bpsstr = bpschoice.getSelectedItem (); // watr string string bpsstr = bpschoice.getSelectedItem (); = null ||. Joptionpane.showmessagedialog (null, «Плохая скорость - это ошибка!», «Ошибка», joptionpane.information_message); Serialtool.openport (commname, bps); // Монитор представлен для успешного мониторинга joptionpane.showmessagegagedialog (null, «монитор успешен, данные мониторинга будут отображаться позже!», «Приглашение», joptionpane.information_message); } catch (serialPortParameterFailure | notaSerialPort | nosuchport | portinuse | toomanylisteners e1) {// Когда возникает ошибка, используйте диалог, чтобы вызвать конкретное сообщение об ошибке joptionpane.showmessageedialog (null, e1, "ошибка", joptionpane.information_message); }}}}}}); this.SetReSizable (false); новый поток (new RepaintThread ()). start (); // запустить потоку переработки}/*** Нарисуйте основной элемент компонента интерфейса*/public void Paint (графика 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 («Дождь:», 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); } / *** Метод двойного буферизации перекрасит каждый элемент компонент интерфейса* / public void update (Graphics g) {if (Off Screen == null) Off Screen = this.createimage (client.width, client.height); Graphics goffscreen = Off Screen.getGraphics (); Цвет 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, нулевой); // "распылять" вновь нарисованный холст на исходном Canvas}/ * * Повторный поток (перекрашивает каждые 30 миллисекунд) */частное класс RepaintThread реализует runnable {public void run () {while (true) {// Вызовите метод перекрашивания (); // сканировать доступный серийный порт commlist = serialtool.findport (); if (commlist! = null && commlist.size ()> 0) {// Добавить недавно отсканированный последовательный порт для (String S: Commlist) {// Имя последовательного порта уже существует? Первоначального дефолта не существует (если он существует в Commlist, но не существует в Commchoice, он будет добавлен вновь) логический Commexist = false; for (int i = 0; i <commchoice.getIteMcount (); i ++) {if (s.equals (commchoice.getitem (i))) {// Сканированное имя последовательного порта уже существует в первоначальном сканировании Commexist = true; перерыв; }} if (Commexist) {// Сканированное название последовательного порта уже существует при начальном сканировании, и непосредственно входит в следующую цикл CONLUT; } else {// Если он не существует, добавьте новое имя последовательного порта в доступный раскрывающий список последовательного порта Commchoice.add (s); }} // Удалить и без того недоступный последовательный порт для (int i = 0; i <commchoice.getItemCount (); i ++) {// Независимо от того, истек ли серийный порт, исходное дефолт (существует в Commchoice, но не существует в Commlist, он истек) Boolean Commnotexist = true; for (String s: commlist) {if (s.equals (commchoice.getitem (i))) {commnotexist = false; перерыв; }} if (commnotexist) {//system.out.println("Remove " + commchoice.getitem (i)); commchoice.remove (i); } else {продолжить; }}} else {// Если отсканированный Commlist пуст, удалите все существующие последовательные порты commchoice.removeall (); } try {thread.sleep (30); } catch (прерывание EXT) {string err = exceptionWriter.getErrorInfOfRomexception (e); Joptionpane.showmessageDialog (null, err, "erron", joptionpane.information_message); System.Exit (0); }}}}} / *** • Создать серийный класс прослушивания в форме внутреннего класса* @author Zhong** / Private Class SerialListener реализует SerialPortEventListener { / *** Руководство с контролируемым серийным портом Meviet Serialportevent.bi: // 10 Communication прерывание joptionpane.showmessagedialog (null, «Борьба с последовательным устройством», «Ошибка», joptionpane.information_message); перерыв; case serialportevent.oe: // 7 overflow (переполнение) случая ошибки serialportevent.fe: // 9 случая ошибки кадра serialportevent.pe: // 8 случая ошибки паритета serialportevent.cd: // 6 Дело о обнаружении носителей serialportevent.cts: // 3 четкие данные. 5 Звонки указывает на case serialportevent.output_buffer_empty: // 2 выходной буфер был очищен; case serialportevent.data_available: // 1 доступные данные существуют в серийном порту // system.out.println («Найденные данные»); byte [] data = null; try {if (serialport == null) {joptionpane.showmessageDialog (null, "Объект серийного порта пуст! Мониторинг не удался!", "Ошибка", joptionpane.information_message); } else {data = serialtool.readfromport (serialport); // Читать данные и сохранить их в байтовом массиве // System.out.println (new String (data)); // Настроить процесс анализа, вы можете проанализировать данные после получения данных в соответствии с вашими собственными потребностями во время фактического процесса использования, если (data == null || data.length <1) {// Проверьте, правильно ли данные считывались во время чтения данных! Пожалуйста, проверяйте устройство или программу! System.Exit (0); } else {String DataOriginal = new String (data); // Преобразовать данные массива байтов в строку, которая сохраняет исходную строку данных dataValid = ""; // Допустимые данные (используются для сохранения исходной строки данных и удалить строку после начала * number) string [] elements = null; // Используется для сохранения строкового массива, полученного после разделения исходной строки с помощью пространств // Проанализировать данные if (dataoriginal.charat (0) == ' *') {// Когда первым символом данных является * число, это означает, что прием данных завершается, а анализ DataValid = DataOriginal.SubString (1); elements = dataValid.split ("" "); if (elements == null || elements.length <1) {// Проверьте, правильно ли анализируется данные joptionpane.showmessagedialog (null, «процесс анализа данных имеет ошибку, пожалуйста, проверьте устройство или программу!», «Ошибка», JoptionPane.information_message); System.Exit (0); } else {try {// обновить значение метки интерфейса/*for (int i = 0; i <elements.length; i ++) {System.out.println (elements [i]); }*///System.out.println("win_dir: " + elements [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 | serialPortInptReamCloseFailure e) {joptionpane.showmessageDialog (null, e, "error", joptionpane.information_message); System.Exit (0); // Выйти из системы после отображения сообщения об ошибке, когда возникает ошибка чтения} }}}}Скриншот работает:
Загрузите весь исходный код проекта: http://xiazai.vevb.com/201612/yuanma/javaserialmonitor(Vevb.com).rar
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.