我正在将Node Serialport与NWJS一起使用,并且我注意到,如果我打开一个串行端口并导航到UI中的新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.
但是我想让页面之间的端口保持打开状态并在新页面上重新获取它!我不想在更改页面时另一个应用程序在释放的端口上调用dibs,并且我不想一直关闭并重新打开端口(毕竟我仍然想要该端口...只是在新页面上)。
我尚未在SerialPort文档中找到实现此目的的方法,也未找到有关如何在线尝试此方法的任何讨论,因此任何建议将不胜感激!我遗漏了一些东西,因为当问题讨论不多时,我发现这往往是因为解决方案对每个人都是显而易见的-_-
因为我的应用程序是首先打开端口的东西,并且由于如上所示,它仍然可以控制端口,所以一旦我完成了申请,我有办法重新获得它更改页面?显然只是创建具有相同路径的新SerialPort实例 在新页面上不够好。
是否失败,是否有一种方法可以强制NWJS / SerialPort在页面更改时丢弃其拥有的所有串行端口?至少,我想保证端口无法永久“锁定”,因为它在页面更改之前以某种方式没有关闭。这种方法并不能解决我在更改页面时端口被盗的担忧,但至少可以缓解需要重新启动应用程序才能继续使用已抓取的端口的情况。