May 14

Java串口通信总结

    串口通信这词儿听上去跟java似乎有点儿沾不上边儿,因为java大多是拿来做大规模企业应用的,像串口通信这种很底层的东东一般都会用比较低级别的语言来做,但最近就遇到了这么一事儿,于是google了下,没想到还真能用java做,要用到的是javax扩展类库javacomm,它是一系列的标准,该类库在sun的官网上只提供linux版本。由于我所应用的平台是win32,所以还得去其他地儿找win32的实现,找了好久终于找到了。下面对其用法做一个简要说明。

    1.首先在下载到了javacomm包后,需要将其解压,解压后需要做的就是将java扩展库安装到本地开发环境以及运行环境中。对于开发环境需要做的就是将win32com.dll复制到%jdk install dir%/bin下,然后将comm.jar和javax.comm.properties拷贝到%jdk install dir%/lib下,对于运行环境要做的就是将这些文件拷贝到相应的jre下即可。

    2.javacomm API

    其API相当简单,下面看如下代码
   CommPortIdentifier serialPortId = CommPortIdentifier.getPortIdentifier(portName);
   log.info(“open serial port COM1 …”);
  SerialPort  port = (SerialPort) serialPortId.open(appName, timeout);
   log.info(“serial port COM1 configuration : ” + baudrate + ” , ” + dataBits + ” , ” + stopBits + ” , ” + parity);
   port.setSerialPortParams(baudrate, dataBits,stopBits, parity);
   port.enableReceiveTimeout(IOTIMEOUT);
   OutputStream out = port.getOutputStream();
   InputStream in = port.getInputStream();
   Request req = Request.getInstance();
   req.setIn(in);
   req.setOut(out);

    第一行取得一个名为portName的串口描述(看这个用法,这个地方有点儿像是单例跟工厂模式)。然后从串口描述中打开串口得到一个串口对象,注意这个地方的timeout参数是用来设置打开串口的超时时间,往后看可以看到还有一个receiveTimeout的设置,这个设置害我冥思苦想了好长时间。一开始没有注意到打开串口时可以设置这个timeout时间,使用的是一个单appName参数的方法,结果后来出现无法设置io超时时间的问题,而java API中也没有提供io超时时间的方法,最后终于一天晚上在给我的她打完电话后发现了这个苦苦期盼了好久的方法,问题迎刃而解了。之后就是设置通信的一些参数诸如波特率,数据位,停止位,校验方式等。然后就可以从串口中得到输入输出流了,这个地方要注意的是串口通信是全双工的,输入流跟输出流相互没有什么关系。