это очень специфическая ситуация, но я надеюсь, что кто-то может мне помочь.
У меня есть два ящика для денег, подключенных к машине под управлением 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.Я попытался просто запустить это, и подход узла все еще не открыл ящик.Но отправка эха как-то «откроет» этот ящик для моего проекта узла.
Так что мой вопрос: есть ли у кого-нибудь подозрение, что может происходить?