Отправка простого USB BulkTransfer и получение ответа - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь получить значение веса из набора весов через USB. Это должно быть довольно просто, согласно их do c, мне нужно отправить два байта буквой "W" и байтом возврата каретки. Затем он отвечает 16 байтами данных, представляющими текущий вес на устройстве.

Устройство имеет 1 интерфейс, 2 конечные точки с максимальным размером пакета 64. Я считаю, что должен использовать bulkTransfer Функция в качестве типов конечной точки: USB_ENDPOINT_XFER_BULK.

enter image description here

Вот do do c graphi c: enter image description here

Как именно я должен отправить этот запрос и получить ответ? Моя попытка приведена ниже, и ответом является просто символ Начало заголовка , затем символ обратной кавычки "` "и множество нулей. Я попытался запустить код по запросу l oop или по одному запросу, но получил тот же результат.

    val connection = usbManager.openDevice(scales)
    val intf: UsbInterface = scales.getInterface(0)
    connection.claimInterface(intf, true)

    val endpointReadIn = intf.getEndpoint(0)
    val endpointWriteOut = intf.getEndpoint(1)

    val bytes = byteArrayOf(0x57.toByte(), 0x0D.toByte())

    thread {
        val request = connection.bulkTransfer(endpointWriteOut, bytes, bytes.size, 0)
        Log.d(TAG, "Was request to write successful? $request")
        val buffer = ByteArray(16)
        val response = connection.bulkTransfer(endpointReadIn, buffer, buffer.size, 0)
        Log.d(TAG, "Was response from read successful? $response")
        val responseString = StringBuilder()
        for (i in 0..15) {
            responseString.append(buffer[i])
        }
        Log.d(TAG, "Response: $responseString")

        val hex = toHexString(buffer)
        Log.d(TAG, "Hex: $hex")

        connection.close()
    }


    fun fromHexString(hexString: String): ByteArray {
        val len = hexString.length / 2
        val bytes = ByteArray(len)
        for (i in 0 until len) bytes[i] = hexString.substring(2 * i, 2 * i + 2).toInt(16).toByte()
        return bytes
    }

Вывод:

Was request to write successful? 2
Was response from read successful? 2
Response: 19600000000000000
Hex:  01 60 00 00 00 00 00 00 00 00 00 00 00 00 00 00

1 Ответ

1 голос
/ 06 марта 2020

Здесь было несколько недостающих частей. Я думаю, что большой не указывал скорость передачи, бит данных, стоп-бит и четность, которые все достигаются с помощью функции controlTransfer.

В конце концов, я не смог заставить его работать сам, несмотря на то, что при их установке получал успешные ответы. Затем я нашел эту прекрасную библиотеку , которая совместима с этим устройством RS232 и работает хорошо. Мне просто нужно указать vid / pid, чтобы получить пользовательский драйвер, используя класс FtdiSerialDriver.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...