Как я могу эмулировать COM-порт, запишите данные в него и считайте данные с него?

Массивы на основе 1 всегда должны использоваться вместо массивов на основе 0. Массивы на основе 0 являются неестественными, ненужными и подверженными ошибкам.

Когда я считаю яблоки, сотрудников или виджеты, я начинаю с одного, а не с нуля. Я учу своих детей тому же. Нет такого понятия, как 0-е ​​яблоко или 0-й сотрудник или 0-й виджет. Использование 1 в качестве основы для массива намного более интуитивно понятно и менее подвержено ошибкам. Забудьте о плюс-один-минус-один-ад (как мы привыкли это называть). Массивы на основе 0 - это неестественная конструкция, изобретенная компьютерной наукой - они не отражают реальность, и компьютерные программы должны максимально отражать реальность.

9
задан maytham-ɯɐɥʇʎɐɯ 26 August 2016 в 09:37
поделиться

5 ответов

Thanks to all the answers so far! Here's what I ended up doing as a result of recommendations from someone at work.

  1. Downloaded the COM Port Data Emulator (CPDE) from AGG Software
  2. Downloaded the Virtual Serial Port Driver (VSPD) from Eltima Software

(I just randomly picked a free data emulator and virtual serial port package. There are plenty of alternatives out there)

  1. Using VSPD, created virtual serial ports 24 and 25 and connected them via a virtual null modem cable. This effectively creates a write port at 24 and a read port at 25.

  2. Ran the CPDE, connected to 24 and started writing my test data.

  3. Ran my test program, connected to 25 and was able to read the test data from it

2
ответ дан 4 December 2019 в 14:30
поделиться

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

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

5
ответ дан 4 December 2019 в 14:30
поделиться

Там, где я работаю, мы решили аналогичную проблему, заставив наш эмулятор вообще не подделывать 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();
                }
            } 


     }
}

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

2
ответ дан 4 December 2019 в 14:30
поделиться

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

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

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

1
ответ дан 4 December 2019 в 14:30
поделиться

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

1
ответ дан 4 December 2019 в 14:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: