天天看點

Linux Java進行序列槽通信

說明

我是使用的的是gnu的rxtx comm包以及librxtxSerial.so來進行序列槽通信。so檔案需要根據你的系統來進行選擇。否則在程式運作時會提示錯誤。

各系統版本依賴包

配置

  • Java路徑配置

    cat /etc/profile

    cat /etc/profile.d/java.sh

    确定兩個檔案下的CLASSPATH配置過 J A V A H O M E / j r e / l i b 和 P A T H 配 置 過 JAVA_HOME/jre/lib 和PATH配置過 JAVAH​OME/jre/lib和PATH配置過JAVA_HOME/jre/lib,如果沒配置上,請加上,否則會程式運作時會找不到相應的依賴包
  • 序列槽權限

    vi /etc/group

    将如下2段修改為(沒有需新增):

    uucp:x:14:uucp 修改為:uucp:x:14:uucp,afc

    lock:x:54: 修改為:lock:x:54:afc

  • 選擇依賴包

    JDK是32位,選擇i686-unknown-linux-gnu目錄;

    JDK是64位和作業系統是IA-64時,選擇ia64-unkown-linux-gnu目錄;

    JDK是64位和作業系統是x86_64時,選擇x86_64-unknown-linux-gnu目錄,把目錄中的檔案拷貝到/usr/java/jdk1.8.0_152/jre/lib/amd64;

    拷貝RXTXcomm.jar檔案放在 /usr/java/jdk1.8.0_152/jre/lib/amd64/ext下

配置例子

因為我是x86_64以及64位的jdk是以的我配置如下圖:

Linux Java進行序列槽通信
Linux Java進行序列槽通信
Linux Java進行序列槽通信
Linux Java進行序列槽通信

如果選錯了依賴包,或者是放置錯了路徑,會出現如下提示:

  • 選錯依賴包
[ ]$java -classpath . SerialTest
Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /usr/java/jdk1.8.0_152/jre/lib/amd64/librxtxSerial.so which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
java.lang.UnsatisfiedLinkError: /usr/java/jdk1.8.0_152/jre/lib/amd64/librxtxSerial.so: /usr/java/jdk1.8.0_152/jre/lib/amd64/librxtxSerial.so: 無法打開共享對象檔案: 沒有那個檔案或目錄 (Possible cause: can't load IA 64-bit .so on a AMD 64-bit platform) thrown while loading gnu.io.RXTXCommDriver
Exception in thread "main" java.lang.UnsatisfiedLinkError: /usr/java/jdk1.8.0_152/jre/lib/amd64/librxtxSerial.so: /usr/java/jdk1.8.0_152/jre/lib/amd64/librxtxSerial.so: 無法打開共享對象檔案: 沒有那個檔案或目錄 (Possible cause: can't load IA 64-bit .so on a AMD 64-bit platform)
	at java.lang.ClassLoader$NativeLibrary.load(Native Method)
	at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1845)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1122)
	at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:83)
	at SerialTest.main(SerialTest.java:29)
           
  • 路徑錯誤
[ ]$ java -classpath . SerialTest
java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path thrown while loading gnu.io.RXTXCommDriver
Exception in thread "main" java.lang.UnsatisfiedLinkError: no rxtxSerial in java.library.path
	at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
	at java.lang.Runtime.loadLibrary0(Runtime.java:870)
	at java.lang.System.loadLibrary(System.java:1122)
	at gnu.io.CommPortIdentifier.<clinit>(CommPortIdentifier.java:83)
	at SerialTest.main(SerialTest.java:29)
[[email protected] APP]$ 
           
  • 權限錯誤
check_group_uucp(): error testing lock file creation Error details:權限不夠check_lock_status: No permission to create lock file.
please see: How can I use Lock Files with rxtx? in INSTALL
           

測試源碼

  • SerialTest
import java.util.Enumeration;

import gnu.io.CommPortIdentifier;

public class SerialTest {

	public static void main(String[] args) {
		try {
			Enumeration portList = CommPortIdentifier.getPortIdentifiers();
			while (portList.hasMoreElements()) {
				CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
				System.out.println("擷取到的序列槽名稱為:COM" + portId.getPortType());
			}
		} catch (Exception e) {
			System.out.println(e.getMessage());
		}
	}

}

           
  • ShowJvmBit
import java.io.PrintStream;

public class ShowJvmBit
{
  public static void main(String[] paramArrayOfString)
  {
    String str = System.getProperty("sun.arch.data.model");
    System.out.println("This JVM is " + str + "-bit");
  }
}