Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
7 / 7 / 2
Регистрация: 29.01.2011
Сообщений: 110

Терминал rs232

21.03.2016, 07:59. Показов 4461. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нет ли у кого примера программы простого терминала в котором можно выставить параметры ком порта и отправить некоторые команды в консоль. Аналог putty только для работы с COM портом.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2016, 07:59
Ответы с готовыми решениями:

Java JSSC: подключение к аналоговому генератору с командами SCPI через RS232
Здравствуйте. Имею задачу: хотя бы просто подружиться с генератором аналоговым, подключенным к ПК по RS232. Генератор опирается на SCPI....

Вывод данных в терминал
как вывести хотя бы тот же "Hello, world" в терминал? (Ubuntu, Netbeans)

Не могу найти ошибку, на терминал не вывод массив
помогите пожалуйста найти ошибку, первый массив выводит хорошо, а измененный нет, получаю только нули public class Y{ public...

17
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
21.03.2016, 12:38
Есть
Попробуйте библиотеку jssc.

Там как-то так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
   SerialPort serialPort = new SerialPort("COM4"); // так создавать новый SerialPort
 
   serialPort.openPort(); // так открывать
 
   serialPort.setParams(jssc.SerialPort.BAUDRATE_9600, jssc.SerialPort.DATABITS_8, jssc.SerialPort.STOPBITS_1, jssc.SerialPort.PARITY_NONE); // параметры
 
   // это просто для примера (коннект к счетчику электроэнергии):
   byte[] tcmd = new byte[]{
   (byte) 0x00, // Адрес счетчика
   (byte) 0x01, // Код запроса
   (byte) 0x01, // Access level
   (byte) 0x01, // Password
   (byte) 0x01, // Password
   (byte) 0x01, // Password
   (byte) 0x01, // Password
   (byte) 0x01, // Password
   (byte) 0x01, // Password
   (byte) 0x00, // CRC
   (byte) 0x00};// CRC
   
   serialPort.writeBytes(tcmd); // так отправлять
   
   byte[] lastResp = serialPort.readBytes(); // так брать ответ
   
   serialPort.closePort(); // так закрывать
Вроде этого достаточно. Могу выложить весь пример, но там дебрей больше
1
21.03.2016, 12:59

Не по теме:

Max_Sys, а Вы к счётчикам обращаетесь по протоколу DLMS или DIN 66258?

0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
21.03.2016, 13:20
HOBATOP, у нас была задача подключить кучу счетчиков Меркурий 230. У них свой собственный протокол, но есть документация. Так и изголялись. Но получилось хорошо
А теперь стоит задача подключить кучку старых контроллеров вентустановок York. Вообще без документации. Получается тоже неплохо
0
21.03.2016, 13:23

Не по теме:

Цитата Сообщение от Max_Sys Посмотреть сообщение
кучу счетчиков
- сколько тысяч, хотя бы примерно? Всё решение полностью на Java?

0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
21.03.2016, 13:32
HOBATOP, да ну не тысячи До сотни всего. Все на Java - отдельно сервер опроса всего и отдельно клиент с окошками.
0
7 / 7 / 2
Регистрация: 29.01.2011
Сообщений: 110
21.03.2016, 15:41  [ТС]
Max_Sys, Ну и для примера если можно и весь пример. Попробую воспользоваться библиотекой jssc.

Добавлено через 1 час 21 минуту
Попробовал с этой библиотекой самое просто вывести имеющиеся COM порты
Java
1
2
3
4
5
6
7
8
9
10
11
import jssc.SerialPortList;
 
public class test {
 
    public static void main(String[] args) {
        String[] portNames = SerialPortList.getPortNames();
        for(int i = 0; i < portNames.length; i++){
            System.out.println(portNames[i]);
        }
    }
}
Все работает значит библиотеку подключил успешно.

Далее подключил к COM порту свич D-Link для проверки. Через pytty к нему успешно подключаюсь.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import jssc.SerialPort;
import jssc.SerialPortException;
 
public class test {
 
    public static void main(String[] args) {
        //В конструктор класса передаём имя порта с которым мы будем работать
        SerialPort serialPort = new SerialPort("COM1");
        try {
            //Открываем порт
            serialPort.openPort();
            // параметры
            serialPort.setParams(jssc.SerialPort.BAUDRATE_115200,
                    jssc.SerialPort.DATABITS_8,
                    jssc.SerialPort.STOPBITS_1,
                    jssc.SerialPort.PARITY_NONE);
            // Отправляем команду в порт
            serialPort.writeString("sh ports");
 
            // Закрываю порт
            serialPort.closePort();
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }
}
Не пойму как считать полный ответ от устройства.
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
21.03.2016, 15:58
micro-chipset, попробуйте jssc. Если что - посмотрите её исходники на github. Там же есть её форки (на всякий случай их можно тоже глянуть).

Вот дебри, не ругайте за забористость
Блин... не влезает...
Тогда кусок:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
public class EMeter {
 
    private final int idInDB;
    private final HashMap<String, String> meterFlags = new HashMap<>();
    private final String meterName;
    private String groupName;
    private String serialNumber = "";
    private final String portName;
    private SerialPort serialPort;
    private Calendar lastCmdTime;
    private int delay = 500;
    private byte addressOnBus = 0;
    private int addressInMem3 = 0;
    private Boolean overloadBit = null;
    private int Ki = 1;
    private final int meterConst = 1000;
    private byte[] lastResp = new byte[0];
    private final int[] CRC16_TABLE = {0x0000, 0xc0c1, 0xc181, 0x0140, 0xc301, 0x03c0, 0x0280, 0xc241, 0xc601, 0x06c0, 0x0780, 0xc741, 0x0500, 0xc5c1, 0xc481, 0x0440, 0xcc01, 0x0cc0, 0x0d80, 0xcd41, 0x0f00, 0xcfc1, 0xce81, 0x0e40, 0x0a00, 0xcac1, 0xcb81, 0x0b40, 0xc901, 0x09c0, 0x0880, 0xc841, 0xd801, 0x18c0, 0x1980, 0xd941, 0x1b00, 0xdbc1, 0xda81, 0x1a40, 0x1e00, 0xdec1, 0xdf81, 0x1f40, 0xdd01, 0x1dc0, 0x1c80, 0xdc41, 0x1400, 0xd4c1, 0xd581, 0x1540, 0xd701, 0x17c0, 0x1680, 0xd641, 0xd201, 0x12c0, 0x1380, 0xd341, 0x1100, 0xd1c1, 0xd081, 0x1040, 0xf001, 0x30c0, 0x3180, 0xf141, 0x3300, 0xf3c1, 0xf281, 0x3240, 0x3600, 0xf6c1, 0xf781, 0x3740, 0xf501, 0x35c0, 0x3480, 0xf441, 0x3c00, 0xfcc1, 0xfd81, 0x3d40, 0xff01, 0x3fc0, 0x3e80, 0xfe41, 0xfa01, 0x3ac0, 0x3b80, 0xfb41, 0x3900, 0xf9c1, 0xf881, 0x3840, 0x2800, 0xe8c1, 0xe981, 0x2940, 0xeb01, 0x2bc0, 0x2a80, 0xea41, 0xee01, 0x2ec0, 0x2f80, 0xef41, 0x2d00, 0xedc1, 0xec81, 0x2c40, 0xe401, 0x24c0, 0x2580, 0xe541, 0x2700, 0xe7c1, 0xe681, 0x2640, 0x2200, 0xe2c1, 0xe381, 0x2340, 0xe101, 0x21c0, 0x2080, 0xe041, 0xa001, 0x60c0, 0x6180, 0xa141, 0x6300, 0xa3c1, 0xa281, 0x6240, 0x6600, 0xa6c1, 0xa781, 0x6740, 0xa501, 0x65c0, 0x6480, 0xa441, 0x6c00, 0xacc1, 0xad81, 0x6d40, 0xaf01, 0x6fc0, 0x6e80, 0xae41, 0xaa01, 0x6ac0, 0x6b80, 0xab41, 0x6900, 0xa9c1, 0xa881, 0x6840, 0x7800, 0xb8c1, 0xb981, 0x7940, 0xbb01, 0x7bc0, 0x7a80, 0xba41, 0xbe01, 0x7ec0, 0x7f80, 0xbf41, 0x7d00, 0xbdc1, 0xbc81, 0x7c40, 0xb401, 0x74c0, 0x7580, 0xb541, 0x7700, 0xb7c1, 0xb681, 0x7640, 0x7200, 0xb2c1, 0xb381, 0x7340, 0xb101, 0x71c0, 0x7080, 0xb041, 0x5000, 0x90c1, 0x9181, 0x5140, 0x9301, 0x53c0, 0x5280, 0x9241, 0x9601, 0x56c0, 0x5780, 0x9741, 0x5500, 0x95c1, 0x9481, 0x5440, 0x9c01, 0x5cc0, 0x5d80, 0x9d41, 0x5f00, 0x9fc1, 0x9e81, 0x5e40, 0x5a00, 0x9ac1, 0x9b81, 0x5b40, 0x9901, 0x59c0, 0x5880, 0x9841, 0x8801, 0x48c0, 0x4980, 0x8941, 0x4b00, 0x8bc1, 0x8a81, 0x4a40, 0x4e00, 0x8ec1, 0x8f81, 0x4f40, 0x8d01, 0x4dc0, 0x4c80, 0x8c41, 0x4400, 0x84c1, 0x8581, 0x4540, 0x8701, 0x47c0, 0x4680, 0x8641, 0x8201, 0x42c0, 0x4380, 0x8341, 0x4100, 0x81c1, 0x8081, 0x4040};
    private String status = "---";
 
    public EMeter(String counterName, String groupName, int Ki, String comPort, int addressOnBus, int idInDB) {
        this.meterName = counterName;
        this.groupName = groupName;
        this.addressOnBus = (byte) addressOnBus;
        this.Ki = Ki;
        this.portName = comPort;
        this.idInDB = idInDB;
    }
 
    private void setCRC16(byte[] cmd) {
        int sum = 0xFFFF;
        for (int i = 0; i < cmd.length - 2; i++) {
            sum = (sum >> 8) ^ CRC16_TABLE[((sum) ^ ((int) cmd[i] & 0xff)) & 0xff];
        }
        cmd[cmd.length - 1] = (byte) (sum >>> 8);
        cmd[cmd.length - 2] = (byte) sum;
    }
 
    public boolean sendCMD(byte[] cmd) {
        Calendar ca = Calendar.getInstance();
        ca.add(Calendar.SECOND, -200);
        if (lastCmdTime.before(ca)) {
            byte[] tcmd = new byte[]{
                cmd[0], // Адрес
                (byte) 0x01, // Код запроса
                (byte) 0x01, // Access level
                (byte) 0x01, // Password
                (byte) 0x01, // Password
                (byte) 0x01, // Password
                (byte) 0x01, // Password
                (byte) 0x01, // Password
                (byte) 0x01, // Password
                (byte) 0x00, // CRC
                (byte) 0x00};// CRC
            setCRC16(tcmd);
            try {
                if (!serialPort.isOpened()) {
                    if (!serialPort.openPort()) {
                        return false;
                    }
                    serialPort.setParams(jssc.SerialPort.BAUDRATE_9600, jssc.SerialPort.DATABITS_8, jssc.SerialPort.STOPBITS_1, jssc.SerialPort.PARITY_NONE);
                    if (!serialPort.isOpened()) {
                        return false;
                    }
                }
                serialPort.writeBytes(tcmd);
                Thread.sleep(delay);
                serialPort.readBytes();
            } catch (SerialPortException | InterruptedException ex) {
                Logger.getLogger(EMeter.class.getName()).log(Level.SEVERE, null, ex);
                return false;
            }
        }
        setCRC16(cmd);
        try {
            if (!serialPort.isOpened()) {
                serialPort.openPort();
                if (!serialPort.isOpened()) {
                    return false;
                }
            }
            serialPort.writeBytes(cmd);
            Thread.sleep(delay);
            lastResp = serialPort.readBytes();
            serialPort.closePort();
        } catch (SerialPortException | InterruptedException ex) {
            Logger.getLogger(EMeter.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }
        lastCmdTime = Calendar.getInstance();
        return true;
    }
 
    public byte[] getResponse() {
        if (lastResp == null) {
            return null;
        }
        byte[] resp = lastResp.clone();
        lastResp = new byte[0];
        return resp;
    }
 
    public Double getFreq() {
        double freq = 0d;
        byte[] cmd = new byte[]{
            addressOnBus, // Адрес
            (byte) 0x08, // Код запроса
            (byte) 0x11,
            (byte) 0x40,
            (byte) 0x00, // CRC ставится автоматом
            (byte) 0x00};// CRC ставится автоматом
        if (!sendCMD(cmd)) {
            return null;
        }
        byte[] resp = getResponse();
        if (resp != null && resp.length == 6) {
            freq += (resp[3] & 0xFF) << 8;
            freq += (resp[2] & 0xFF);
            freq = freq / 100;
        } else {
            return null;
        }
        return freq;
    }
 
    public AplusRplus getAplusRplusFromReset() {
        double aplus = 0d;
        double rplus = 0d;
        byte[] cmd = new byte[]{
            addressOnBus,
            (byte) 0x05,
            (byte) 0x00,
            (byte) 0x00,
            (byte) 0x00,
            (byte) 0x00};
        if (!sendCMD(cmd)) {
            return null;
        }
        byte[] resp = getResponse();
        if (resp != null) {
            aplus += (resp[2] & 0xFF) << 24;
            aplus += (resp[1] & 0xFF) << 16;
            aplus += (resp[4] & 0xFF) << 8;
            aplus += (resp[3] & 0xFF);
            aplus /= 1000;
            aplus *= Ki;
            rplus += (resp[10] & 0xFF) << 24;
            rplus += (resp[9] & 0xFF) << 16;
            rplus += (resp[12] & 0xFF) << 8;
            rplus += (resp[11] & 0xFF);
            rplus /= 1000;
            rplus *= Ki;
        } else {
            return null;
        }
        return new AplusRplus(aplus, rplus);
    }
 
    public Calendar getMeterTime() {
        byte[] cmd = new byte[]{
            addressOnBus,
            (byte) 0x04,
            (byte) 0x00,
            (byte) 0x00,
            (byte) 0x00};
        if (!sendCMD(cmd)) {
            return null;
        }
        byte[] resp = getResponse();
        if (resp == null || resp.length != 11) {
            return null;
        }
        int year, month, day, hour, minute, second;
        year = Integer.parseInt("20" + Integer.toHexString(resp[7] & 0xFF));
        month = Integer.parseInt(Integer.toHexString(resp[6] & 0xFF));
        month--;
        day = Integer.parseInt(Integer.toHexString(resp[5] & 0xFF));
        hour = Integer.parseInt(Integer.toHexString(resp[3] & 0xFF));
        minute = Integer.parseInt(Integer.toHexString(resp[2] & 0xFF));
        second = Integer.parseInt(Integer.toHexString(resp[1] & 0xFF));
        return new GregorianCalendar(year, month, day, hour, minute, second);
    }
 
    // ну и так далее...


Добавлено через 5 минут
micro-chipset, попробуйте сделать serialPort.writeString, подождать (хотя не обязательно), и читать пока не прочитается null.
0
7 / 7 / 2
Регистрация: 29.01.2011
Сообщений: 110
21.03.2016, 16:38  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import jssc.SerialPort;
import jssc.SerialPortException;
 
public class test {
 
    public static void main(String[] args) {
        //В конструктор класса передаём имя порта с которым мы будем работать
        SerialPort serialPort = new SerialPort("COM1");
        try {
            //Открываем порт
            serialPort.openPort();
            // параметры
            serialPort.setParams(jssc.SerialPort.BAUDRATE_115200,
                    jssc.SerialPort.DATABITS_8,
                    jssc.SerialPort.STOPBITS_1,
                    jssc.SerialPort.PARITY_NONE);
            // Отправляем команду в порт
            serialPort.writeString("sh ports");
            String data = serialPort.readString();
            System.out.println(data);
            // Закрываю порт
            serialPort.closePort();
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }
}
Сделал так, но в ответ я сразу получаю null

Добавлено через 30 минут
Вроде все так, но данные не считываются почему то.
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
21.03.2016, 17:31
micro-chipset, А если послать и подождать секундочку, а потом только читать. Просто железо не успевает наверное.
1
7 / 7 / 2
Регистрация: 29.01.2011
Сообщений: 110
21.03.2016, 18:07  [ТС]
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import jssc.SerialPort;
import jssc.SerialPortException;
import java.lang.*;
 
 
public class test {
 
    public static void main(String[] args) {
        //В конструктор класса передаём имя порта с которым мы будем работать
        SerialPort serialPort = new SerialPort("COM1");
        try {
            //Открываем порт
            serialPort.openPort();
            // параметры
            serialPort.setParams(jssc.SerialPort.BAUDRATE_115200,
                    jssc.SerialPort.DATABITS_8,
                    jssc.SerialPort.STOPBITS_1,
                    jssc.SerialPort.PARITY_NONE);
            // Отправляем команду в порт
            serialPort.writeString("admin\n");
            serialPort.writeString("admin\n");
            serialPort.writeString("sh ports\n");
            serialPort.writeString("q\n");
            serialPort.writeString("conf ports 6 state disable\n");
            serialPort.writeString("sh ports\n");
            serialPort.writeString("q\n");
            serialPort.writeString("logout\n");
            try {
            Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
                // handle the exception...
                // For example consider calling Thread.currentThread().interrupt(); here.
            }
            String data = serialPort.readString();
            System.out.println(data);
            // Закрываю порт
            serialPort.closePort();
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
    }
}
Да и правда помогло. Проверил работает. А нет ли примера с графическим интерфейсом что бы в одном окне выбираем параметры com порта потом пишем в окне строку для ввода и и при нажатии кнопки ввода видим ответ.
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
21.03.2016, 18:12
Интерфейс прикрутить не проблема. Покапаюсь в своих софтинках - что-то такое когда-то делал.
0
7 / 7 / 2
Регистрация: 29.01.2011
Сообщений: 110
21.03.2016, 18:14  [ТС]
Напишете тогда если найдете такой пример.
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
22.03.2016, 17:19
О!
Извиняюсь за сумбурный initComponents() - это всё NetBeans
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import jssc.SerialPort;
import jssc.SerialPortException;
import jssc.SerialPortList;
 
public class NewJDialog1 extends javax.swing.JDialog {
 
    private jssc.SerialPort serialPort;
 
    private class PortListener implements Runnable {
 
        @Override
        public void run() {
            while (serialPort.isOpened()) {
                try {
                    String ret = serialPort.readString();
                    if (ret != null) {
                        jTextArea1.append(ret);
                    }
                } catch (SerialPortException ex) {
                    Logger.getLogger(NewJDialog1.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    Thread.sleep(500);
                } catch (InterruptedException ex) {
                }
            }
        }
 
    }
 
    public NewJDialog1(java.awt.Frame parent, boolean modal) {
        super(parent, modal);
        initComponents();
 
        String[] strs = null;
        if (System.getProperty("os.name").startsWith("Win")) {
            strs = SerialPortList.getPortNames();
        } else {
            // Тут надо написать что-то под nix...
        }
        jComboBox1.setModel(new DefaultComboBoxModel<>(strs));
    }
 
    private void send() {
        try {
            serialPort.writeBytes(jTextField1.getText().getBytes());
            if (jCheckBox1.isSelected()) {
                serialPort.writeByte((byte) 13);
            }
            if (jCheckBox2.isSelected()) {
                serialPort.writeByte((byte) 10);
            }
            if (jCheckBox3.isSelected()) {
                jTextArea1.append(jTextField1.getText() + "\n");
            }
        } catch (SerialPortException ex) {
            Logger.getLogger(NewJDialog1.class.getName()).log(Level.SEVERE, null, ex);
        }
        jTextField1.setText("");
        jTextField1.requestFocus();
    }
 
    @SuppressWarnings("unchecked")
    private void initComponents() {
 
        jLabel1 = new javax.swing.JLabel();
        jComboBox1 = new javax.swing.JComboBox<>();
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jSeparator1 = new javax.swing.JSeparator();
        jScrollPane1 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jToggleButton1 = new javax.swing.JToggleButton();
        jCheckBox1 = new javax.swing.JCheckBox();
        jCheckBox2 = new javax.swing.JCheckBox();
        jCheckBox3 = new javax.swing.JCheckBox();
 
        setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
 
        jLabel1.setText("Port name:");
 
        jTextField1.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                jTextField1KeyPressed(evt);
            }
        });
 
        jButton1.setText("Send");
        jButton1.setEnabled(false);
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });
 
        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane1.setViewportView(jTextArea1);
 
        jToggleButton1.setText("Open");
        jToggleButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jToggleButton1ActionPerformed(evt);
            }
        });
 
        jCheckBox1.setText("CR");
 
        jCheckBox2.setText("LF");
 
        jCheckBox3.setText("Echo");
 
        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 676, Short.MAX_VALUE)
                    .addComponent(jSeparator1)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jComboBox1, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jToggleButton1))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jTextField1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckBox1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckBox2)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jCheckBox3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(jButton1)))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jComboBox1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jToggleButton1))
                .addGap(18, 18, 18)
                .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jButton1)
                    .addComponent(jCheckBox1)
                    .addComponent(jCheckBox2)
                    .addComponent(jCheckBox3))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 384, Short.MAX_VALUE)
                .addContainerGap())
        );
 
        pack();
    }
 
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        send();
    }                                        
 
    private void jToggleButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                               
        if (jToggleButton1.isSelected()) {
            serialPort = new SerialPort(jComboBox1.getSelectedItem().toString());
 
            try {
                serialPort.openPort();
                serialPort.setParams(jssc.SerialPort.BAUDRATE_9600,
                        jssc.SerialPort.DATABITS_8,
                        jssc.SerialPort.STOPBITS_1,
                        jssc.SerialPort.PARITY_NONE);
            } catch (SerialPortException ex) {
                JOptionPane.showMessageDialog(this, "Не удалось открыть порт!", "Ошибка", JOptionPane.ERROR_MESSAGE);
                jToggleButton1.setSelected(false);
                return;
            }
 
            new Thread(new PortListener()).start();
 
            jComboBox1.setEnabled(false);
            jTextField1.requestFocus();
            jButton1.setEnabled(true);
        } else {
            try {
                serialPort.closePort();
            } catch (SerialPortException ex) {
            }
            jButton1.setEnabled(false);
            jTextField1.setText("");
            jComboBox1.setEnabled(true);
            jComboBox1.requestFocus();
        }
    }                                              
 
    private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {                                       
        if (evt.getKeyCode() == 10 && jButton1.isEnabled()) {
            send();
        }
    }                                      
 
    private javax.swing.JButton jButton1;
    private javax.swing.JCheckBox jCheckBox1;
    private javax.swing.JCheckBox jCheckBox2;
    private javax.swing.JCheckBox jCheckBox3;
    private javax.swing.JComboBox<String> jComboBox1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JSeparator jSeparator1;
    private javax.swing.JTextArea jTextArea1;
    private javax.swing.JTextField jTextField1;
    private javax.swing.JToggleButton jToggleButton1;
}
1
7 / 7 / 2
Регистрация: 29.01.2011
Сообщений: 110
23.03.2016, 13:42  [ТС]
Спасибо попробую в нем разобраться.
0
1 / 1 / 0
Регистрация: 23.09.2015
Сообщений: 42
06.06.2016, 13:53
Здравствуйте! Вот тоже знакомлюсь с классом SerialPort и библиотекой jssc. У меня возникла проблема. Когда я вызываю метод
Java
1
writeByte((byte) 0x12)
программа посылает данные только после закрытия порта. То, есть только вот так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class PortSendTest {
    public static void main(String[] args) throws SerialPortException, InterruptedException {
        PortConnection portConnection = new PortConnection("COM5");
 
        portConnection.writeByte((byte) 0xF3);
        portConnection.closePortConnection();
        Thread.currentThread().sleep(10000);
 
 
        portConnection.openPortConnection();
        portConnection.writeByte((byte) 0xF5);
        portConnection.closePortConnection();
    }
}
PortConnection - это мой класс-обертка класса SerialPort.
Не сталкивались с такой проблемой ?
0
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
11.06.2016, 12:49
JustForStudy, да нет. Вроде все нормально работает. Где-то видел, что на винде может быть такая проблема, но сам не сталкивался.
Или может writeByte и writeBytes по-разному работают. С writeBytes проблем не было.
0
0 / 0 / 0
Регистрация: 06.10.2016
Сообщений: 1
06.10.2016, 16:09
Цитата Сообщение от JustForStudy Посмотреть сообщение
Здравствуйте! Вот тоже знакомлюсь с классом SerialPort и библиотекой jssc. У меня возникла проблема. Когда я вызываю метод writeByte((byte)) программа посылает данные только после закрытия порта. То, есть только вот так:
Приветствую. У меня та же самая проблема. Подскажите, удалось ли вам решить её?

Добавлено через 37 минут
Блин, нашел источник проблемы!
Дело в этих строках:
Java
1
2
serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | 
SerialPort.FLOWCONTROL_RTSCTS_OUT);
Вызов этих методов включает аппаратное управление потоком.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
06.10.2016, 16:09
Помогаю со студенческими работами здесь

Кто напишет терминал на Java ?
Предлагается написать консольный терминал в виде апплета под броузер для работы с хостом и эмуляцией IBM 3270. Естественно за...

usb - rs232
Здравствуйте, я использую для прошивки чипов принтеров (24с) схемку преобразователя на max232 (с ком порта), но сейчас они все реже...

Гальваноразвязка RS232
Надо завести RS232 с развязкой на STM32. Больше всего подходит ADM3251E, со встроенным DC/DC, но этот встроенный DC/DC от 3.3В не...

RS232 и stm32
Доброго времени суток. Прошу прощения за глупейшие вопросы. Плата: Olimex STM-P103 1. На плате находится разъем RS-232(см....

MDB to RS232
Здравствуйте! Подскажите пожалуйста, на схеме в прикрепленном файле отсутствует маркировка транзистора PNP. Какой из самых распространенных...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru