Не могу записать на USB-устройство, используя node-usb, пока не сделаю это вручную, используя echo - PullRequest
0 голосов
/ 21 сентября 2019

это очень специфическая ситуация, но я надеюсь, что кто-то может мне помочь.

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

Я использую пакет usb npm:

https://www.npmjs.com/package/usb

--- EDIT ---

После запуска проекта непосредственно на хост-компьютере, а не в контейнере Docker, у меня возникла та же проблема, так что это не проблема Docker

--- EDIT ---

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

lookForDrawers() {
    // get the devices using their product id
    this.devices = usb.getDeviceList().filter((device: usb.Device) => {
        return device.deviceDescriptor.idProduct === 8963;
    });

    for (const device of this.devices) {
        this.openDrawer(device);
    }
}

Функция openDrawer () выглядит следующим образом:

openDrawer(d: usb.Device) {
    d.open();
    const iFace: usb.Interface = d.interface(0);
    // detach kernal driver if necessary
    if (iFace.isKernelDriverActive()) {
        iFace.detachKernelDriver();
    }
    iFace.claim();
    // I could write a loop to specifically find the OutEndpoint for this device, but I know it is at position 1
    const outEndPoint: usb.OutEndpoint = iFace.endpoints[1] as usb.OutEndpoint;
    outEndPoint.transfer(new Buffer(1), (err) => {
        console.log('transfer finished');
        if (err) {
            console.warn('TRANSFER ERROR', err);
        }
        iFace.release((err) => {
            if (err) {
                console.warn('RELEASE ERROR', err);
            }
            console.log('reattaching');
            iFace.attachKernelDriver();
            d.close();
        });   
    });
}

Теперь этот код выполняется с помощьюнет ошибок вообще.К сожалению, ящики не открываются.

Так вот, теперь у меня все сбивается с толку.

Очевидно, что моей первой мыслью было убедиться, что отправка сигнала на эти USB-устройства фактически приведет коткрытие ящика.

Запустив

ls -l /sys/bus/usb-serial/devices

, я смог подтвердить доступ к контроллерам через / dev / ttyUSB0 и / dev / ttyUSB1

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

sudo chmod o+rw /dev/ttyUSB0
sudo echo '1' > /dev/ttyUSB0

Ящик в этом месте действительно открылся.Но что странно, так это то, что теперь мой машинописный код выше также работал!Как и каждый раз, когда я запускал «openDrawer» на этом устройстве, ящик открывался!Выполнение вышеуказанного на ttyUSB1 позволило бы моему проекту узла также открыть второй ящик.

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

Это не из-за chmod.Я попытался просто запустить это, и подход узла все еще не открыл ящик.Но отправка эха как-то «откроет» этот ящик для моего проекта узла.

Так что мой вопрос: есть ли у кого-нибудь подозрение, что может происходить?

...