Электронные и последовательные порты
Я перепробовал все, чтобы заставить Electron работать с последовательным портом ПК. Следовал всем инструкциям по последовательному порту (даже пытался собрать родные модули) без удачи.
Кому-нибудь посчастливилось заставить Электрон работать с последовательными портами? Если так, пожалуйста, поделитесь своей мудростью.
1 ответ
Вот команды, которые мы запускаем после установки npm (или после обновления электрона или последовательного узла).
на Mac
rm -rf node_modules/serialport/build/* node_modules/.bin/electron-rebuild -w serialport -f ls node_modules/serialport/build/Release
на победу
rmdir /S /Q node_modules\serialport\build\ node_modules\.bin\electron-rebuild -w serialport -f dir node_modules\serialport\build\Release
Основная проблема заключается в том, что node-serialport является встроенным модулем, поэтому вы должны скомпилировать его или использовать предварительно созданную версию, соответствующую вашей версии узла. Но ожидаемая версия электронного узла будет часто (почти всегда) отличаться от версии узла, установленного вами во всем мире. Когда вы перестраиваете node-serialport, вам нужно указать версию узла, которую ожидает электрон. К счастью, электронное восстановление справляется с этим. Установите его и запустите, как указано выше. Он выяснит, какую версию электрона вы используете (при условии, что вы не скрываете его в каком-то неожиданном месте).
Еще одна проблема, с которой мы столкнулись, заключается в том, что вам нужно вручную удалять артефакты сборки перед запуском восстановления электронов, в противном случае он не генерирует новые артефакты. Возможно, это было исправлено с тех пор, как я в последний раз смотрел на это.
Я включил прямой листинг в качестве третьей команды, чтобы увидеть вывод, который убедил меня в том, что файлы были сгенерированы.
Наше решение было основано на очень долгом обсуждении этой темы в проблеме serial-serialport. Вам не нужно читать его, но если вы начнете здесь, https://github.com/EmergingTechnologyAdvisors/node-serialport/issues/538, где они говорят:
Я думаю, что этот вопрос должен быть закрыт, верно? Это не проблема, давно не было, потому что узел-последовательный порт прекрасно работает с Electron.
Основная проблема заключается в том, что у Electron у всех, кто начинает использовать Electron, будут проблемы с собственными модулями, и большинство проблем в этой теме связано с работой собственных модулей.
... и тогда проблема закрыта.
Я думаю, что это невозможно сделать напрямую, НО для меня работал следующим образом:
- во-первых, вы можете создать класс со всей логикой последовательного порта, которая вам нужна
- импортируйте его в свой файл main.js (файл основного процесса электрона) любым удобным для вас способом (я делаю это через модули commonJS)
- создайте экземпляр своего класса последовательного порта в основном процессе и назначьте его глобальному объекту (
global.serialport = new yourSerialPort()
) - затем в типе файла процесса рендеринга:
const serialport = require('electron').remote.getGlobal('serialport')
- если вы используете webpack, вы должны добавить в webpack.config.js следующую строку для вашего процесса рендеринга:
...
target: 'electron-renderer',
...
отредактировано: 6. и если вы хотите использовать веб-пакет для основного электронного процесса, вы должны ввести следующее в конфигурации веб-пакета для основного процесса:
target: "electron-main",
devtool: "source-map",
externals: {
serialport: "commonjs2 serialport",
},
(исходная карта не является обязательной)
Я даже думаю, что вы можете потребовать последовательный порт от процесса рендеринга, если отметите в конфигурации webpack, что его внешняя зависимость, как я описываю выше
его все...
теперь вы можете использовать последовательный порт на стороне рендеринга вашего электронного приложения