LoginSignup
0
0

More than 1 year has passed since last update.

Javaでシリアル通信するためにRXTXライブラリを使ってCOMポートを開いた

Last updated at Posted at 2021-08-27

あらまし

先日こんなことがあった

解決したので報告

まず本プロジェクトの環境周りを
プログラムはほぼ触らずに新しいパソコンへ移植というお仕事

  • Windows 7 32bit -> Windows Server 2016 64bit
  • Java6 -> Java8
  • シリアル通信で外部機械との通信あり、シリアル通信にはRXTX-2.1-7というライブラリを使っている

次に起きた問題

// RS232Cポートをオープンする。この処理を実行すると
CommPortIdentifier RSport = CommPortIdentifier.getPortIdentifier("COM1");
// このエラーになる。( rxtxParallel.dll と rxtxSerial.dll を見つけられませんだって )
> java.lang.NoClassDefFoundError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver 
// Javaが64bitだとこのエラーになる。( 呼び出した.dllが32bit版だから動かせないよだって)
> java.lang.UnsatisfiedLinkError: C:\Windows\System32\rxtxSerial.dll: Can't load IA 32-bit .dll on a AMD 64-bit platform thrown while loading gnu.io.RXTXCommDriver

やったこと

  • Javaの再インストール(64bit版をアンインストールして32bit版をインストールした)

Javaだから環境依存しないでしょ?と何も考えずに64bit版のJavaを入れたのも失敗
上にも書いたけどDLLが32bit版の場合は32bit版のJavaからでないと呼び出せない

ちなみに64bit版ライブラリもあるようだ。こちらだったら64bit版Javaでいいかもしれない。(が今回は32bitで押し通す)

  • C:\Windows\SysWOW64rxtxParallel.dllrxtxSerial.dllを配置

以前は32bitOSだからsytem32でよかったけど64bitOSで32bitのライブラリを使うならここに入れる。
なぜならWindowsがリダイレクトするので。

  • RXTXcomm.jarのパスをきっちりクラスパスに設定する

試しに書いたサンプルコードを以下に記す

メモ帳で即席で書いたため汚いのはご愛敬で

run.bat
@echo off
@cd %~dp0

set JAVA_CLASSPATH=%任意のフォルダ%\RXTXcomm.jar

rem =========
rem コンパイル
rem =========
javac -cp "%JAVA_CLASSPATH%" Test.java

@if %errorlevel% equ 0 (cls) else (pause)

rem =========
rem java実行
rem =========
java -cp "%JAVA_CLASSPATH%" Test

pause
Test.java
import gnu.io.CommPortIdentifier;

class Test{

  public static void main(String[] arg){
    showJavaLibrary();
    try{
      // RS232Cポートをオープンする。
      CommPortIdentifier RSport = CommPortIdentifier.getPortIdentifier("COM3");
    }catch(Exception e){
      System.out.println(e.toString());
    }
  }

  public static void showJavaLibrary(){
    System.out.println("パス出力ここから=================");
    for (String str : System.getProperty("java.library.path").split(";")){
      System.out.println(str);
    }
    System.out.println("パス出力ここまで=================");
  }
}

さて実環境を直してきますか

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0