Міністерство освіти і науки України
Національний університет “Львівська політехніка”
Кафедра ЕОМ
/
Лабораторна робота №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);
}
}
}
}
}