Серийный порт через коммуникацию USB

Вопрос или проблема

привет, я хотел узнать, есть ли библиотека, которую я мог бы использовать для моего Android проекта, чтобы считывать данные с последовательного порта через USB, которая поддерживает скорость передачи 256000 бод. Я использовал mik3y:usb-serial-for-android, но она не поддерживает указанную скорость. Вот фрагмент моего кода. Хотя он читает, кажется, он использует 230400 бод, которые не совместимы. В моем приложении на .NET Core в Windows работает. Тот же кабель, то же устройство.


    public synchronized boolean openConnection(UsbDevice device, DeviceConfig config) {
        if (device == null || config == null) {
            Log.e(TAG, "Устройство или конфигурация равны null");
            return false;
        }

        if (isConnected() && device.equals(connectedDevice)) {
            Log.i(TAG, "Уже подключено к этому устройству.");
            return true;
        }

        closeConnection();

        try {
            usbInterface = device.getInterface(0);
            connection = usbManager.openDevice(device);

            if (connection == null) {
                Log.e(TAG, "Не удалось открыть соединение с USB-устройством.");
                return false;
            }

            if (!connection.claimInterface(usbInterface, true)) {
                Log.e(TAG, "Не удалось захватить USB-интерфейс.");
                closeConnection();
                return false;
            }

            for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
                UsbEndpoint endpoint = usbInterface.getEndpoint(i);
                if (endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                    if (endpoint.getDirection() == UsbConstants.USB_DIR_IN) {
                        inEndpoint = endpoint;
                    } else {
                        outEndpoint = endpoint;
                    }
                }
            }

            if (inEndpoint == null || outEndpoint == null) {
                Log.e(TAG, "Не найдены необходимые конечные точки.");
                closeConnection();
                return false;
            }

            serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection);
            if (serialPort != null) {
                if (serialPort.open()) {
                    serialPort.setBaudRate(config.getBaudRate());
                    serialPort.setDataBits(config.getDataBit());
                    serialPort.setStopBits(config.getStopBit().equals("One") ? UsbSerialInterface.STOP_BITS_1 : UsbSerialInterface.STOP_BITS_2);
                    serialPort.setParity(config.getParity().equals("None") ? UsbSerialInterface.PARITY_NONE : UsbSerialInterface.PARITY_ODD);
                    serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);

                    serialPort.read(new UsbSerialInterface.UsbReadCallback() {
                        @Override
                        public void onReceivedData(byte[] bytes) {
                            String data = new String(bytes);
                            // Обработать полученные данные по мере необходимости
                        }
                    });
                } else {
                    Log.e(TAG, "Не удалось открыть последовательный порт.");
                    closeConnection();
                    return false;
                }
            } else {
                Log.e(TAG, "Серийное устройство не поддерживается.");
                closeConnection();
                return false;
            }

            connectedDevice = device;
            return true;

        } catch (Exception e) {
            Log.e(TAG, "Исключение во время USB-соединения: " + e.getMessage(), e);
            closeConnection();
            return false;
        }
    }

