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上说明使用,用法是一样的。

如果也是用的64位的系统,可以从这里下载:http://download.csdn.net/detail/bhq2010/5141550

如果要脱离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,不知道为啥,有知道原因的童鞋请告诉我】:

[java]  view plain  copy
  1. package test;  
  2. import gnu.io.CommPort;  
  3. import gnu.io.CommPortIdentifier;  
  4. import gnu.io.SerialPort;  
  5.   
  6. import java.io.BufferedReader;  
  7. import java.io.IOException;  
  8. import java.io.InputStream;  
  9. import java.io.InputStreamReader;  
  10. import java.io.OutputStream;  
  11.   
  12. public class TwoWaySerialComm  
  13. {  
  14.     public TwoWaySerialComm()  
  15.     {  
  16.         super();  
  17.     }  
  18.       
  19.     void connect ( String portName ) throws Exception  
  20.     {  
  21.         CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);  
  22.         if ( portIdentifier.isCurrentlyOwned() )  
  23.         {  
  24.             System.out.println("Error: Port is currently in use");  
  25.         }  
  26.         else  
  27.         {  
  28.             CommPort commPort = portIdentifier.open(this.getClass().getName(),2000);  
  29.               
  30.             if ( commPort instanceof SerialPort )  
  31.             {  
  32.                 SerialPort serialPort = (SerialPort) commPort;  
  33.                 serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);  
  34.                   
  35.                 InputStream in = serialPort.getInputStream();  
  36.                   
  37.                 InputStreamReader reader = new InputStreamReader(in);  
  38.                 BufferedReader r = new BufferedReader(reader);  
  39.                   
  40.                 (new Thread(new SerialReader(r))).start();  
  41.   
  42.             }  
  43.             else  
  44.             {  
  45.                 System.out.println("Error: Only serial ports are handled by this example.");  
  46.             }  
  47.         }       
  48.     }  
  49.       
  50.     /** */  
  51.     public static class SerialReader implements Runnable   
  52.     {  
  53.         BufferedReader in;  
  54.           
  55.         public SerialReader ( BufferedReader in )  
  56.         {  
  57.             this.in = in;  
  58.         }  
  59.           
  60.         public void run ()  
  61.         {  
  62.             try  
  63.             {  
  64.                 String line;  
  65.                 while ((line = in.readLine()) != null){  
  66.                     System.out.println(line);  
  67.                 }  
  68.             }  
  69.             catch ( IOException e )  
  70.             {  
  71.                 e.printStackTrace();  
  72.             }              
  73.         }  
  74.     }  
  75.   
  76.     /** */  
  77.     public static class SerialWriter implements Runnable   
  78.     {  
  79.         OutputStream out;  
  80.           
  81.         public SerialWriter ( OutputStream out )  
  82.         {  
  83.             this.out = out;  
  84.         }  
  85.           
  86.         public void run ()  
  87.         {  
  88.             try  
  89.             {                  
  90.                 int c = 0;  
  91.                 while ( ( c = System.in.read()) > -1 )  
  92.                 {  
  93.                     this.out.write(c);  
  94.                 }                  
  95.             }  
  96.             catch ( IOException e )  
  97.             {  
  98.                 e.printStackTrace();  
  99.             }              
  100.         }  
  101.     }  
  102.       
  103.     static void listPorts()  
  104.     {  
  105.         @SuppressWarnings("unchecked")  
  106.         java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();  
  107.         while ( portEnum.hasMoreElements() )   
  108.         {  
  109.             CommPortIdentifier portIdentifier = portEnum.nextElement();  
  110.             System.out.println(portIdentifier.getName()  +  " - " +  getPortTypeName(portIdentifier.getPortType()) );  
  111.         }          
  112.     }  
  113.       
  114.     static String getPortTypeName ( int portType )  
  115.     {  
  116.         switch ( portType )  
  117.         {  
  118.             case CommPortIdentifier.PORT_I2C:  
  119.                 return "I2C";  
  120.             case CommPortIdentifier.PORT_PARALLEL:  
  121.                 return "Parallel";  
  122.             case CommPortIdentifier.PORT_RAW:  
  123.                 return "Raw";  
  124.             case CommPortIdentifier.PORT_RS485:  
  125.                 return "RS485";  
  126.             case CommPortIdentifier.PORT_SERIAL:  
  127.                 return "Serial";  
  128.             default:  
  129.                 return "unknown type";  
  130.         }  
  131.     }  
  132.       
  133.     public static void main ( String[] args )  
  134.     {  
  135.         listPorts();  
  136.         try  
  137.         {  
  138.             (new TwoWaySerialComm()).connect("/dev/ttyACM0");  
  139.         }  
  140.         catch ( Exception e )  
  141.         {  
  142.             e.printStackTrace();  
  143.         }  
  144.     }  
  145. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值