公司安排我做Linux下Java串口读写,折腾两天,终于有一个完美的解决方案,记录并分享,同行少走弯路。
RXTX串口读写在windows下开发正常,在Linux下存在bug,主要表现为:在代码中能正常开启串口后,发数据时oStream.flush()方法报错,收数据时iStream.read()方法jvm崩溃报错,报错信息是Java_gnu_io_RXTXPort_nativeDrain。
从RXTX官网下载的rxtx 2.1-7源代码可在Linux上编译,编译后使用会导致jvm崩溃(网上流传最多的说法是RXTXcomm.jar版本不兼容,从arduino1.5.5安装包内取RXTXcomm.jar,可以解决,反正我没有解决,感觉该说法容易误导人),从官网下载的rxtx 2.2在高版本内核的Linux上编译则会报错,因此放弃。
感谢墨染芬芳的无私分享https://www.cnblogs.com/spqin/p/13262427.html。虽然解决了Linux下amd架构的串口读写(只有.so文件无源码),针对其他CPU架构则依然会报错,要在特殊平台上使用则不够通用,因此继续寻找解决方法。优快云分享的文件要很多积分,生活已经如此的艰难,程序员为何还要为难程序员。
arduino开源,开源了在RXTX基础上修改完善的RXTX代码,该代码可在Linux平台上编译,编译生成.so文件以及RXTXcomm.jar引用包,最后完美解决。
git hub地址https://github.com/arduino/RXTX
百度云网盘分享:https://pan.baidu.com/s/1FjtIY9Nk6GXv1ow3l2gh2w 提取码:h85g
重点
1.echo $JAVA_HOME是否输出Java环境变量,没有则自行百度配置Java环境变量
2.进入RXTX-master文件夹,终端输入./configure开始检测系统环境
3.终端输入make,则在当前目录自动生成RXTXcomm.jar(使用该jar)以及当前CPU架构的文件夹(例如x86_64-unkown-linux-gnu)
4.在3步生成的文件夹下存在隐藏文件夹.lib,你所需要的动态库.so在该lib文件夹下
5.将生成的两个.so文件拷贝至$JAVA_HOME/jre/lib/amd64(amd64是我的CPU类型,换成你的),或者拷贝至/usr/lib64目录下,均需要将.so文件赋予执行权限
6.root模式下运行测试Java程序即可
7.非root模式下需要修改/etc下group文件加入uucp并赋予权限(自行百度),可能还需要赋予当前用户/dev文件夹下的文件读写权限。