здесь я получаю информацию из буфера

        if (connection != null && inEndpoint != null && config != null) {
            int readCommand = Integer.parseInt(config.getReadCommand());
            int stopCommand = Integer.parseInt(config.getStopCommand());
            byte[] buffer = new byte[inEndpoint.getMaxPacketSize()]; 

            while (attempts <= maxRetries) {
                int result = connection.bulkTransfer(inEndpoint, buffer, buffer.length, 50000); 

я совсем новичок в программировании, поэтому я часто использую ChatGPT. Прошу прощения за это.

попробовал использовать этот mik3y:usb-serial-for-android, но не смог связать? / подключить? устройство к нему. Честно говоря, я немного запутался, как это работает.

Но на Windows это работало. На Android, похоже, не удается это исправить.

Ответ или решение

Общая информация о взаимодействии с последовательными портами через USB на Android

Существует множество приложений, которые требуют обмена данными через последовательный порт (RS-232, TTL и т.д.) с подключением через USB. Для Android-платформы, одной из популярных библиотек, позволяющих реализовать такую функциональность, является mik3y:usb-serial-for-android. Однако, как вы уже заметили, эта библиотека может не поддерживать определенные скорости передачи данных, такие как 256000 бод, что вызывает определенные затруднения при работе.

Проблема с настройкой скорости передачи данных

Ваша задача заключается в использовании USB для чтения данных с последовательного порта, установив скорость передачи данных в 256000 бод. Убедитесь, что используемое вами устройство поддерживает данную скорость и совместимо с вашими настройками (например, количество бит данных, стоп-биты и паритет).

Выбор библиотеки

Если mik3y:usb-serial-for-android не подходит из-за ограничения по скорости, целесообразно рассмотреть альтернативные библиотеки, такие как:

  • UsbSerial — другая библиотека, которая может поддерживать более широкий спектр скоростей и протоколов.
  • SerialPort API для Android — если вы хотите улучшить управляемость вашего последовательного порта, вам может понадобиться использовать API для работы с USB-технологиями.

Пример кода и рекомендации

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

public synchronized boolean openConnection(UsbDevice device, DeviceConfig config) {
    // Проверяем корректность введенных параметров
    if (device == null || config == null) {
        Log.e(TAG, "Device or configuration is null");
        return false;
    }

    // Проверяем наличие активного подключения
    if (isConnected() && device.equals(connectedDevice)) {
        Log.i(TAG, "Already connected to this device.");
        return true;
    }

    closeConnection(); // Завершение предыдущего соединения

    try {
        usbInterface = device.getInterface(0);
        connection = usbManager.openDevice(device);

        if (connection == null) {
            Log.e(TAG, "Failed to open USB device connection.");
            return false;
        }

        // Попробуйте захватить интерфейс
        if (!connection.claimInterface(usbInterface, true)) {
            Log.e(TAG, "Failed to claim USB interface.");
            closeConnection();
            return false;
        }

        // Поиск требуемых конечных точек
        for (int i = 0; i < usbInterface.getEndpointCount(); i++) {
            UsbEndpoint endpoint = usbInterface.getEndpoint(i);
            // Проверяем типа конечной точки
            if (endpoint.getType() == UsbConstants.USB_ENDPOINT_XFER_BULK) {
                if (endpoint.getDirection() == UsbConstants.USB_DIR_IN) {
                    inEndpoint = endpoint;
                } else {
                    outEndpoint = endpoint;
                }
            }
        }

        // Проверяем, были ли найдены необходимые конечные точки
        if (inEndpoint == null || outEndpoint == null) {
            Log.e(TAG, "Required endpoints not found.");
            closeConnection();
            return false;
        }

        // Создаем экземпляр последовательного устройства
        serialPort = UsbSerialDevice.createUsbSerialDevice(device, connection);
        if (serialPort != null) {
            if (serialPort.open()) {
                // Устанавливаем желаемую скорость передачи данных
                serialPort.setBaudRate(config.getBaudRate()); // Убедитесь, что config.getBaudRate() возвращает 256000.
                serialPort.setDataBits(config.getDataBit());
                serialPort.setStopBits(config.getStopBit().equals("One") ? UsbSerialInterface.STOP_BITS_1 : UsbSerialInterface.STOP_BITS_2);
                serialPort.setParity(config.getParity().equals("None") ? UsbSerialInterface.PARITY_NONE : UsbSerialInterface.PARITY_ODD);
                serialPort.setFlowControl(UsbSerialInterface.FLOW_CONTROL_OFF);

                // Чтение данных из портов
                serialPort.read(new UsbSerialInterface.UsbReadCallback() {
                    @Override
                    public void onReceivedData(byte[] bytes) {
                        String data = new String(bytes);
                        // Обработка полученных данных
                    }
                });
            } else {
                Log.e(TAG, "Failed to open serial port.");
                closeConnection();
                return false;
            }
        } else {
            Log.e(TAG, "Serial device not supported.");
            closeConnection();
            return false;
        }

        connectedDevice = device;
        return true;

    } catch (Exception e) {
        Log.e(TAG, "Exception during USB connection: " + e.getMessage(), e);
        closeConnection();
        return false;
    }
}
  • Проверьте, чтобы метод config.getBaudRate() действительно возвращал 256000. Возможно, проблема в том, что настройки не применяются правильно.
  • Убедитесь, что выбранное вами устройство совместимо с указанной скоростью. Некоторые устройства могут иметь ограничения по максимальной скорости.
  • Если используемая библиотека не поддерживает 256000, вам может потребоваться использовать другую, более универсальную библиотеку.

Заключение

Работа с последовательными портами через USB на Android может быть сложной задачей, особенно для новичков в программировании. Но с помощью правильных библиотек и внимательного подхода к коду, вы сможете успешно реализовать необходимую функциональность. Удачи в ваших разработках, и не стесняйтесь обращаться за помощью, если у вас возникнут дополнительные вопросы!

Оцените материал
Добавить комментарий

Капча загружается...