NWJS Узел SerialPort «Не удается заблокировать порт», если он был ранее открыт до изменения страницы; как выпустить? - PullRequest
0 голосов
/ 04 апреля 2019

Я использую Node Serialport с NWJS, и я заметил, что если я открою последовательный порт и перейду к новой HTML-странице в моем пользовательском интерфейсе, любые последующие попытки использовать этот последовательный порт приведут к «Ресурсу временно недоступен, Не удается заблокировать порт "ошибки.

Это может быть воспроизведено с минимальным кодом, так как мне нужно только открыть порт и затем перейти к нему:

const SerialPort = require('serialport');

port = new SerialPort("/dev/ttyUSBO", {
      autoOpen: false,
      baudRate: 9600,
      dataBits: 8,
      parity: "none",
      stopBits: 1
    });

port.open();

//now navigate to a new page and try this code again... explosions!

Если я заскочил lsof | grep tty в терминал, я вижу, что мое приложение все еще удерживает порт, когда я перешел на новую страницу:

exe       16370                  user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
TaskSched 16370  2197            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
TaskSched 16370  2198            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
exe       16370  9068            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
exe       16370  9069            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
exe       16370  9070            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
exe       16370  9071            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
ScriptStr 16370 12948            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
TaskSched 16370 16372            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
TaskSched 16370 16374            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
Chrome_Ch 16370 16375            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
GpuMemory 16370 16376            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
Font_Prox 16370 16377            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
Composito 16370 16378            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
Composito 16370 16379            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
Composito 16370 16380            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
Composito 16370 16381            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0
TaskSched 16370 16893            user  149uW     CHR              188,0          0t0        550 /dev/ttyUSB0

Теперь, конечно, если я закрою свое приложение и снова открою его, то я смогу снова использовать последовательный порт ... Или, если я закрою порт перед навигацией, я смогу снова открыть его на следующей странице. Поэтому я просто пытаюсь закрыть его заранее, чтобы открыть его на новой странице:

port.close(); //do this before navigating... everything is fine.

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

Я еще не нашел средства сделать это в документации SerialPort или в каких-либо дискуссиях о том, как сделать это в Интернете, поэтому любые предложения будут высоко оценены! Мне кажется, что я я что-то упускаю, потому что, когда проблемы обсуждаются мало, я нахожу, что это происходит потому, что решение очевидно для всех -_-

Так как мое приложение - это то, что открыло порт в первую очередь, и, поскольку, как установлено выше, оно все еще имеет контроль над портом, есть способ для меня восстановить его, как только я измененные страницы? Видимо, просто создается новый экземпляр SerialPort с тем же путем на новой странице недостаточно хорошо.

В противном случае, есть ли способ заставить NWJS / SerialPort отбрасывать все последовательные порты, которые он удерживает при изменении страницы? По крайней мере, я хотел бы гарантировать, что порт не может быть постоянно "заблокирован", потому что он как-то не закрылся до того, как страница изменилась. Этот подход не решил бы мою озабоченность по поводу кражи портов при смене страниц, но, по крайней мере, смягчает сценарии, когда необходимо перезапустить приложение, чтобы продолжить использовать уже захваченный порт.

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