Armadilloフォーラム

Node.jsのserialportについて

hiraga

2017年6月5日 15時33分

いつもお世話になっております、平賀と申します。

Node.jsとnpmでインストールした「serialport」をユーザーランドに追加したのですが以下のようなエラーが出てしまい、nodejsでのシリアル通信ができません。
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

/usr/lib/node_modules/serialport/node_modules/bindings/bindings.js:83
throw e
^
Error: /usr/lib/node_modules/serialport/build/Release/serialport.node: cannot open shared object fi
le: No such file or directory
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at bindings (/usr/lib/node_modules/serialport/node_modules/bindings/bindings.js:76:44)
at Object. (/usr/lib/node_modules/serialport/lib/bindings.js:3:35)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

npmでインストールした他のパッケージは問題無く使用できています。
また、tip、minicomでのシリアル通信は問題無く行えました。

開発環境はATDE5で、使用しているのはArmadillo IoT G2です。
ATDE5のnodeはv0.10.29、npmはv1.4.14で、armadilloのnodejsはv0.10.29です。

Node.jsのインストールは「https://users.atmark-techno.com/blog/53/1644」を、
npmでのインストールは「https://users.atmark-techno.com/blog/53/2061」を参考に行いました。

どのようにすればNode.jsでシリアル通信が出来るでしょうか?
ご教授お願いいたします。

コメント

古関です。

「serialport」に含まれるファイルに
cソースから生成したオブジェクトファイルがいくつかあるようです。
- serialport.o
- serialport_poller.o
- serialport_unix.o

ATDE(x86)でインストールしたものをG2(ARM)側にコピーしているだけなので
オブジェクトファイルがx86用で、動かないとかじゃないでしょうか。

[ATDE]$ file node_modules/serialport/build/Release/obj.target/serialport/src/serialport.o
node_modules/serialport/build/Release/obj.target/serialport/src/serialport.o: ELF 32-bit LSB relocatable, ARM, version 1 (SYSV), not stripped

実際にシリアルにアクセスする部分はc言語で書くことで、処理を効率化しているのですかね。
rubygemのserialもそうだった覚えがあります。

G2をSDブートでdebian起動して、ARMのネイティブ環境でserialportをインストールし、atmark-dist/romfsにコピーするか、
ATDE側でクロスでインストールしたものをatmark-dist/romfsにコピーするかしたら動きませんでしょうか。

前者はATDEと同じやり方でできると思います。

後者は以下のような手順でできないでしょうか。

[ATDE]$ export AR=arm-linux-gnueabi-ar
[ATDE]$ export CC=arm-linux-gnueabi-gcc
[ATDE]$ export CXX=arm-linux-gnueabi-g++
[ATDE]$ export LINK=arm-linux-gnueabi-g++
[ATDE]$ export npm_config_arch=arm
[ATDE]$ npm install serialport --arch=i386 --target_arch=arm

古関です。

> ATDE側でクロスでインストールしたものをatmark-dist/romfsにコピーするかしたら動きませんでしょうか。
> [ATDE]$ export AR=arm-linux-gnueabi-ar
> [ATDE]$ export CC=arm-linux-gnueabi-gcc
> [ATDE]$ export CXX=arm-linux-gnueabi-g++
> [ATDE]$ export LINK=arm-linux-gnueabi-g++
> [ATDE]$ export npm_config_arch=arm
> [ATDE]$ npm install serialport --arch=i386 --target_arch=arm

をこちらでも試して見ましたがArmadill-IoT G2で動きました。

平賀です。

古関様、御回答ありがとうございます。
早速試してみようと思います。

平賀です。

御回答いただいた方法でパッケージをビルドして実行したのですが、エラーとなってしまいました。
実行テストした際のサンプルソース等を見せて頂くことはできますでしょうか?

古関です。

webで検索して出てきたものを
修正しただけですが、ソースを添付します。
拡張子jsがシステムの都合上添付できないので、txtになっています。

CON1アドオンインターフェースに RS232Cアドオンモジュール を接続して、
対向機から何か文字を入力すると、Armadillo側に表示されました。

ファイル ファイルの説明
serial.js_.txt

平賀です。

ありがとうございます。
何故か「Error: Cannot find module 'serialport' 」というエラーが出てしまうので、
もう一度環境構築からやり直してみようと思います。