Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Виртуальный com порт / 14 сообщений из 14, страница 1 из 1
23.02.2018, 10:47
    #39606467
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
Приветствую.
Тема для меня новая, надо вникнуть в процесс работы с com портом, что бы принимать с него данные. Тут прошу совета о том, какими виртуальными средствами можно воспользоваться для эмуляции com портов, что бы имитировать работу по соединению, приему данных и т.п., ибо физически в мой ноут порты никак не добавить))
Может кто заморачивался за такое и сможет что-нибудь подсказать ? Был бы признателен))

Добавлено через 5 минут
з.ы. Какие-то средства конечно гуглятся, но тут хочется больше личного опыта услышать.
...
Рейтинг: 0 / 0
23.02.2018, 10:58
    #39606472
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
korshunПриветствую.
Тема для меня новая, надо вникнуть в процесс работы с com портом, что бы принимать с него данные. Тут прошу совета о том, какими виртуальными средствами можно воспользоваться для эмуляции com портов, что бы имитировать работу по соединению, приему данных и т.п., ибо физически в мой ноут порты никак не добавить))
Может кто заморачивался за такое и сможет что-нибудь подсказать ? Был бы признателен))

Добавлено через 5 минут
з.ы. Какие-то средства конечно гуглятся, но тут хочется больше личного опыта услышать.

Два варианта...
1.Есть проги-утилиты, что мапят виртуальный com port...в линуксе это socat...в винде не знаю.
2.Покупаете в любом компьютерном магазине типа
https://www.google.com/search?q=usb com&tbm=isch&tbo=u&source=univ&sa=X&ved=0ahUKEwik447yxrvZAhVLVSwKHceIAboQsAQILA&biw=1024&bih=599
Вставляете в USB ...У Вас появляется com port.(В линуксе сразу появляется...в винде драйвера надо)
Второе предпочтительнее ибо ведь дальше вам надо будет к com порту устройство присоеденить.(Весы считыватели маг.карт rasberyy и т.д)...и сним работать по rs-232..Вот к этому usb-rs232 и будете присоединять rs-232 устройство.
...
Рейтинг: 0 / 0
23.02.2018, 13:16
    #39606516
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
Спасибо.
Вариант с переходником конечно предпочтительнее, но те программы, которые его имитируют, способны так же имитировать поток данных с этого виртуального порта ?
...
Рейтинг: 0 / 0
27.02.2018, 10:21
    #39607658
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
Плодить темы не буду, продолжу тут)
Порты настроил, библиотеку подключил, получилось следующее:

Отправляем данные в порт:

Код: 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.
public class WriteCom {

    public static void main(String[] args) {

        for (int x = 0; x <=10; x++) {
            sendData("test" + x);
        }

    }

    private static void sendData(String x) {
        SerialPort serialPort = new SerialPort("COM10");
        try {
            serialPort.openPort();
            serialPort.setParams(SerialPort.BAUDRATE_9600,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);
            System.out.println("===== send: " + x);
            serialPort.writeString(x);
            serialPort.closePort();
        } catch (SerialPortException ex) {
            System.out.println(ex);
        }

    }
}




Тут же принимаем:

Код: 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.
public class ReadCom {

    private static SerialPort serialPort;

    public static void main(String[] args) {

        serialPort = new SerialPort("COM11");
        try {
            serialPort.openPort();
            serialPort.setParams(SerialPort.BAUDRATE_9600,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN |
                    SerialPort.FLOWCONTROL_RTSCTS_OUT);
            serialPort.addEventListener(new PortReader(), SerialPort.MASK_RXCHAR);
            serialPort.writeString("Get data");
        }
        catch (SerialPortException ex) {
            ex.printStackTrace();
        }

    }

    private static class PortReader
            implements SerialPortEventListener {

        public void serialEvent(SerialPortEvent event) {
            if(event.isRXCHAR() && event.getEventValue() > 0){
                try {
                    String data = serialPort.readString(event.getEventValue());
                    System.out.println("==== read: " + data);
                    serialPort.writeString("Get data");
                }
                catch (SerialPortException ex) {
                    ex.printStackTrace();
                }
            }
        }
    }

}




Проблема такая: при первом проходе цикла идет какой-то кривой прием:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
==== read: test0
==== read: test1test2test3 // WTF???
==== read: test4
==== read: test5
==== read: test6
==== read: test7
==== read: test8
==== read: test9
==== read: test10



Все следующие попытки отправки\чтения дают нормальный результат:

Код: 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.
==== read: test0
==== read: test1
==== read: test2
==== read: test3
==== read: test4
==== read: test5
==== read: test6
==== read: test7
==== read: test8
==== read: test9
==== read: test10
==== read: test0
==== read: test1
==== read: test2
==== read: test3
==== read: test4
==== read: test5
==== read: test6
==== read: test7
==== read: test8
==== read: test9
==== read: test10
==== read: test0
==== read: test1
==== read: test2
==== read: test3
==== read: test4
==== read: test5
==== read: test6
==== read: test7
==== read: test8
==== read: test9
==== read: test10



