Как я могу эмулировать COM-порт, записывать данные на него и считывать данные с него? - PullRequest
9 голосов
/ 29 июня 2009

Я пытаюсь проверить мой код, который читает с порта USB (COM25, когда устройство подключено), который создается, когда устройство подключено к моему компьютеру и лодке. Я не могу включить устройство USB, когда не на лодке, поэтому тестирование затруднено. Может кто-нибудь сообщить мне, как имитировать COM-порт и записать в него данные, чтобы моя тестовая программа могла подключиться к этому симулированному COM-порту и прочитать эти данные?

Я читаю это из Java-программы, но симуляция не обязательно должна быть на Java или каком-либо конкретном языке. Просто программа, которая будет имитировать COM-порт и позволит мне подключиться к нему. Я загрузил эмулятор COM-порта из AGG Software, и кажется, что он пишет в то, что я считаю COM25, но я не могу подключиться к нему из моего теста Java.

Ответы [ 7 ]

5 голосов
/ 29 июня 2009

Общий ответ для такого рода проблем состоит в том, чтобы обернуть код, который взаимодействует с COM-портом, в класс, который реализует интерфейс. Если вы делаете это как Фасад (шаблон), вы также можете сделать разумными вызываемые вами COM-методы с вашей стороны.

Интерфейс может быть смоделирован или подделан для теста. (Есть отличная статья о тестовых объектах, но я пока не смог ее найти.) Одним из преимуществ здесь является то, что вы можете создать поддельную версию, которая выдает исключения или иным образом выполняет действия, которые порт может делать, но Трудно заставить это сделать на практике.

2 голосов
/ 24 декабря 2015

В этом разделе есть много соответствующих ответов. Но лично я пользуюсь драйвером виртуального последовательного порта, который идеально подходит для меня. Но я должен признать, что существует множество альтернатив, когда речь идет о создании виртуальных портов: freevirtualserialports.com; comOcom, чтобы назвать несколько. Но у меня нет возможности использовать их, поэтому я рекомендую для решения этой проблемы драйвер виртуального последовательного порта.

2 голосов
/ 30 июня 2009

Спасибо за все ответы до сих пор! Вот что я сделал в результате рекомендаций от кого-то на работе.

  1. Загрузил эмулятор данных COM-порта (CPDE) из программного обеспечения AGG
  2. Загрузил драйвер виртуального последовательного порта (VSPD) из программного обеспечения Eltima

(Я просто случайно выбрал бесплатный эмулятор данных и пакет виртуального последовательного порта. Существует множество альтернатив)

  1. Используя VSPD, создали виртуальные последовательные порты 24 и 25 и подключили их через виртуальный нуль-модемный кабель. Это эффективно создает порт записи в 24 и порт чтения в 25.

  2. Запустил CPDE, подключился к 24 и начал записывать мои тестовые данные.

  3. Запустил мою тестовую программу, подключился к 25 и смог прочитать данные теста из нее

2 голосов
/ 29 июня 2009

Там, где я работаю, мы решили аналогичную проблему, так как наш эмулятор вообще не подделывал COM-порт. Вот как вы можете это сделать:

  • Определите интерфейс для общения с вашим COM-портом, что-то вроде IUsbCommService
  • Реализуйте свой реальный сервис COM-общения, используя стандартный Java Comm API
  • Для вашего эмулятора просто нажмите на поток, который регулярно выдает данные, которые вы можете ожидать от вашего USB-устройства.
  • Используйте предпочитаемую платформу IOC (например, Spring) для подключения либо эмулятора, либо реального сервиса.
  • Пока вы надлежащим образом скрываете логику реализации и пока вы кодируете интерфейс, ваш код потребителя службы не будет заботиться о том, идет ли речь о реальном устройстве USB или эмуляторе.

Например:

import yourpackage.InaccessibleDeviceException;
import yourpackage.NoDataAvailableException;

public interface IUsbProviderService {

    public void initDevice() throws InaccessibleDeviceException;

    public UsbData getUsbData() 
        throws InaccessibleDeviceException, NoDataAvailableException;
}

// The real service
import javax.comm.SerialPort; //....and the rest of the java comm API 

public class UsbService implements IUsbProviderService {
.
.
.
}

// The emulator
public class UsbServiceEmulator implements IUsbProviderService {
    private Thread listenerThread;
    private static final Long WAITTIMEMS = 10L;
    private String usbData;

    public UsbServiceEmulator(long maxWaitTime) throws InaccessibleDeviceException{
        initialize();
        boolean success = false;
        long slept = 0;

        while (!success && slept < maxWaitTime) {
            Thread.sleep(WAITTIMEMS);
            slept += WAITTIMEMS;

        }
    }

    private void initialize() throws InaccessibleDeviceException{
        listenerThread = new Thread();
        listenerThread.start();
     }

     private class UsbRunner implements Runnable {
        private String[] lines = {"Data line 1", "Data line 2", "Data line 3"};
        public void run() {
            int line = 0;
            while(true) {

                serialEvent(lines[line]);

                if(line == 3) {
                    line = 0;
                } else {
                    line++;
                }

                try {
                    Thread.sleep(200);
                } catch (InterruptedException e) {
                    //handle the error
                }
            }

        private void serialEvent(String line) {
            if(/*you have detected you have enough data */) {
                synchronized(this) {
                    usbData = parser.getUsbData();
                }
            } 


     }
}

Надеюсь, это поможет!

1 голос
/ 23 июня 2015

Кроме всего прочего, я хотел бы добавить этот хороший, бесплатный эмулятор https://sites.google.com/site/terminalbpp/ Я использую. Я также использую эмулятор данных AG порта Com.

1 голос
/ 03 июля 2009

Я использую com0com , и он прекрасно работает для того, что мне нужно.

1 голос
/ 29 июня 2009

Я рекомендую виртуальный модем fabulatech. Получить на http://www.virtual -modem.com

Возможно, вы захотите получить монитор COM-порта для ваших тестов - вы можете найти его по адресу http://www.serial -port-monitor.com

Удачи с лодкой! :)

...