linux java usb 串口_Linux Java 串口通信

费了好大的劲搞定Linux系统上用Java写串口通信的问题。

jdk中没有原生的串口api,网上找了半天的资料,大概知道了:linux系统上用Java写串口程序,有两个包比较常用,一个是当年sun官方出的javacomm,但是找了半天都是老版本的居多,Oracle官方不提供下载了,不爽。另一个是gnu的rxtx comm,看了一下还算靠谱,不过官方的wiki上(http://rxtx.qbang.org/wiki/index.php/Main_Page)说linux版本的在卸载usb转串口线的时候会崩溃,顿时心头一颤。下载下来之后试了一下,确实可以用,系统里几个原生的串口都识别了,但唯独我的Arduino板子不识别。

捉急之时想到了Arduino IDE里面是有Serial Monitor的,而且也是用Java写的,于是去Arduino的安装目录里面找找,果然发现了在arduino安装目录下的lib目录下,有RXTXcomm.jar、librxtxSerial.so、librxtxSerial64.so这三个文件(我的Linux是64位的,不知道32位的是不是没有64.so这个文件),可以去Arduino官网上下载一个IDE,把这几个文件复制出来,按照rxtx wiki上说明使用,用法是一样的。

如果要脱离eclipse单独执行串口通信程序,将RXTXcomm.jar文件复制到$JAVA_HOME/jre/lib/ext目录下,将librxtxSerial.so和librxtxSerial64.so复制到$JAVA_HOME/jre/lib/amd64/目录下(如果是32位系统应该是i386或者i686,而不是amd64)就OK了,官方wiki上描述的安装步骤很麻烦,做了一下不行。

下面是一个例程,是官方的wiki里例程的改进版【PS:以下代码在win7上用不了,不能用BufferedReader包装InputStream,不知道为啥,有知道原因的童鞋请告诉我】:

packagetest;

importgnu.io.CommPort;

importgnu.io.CommPortIdentifier;

importgnu.io.SerialPort;

importjava.io.BufferedReader;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.InputStreamReader;

importjava.io.OutputStream;

publicclassTwoWaySerialComm

{

publicTwoWaySerialComm()

{

super();

}

voidconnect ( String portName )throwsException

{

CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);

if( portIdentifier.isCurrentlyOwned() )

{

System.out.println("Error: Port is currently in use");

}

else

{

CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);

if( commPortinstanceofSerialPort )

{

SerialPort serialPort = (SerialPort) commPort;

serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);

InputStream in = serialPort.getInputStream();

InputStreamReader reader = newInputStreamReader(in);

BufferedReader r = newBufferedReader(reader);

(newThread(newSerialReader(r))).start();

}

else

{

System.out.println("Error: Only serial ports are handled by this example.");

}

}

}

/** */

publicstaticclassSerialReaderimplementsRunnable

{

BufferedReader in;

publicSerialReader ( BufferedReader in )

{

this.in = in;

}

publicvoidrun ()

{

try

{

String line;

while((line = in.readLine()) !=null){

System.out.println(line);

}

}

catch( IOException e )

{

e.printStackTrace();

}

}

}

/** */

publicstaticclassSerialWriterimplementsRunnable

{

OutputStream out;

publicSerialWriter ( OutputStream out )

{

this.out = out;

}

publicvoidrun ()

{

try

{

intc =0;

while( ( c = System.in.read()) > -1)

{

this.out.write(c);

}

}

catch( IOException e )

{

e.printStackTrace();

}

}

}

staticvoidlistPorts()

{

@SuppressWarnings("unchecked")

java.util.Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

while( portEnum.hasMoreElements() )

{

CommPortIdentifier portIdentifier = portEnum.nextElement();

System.out.println(portIdentifier.getName()  +  " - "+  getPortTypeName(portIdentifier.getPortType()) );

}

}

staticString getPortTypeName (intportType )

{

switch( portType )

{

caseCommPortIdentifier.PORT_I2C:

return"I2C";

caseCommPortIdentifier.PORT_PARALLEL:

return"Parallel";

caseCommPortIdentifier.PORT_RAW:

return"Raw";

caseCommPortIdentifier.PORT_RS485:

return"RS485";

caseCommPortIdentifier.PORT_SERIAL:

return"Serial";

default:

return"unknown type";

}

}

publicstaticvoidmain ( String[] args )

{

listPorts();

try

{

(newTwoWaySerialComm()).connect("/dev/ttyACM0");

}

catch( Exception e )

{

e.printStackTrace();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值