Почему так получается ?
...
Рейтинг: 0 / 0
27.02.2018, 10:41
    #39607679
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
korshun,

Я сильно не вникал в Ваш текст...Увидел одно...У Вас однопоточно..
Работа с портом java предполагает вы читаете в основном потоке...а пишите в порт в другом.
...
Рейтинг: 0 / 0
27.02.2018, 10:51
    #39607688
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
irbis_alkorshun,

Я сильно не вникал в Ваш текст...Увидел одно...У Вас однопоточно..
Работа с портом java предполагает вы читаете в основном потоке...а пишите в порт в другом.

И в догонку
Вот это
==== read: test1test2test3
На самом деле вполне нормальная штука ...Ибо порт асинхронный....Он весь ответ деожал в буыере а потом сбросил Вам...и для этого есть протокол работы с устройством...как правило это стартовый байт stx(типа 0x02) стоповый enx(типа 0x03)
Ещё контрольная сумма CRC...
И тогда
(stx)test1(enx)(crc)(stx)test2(enx)(crc)(stx)test3(enx)
Легко распарсить пакеты....разделив на фрагменты
...
Рейтинг: 0 / 0
27.02.2018, 11:07
    #39607704
korshun
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
Попробовал прочитать побайтово:
Код: java
1.
2.
3.
4.
                    byte[] buffer = serialPort.readBytes(event.getEventValue());
                    for(byte b : buffer) {
                        System.out.println(b);
                    }


На выходе нет ничего кроме того, что я отправил:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
116
101
115
116
48
116
101
115
116
49


И т.д.
Как поймать стартовые и стоповые метки ?
...
Рейтинг: 0 / 0
27.02.2018, 11:29
    #39607725
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
korshun,

Это заложено в протокол устройства или если это ваше устройство или Вы организуете обмен...то и Вы закладываете этот протокол.
Если это сделать нельзя..То
1.Хреново...возможны так или иначе недоразумения...
2.Регулируйте паузами в методе чтения из порта Thread,currentThread,sleep(50...и подбирайте задержку)
Предварительно надо отрефакторрить код и писать в rs-232 в другом потоке.
3.Отказаться от java...И Попробовать на низкорурлвневом языке...в частности на винде и только на винде есть API,- открыть COM порт в эмуляции синхронном...Типа request и response.(До response..другие request игнорируются)..Если кросспоатформенное тогда не пойдёт.
...
Рейтинг: 0 / 0
27.02.2018, 11:32
    #39607731
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
korshunКак поймать стартовые и стоповые метки ?Стартовые и стоповые биты "поймать" невозможно - это уровень железа.
На уровне программы требуется понимать, что последовательный порт - поток байтов и (как-то) продумывать логику синхронизации в этом потоке. Ну или прикручивать что-то готовое.
В зависимости от типа DCE могут помочь управляющие сигналы - C(arrier)D(etect), например или C(lear-)T(o-)S(end) / R(eady-)T(o-)S(end).
...
Рейтинг: 0 / 0
02.03.2018, 13:05
    #39609614
Cheblin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
Basil A. Sidorov,

Не изобретайте велосипед.
Вот BlackBox генератор исходников отправки и получения пакетов.
...
Рейтинг: 0 / 0
02.03.2018, 15:12
    #39609695
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
Идите (в пешее эротическое путешествие) со своей рекламой.
...
Рейтинг: 0 / 0
02.03.2018, 15:50
    #39609712
Cheblin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
Basil A. SidorovИдите (в пешее эротическое путешествие) со своей рекламой.

"у меня сигарета из рота выпала"

вы на каждое предложение использовать А вместо В , потому что А лучше решает проблему так реагируете?
...
Рейтинг: 0 / 0
02.03.2018, 16:08
    #39609720
Leonid Kudryavtsev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
OFFTOPIC ON

Ну на предложение вместо одного велосипеда использовать Ваш велосипед - реакция вполне адекватная.

Лень залезать в правила форума, но про рекламу там точно что-то было. Т.ч., лично я, полностью Basil A. Sidorov поддерживаю.
...
Рейтинг: 0 / 0
02.03.2018, 17:22
    #39609751
Cheblin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Виртуальный com порт
Leonid KudryavtsevOFFTOPIC ON

Ну на предложение вместо одного велосипеда использовать Ваш велосипед - реакция вполне адекватная.

Лень залезать в правила форума, но про рекламу там точно что-то было. Т.ч., лично я, полностью Basil A. Sidorov поддерживаю.

то есть предложение используй JOOQ вместо Hibernate это реклама и нарушение правил? поднимите мне веки!
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Виртуальный com порт / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]