Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Лабораторна робота №4
з Переферійних пристроїв
на тему: «Налаштування портів на передачу та прийом
інформації через COM порт»
МЕТА РОБОТИ: ознайомитися з процесом налаштування основних параметрів прийому – передачі пакетних даних через послідовний асинхронний інтерфейс RS-232C (COM-порт).
Хід роботи
Для того, щоб виконати передачу, потрібно викликати запуск передавача і приймача і виконати налаштування параметрів передачі.
/
Рис. 4. Налаштування основних параметрів передачі через інтерфейс RS-232C
/
Рис. 6. Передавання даних через інтерфейс RS-232C
Висновок: я ознайомився з процесом передачі даних через послідовний асинхронний інтерфейс RS-232C (COM-порт).
Додаток:
Код програми передавача і приймача:
Файл Main.java
package sample;import javafx.application.Application;import javafx.beans.value.ChangeListener;import javafx.beans.value.ObservableValue;import javafx.collections.FXCollections;import javafx.collections.ObservableList;import javafx.geometry.*;import javafx.scene.Scene;import javafx.scene.image.Image;import javafx.scene.layout.FlowPane;import javafx.stage.Stage;import javafx.scene.control.*;import jssc.SerialPort;import java.util.Objects;public class Main extends Application { static public String data; @Override public void start(Stage primaryStage) throws Exception{ FlowPane root = new FlowPane(); primaryStage.setTitle("ArchCOM"); primaryStage.setScene(new Scene(root, 300, 350)); root.setPadding(new Insets(10, 10, 10, 10)); root.setOrientation(Orientation.VERTICAL); root.setAlignment(Pos.CENTER); root.setVgap(8); root.setHgap(4); root.setPrefWrapLength(210); root.setColumnHalignment(HPos.CENTER); primaryStage.getIcons().add(new Image("file:com-6643314834.png")); final String[] portName = {"NULL"}; Label listOfports = new Label("Виберіть порт:"); ObservableList<String> comList = FXCollections.observableArrayList(Controller.getPortList()); ComboBox<String> comViewer = new ComboBox<>(comList); comViewer.setPrefSize(80, 30); SelectionModel<String> comModel = comViewer.getSelectionModel(); comModel.selectedItemProperty().addListener(new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { portName[0] = newValue; } }); Button push = new Button("Відправити дані"); Button pull = new Button("Прийняти дані"); TextField inputFild = new TextField(); inputFild.setPromptText("Вводьте дані тут"); inputFild.setPrefColumnCount(15); TextField outputFild = new TextField(); outputFild.setPrefColumnCount(15); outputFild.setPromptText("Поле для прочитаних даних"); push.setOnAction(new javafx.event.EventHandler<javafx.event.ActionEvent>() { @Override public void handle(javafx.event.ActionEvent event) { if(!Objects.equals(portName[0], "NULL")){ Controller port = new Controller(portName[0]); port.writeByteInPort(inputFild.getText()); inputFild.setPromptText("Дані відправлено"); } else { inputFild.setPromptText("Виберіть будь ласка порт"); } } }); pull.setOnAction(new javafx.event.EventHandler<javafx.event.ActionEvent>() { boolean pred = false; @Override public void handle(javafx.event.ActionEvent event) { if(!Objects.equals(portName[0], "NULL") & !pred){ Controller port = new Controller(portName[0]); port.readByteFromPort(); outputFild.setPromptText("Читаю дані..."); outputFild.setText(data); pred = true; Button stop = new Button("Завершити читання"); stop.setOnAction(new javafx.event.EventHandler<javafx.event.ActionEvent>() { @Override public void handle(javafx.event.ActionEvent event) { port.forceEnd(); outputFild.setPromptText("Поле для прочитаних даних"); root.getChildren().remove(stop); pred = false; } }); root.getChildren().add(stop); } else if (pred){ outputFild.setText(data); } else { outputFild.setPromptText("Виберіть будь ласка порт"); } } }); Separator firstLine = new Separator(); firstLine.setPrefWidth(180); Separator secondLine = new Separator(); secondLine.setPrefWidth(180); Separator lastLine = new Separator(); lastLine.setPrefWidth(180); Button setup = new Button("Параметри COM портів"); setup.setOnAction(new javafx.event.EventHandler<javafx.event.ActionEvent>() { @Override public void handle(javafx.event.ActionEvent event) { FlowPane subRoot = new FlowPane(); Stage subStage = new Stage(); subStage.setTitle("Налаштування"); subStage.setScene(new Scene(subRoot, 300, 275)); subRoot.setPadding(new Insets(10, 10, 10, 10)); subRoot.setOrientation(Orientation.VERTICAL); subRoot.setAlignment(Pos.CENTER); subRoot.setVgap(8); subRoot.setHgap(4); subRoot.setPrefWrapLength(210); subRoot.setColumnHalignment(HPos.CENTER); subStage.getIcons().add(new Image("file:com-6643314834.png")); Label comSpead = new Label("Швидкість передачі:"); ObservableList<String> comList = FXCollections.observableArrayList("9600 біт/с", "4800 біт/с", "256000 біт/с", "1200 біт/с", "600 біт/с"); ComboBox<String> comViewer = new ComboBox<>(comList); SelectionModel<String> comModel = comViewer.getSelectionModel(); comViewer.getSelectionModel().selectFirst(); comModel.selectedItemProperty().addListener(new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { switch(newValue){ case "9600 біт/с" : Controller.spead = SerialPort.BAUDRATE_9600; case "4800 біт/с" : Controller.spead = SerialPort.BAUDRATE_4800; case "256000 біт/с" : Controller.spead = SerialPort.BAUDRATE_256000; case "1200 біт/с" : Controller.spead = SerialPort.BAUDRATE_1200; case "600 біт/с" : Controller.spead = SerialPort.BAUDRATE_600; }; } }); Label comParity = new Label("Паритет:"); ObservableList<String> parityList = FXCollections.observableArrayList("Непарність", "Парність"); ComboBox<String> parityViewer = new ComboBox<>(parityList); SelectionModel<String> parityModel = parityViewer.getSelectionModel(); parityViewer.getSelectionModel().selectFirst(); parityModel.selectedItemProperty().addListener(new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { switch(newValue){ case "Непарність" : Controller.parity = SerialPort.PARITY_NONE; case "Парність" : Controller.parity = SerialPort.PARITY_ODD; } } }); Label comStopbits = new Label("Стопові біти:"); ObservableList<String> comStopbitsList = FXCollections.observableArrayList("1 біт", "2 біт"); ComboBox<String> comStopbitsViewer = new ComboBox<>(comStopbitsList); SelectionModel<String> comStopbitsModel = comStopbitsViewer.getSelectionModel(); comStopbitsViewer.getSelectionModel().selectFirst(); comStopbitsModel.selectedItemProperty().addListener(new ChangeListener<String>() { @Override public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { switch(newValue){ case "1 біт" : Controller.stopbits = SerialPort.STOPBITS_1; case "2 біт" : Controller.stopbits = SerialPort.STOPBITS_2; }; } }); Button ok = new Button("OK"); ok.setOnAction(new javafx.event.EventHandler<javafx.event.ActionEvent>() { @Override public void handle(javafx.event.ActionEvent event) { subStage.close(); } }); subRoot.getChildren().addAll(comSpead, comViewer, comParity, parityViewer, comStopbits, comStopbitsViewer, ok); subStage.show(); } }); root.getChildren().addAll(listOfports, comViewer, setup, firstLine, inputFild, push, secondLine, outputFild, pull, lastLine); primaryStage.show(); } public static void main(String[] args) { launch(args); }}
Файл Controller.java
package sample;import jssc.*;public class Controller { private static SerialPort serialPort; public static int spead = SerialPort.BAUDRATE_9600; public static int parity = SerialPort.PARITY_NONE; public static int stopbits = SerialPort.STOPBITS_1; Controller(String portName){ serialPort = new SerialPort(portName); } public static String[] getPortList() { return SerialPortList.getPortNames(); } public void writeByteInPort(String massage) { try { serialPort.openPort(); serialPort.setParams(spead, SerialPort.DATABITS_8, stopbits, parity); serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT); serialPort.writeBytes(massage.getBytes()); serialPort.closePort(); } catch (SerialPortException ex) { System.out.println(ex); } } public void readByteFromPort() { try { serialPort.openPort(); serialPort.setParams(spead, SerialPort.DATABITS_8, stopbits, parity); serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT); serialPort.addEventListener(new PortReader(), SerialPort.MASK_RXCHAR); } catch (SerialPortException ex) { System.out.println(ex); } } public void forceEnd(){ try { serialPort.closePort(); } catch (SerialPortException ex) { System.out.println(ex); } } private static class PortReader implements SerialPortEventListener { public void serialEvent(SerialPortEvent event) { if (event.isRXCHAR() && event.getEventValue() > 0) { try { String data = serialPort.readString(event.getEventValue()); Main.data = data; } catch (SerialPortException ex) { System.out.println(ex); } } } }}