实现要求:用java代码通过串口向电路板发送指令“aa00dd0000000055”,获得返回值“AA00DD03000055”【此处注意,没有FF】,经串口调试工具测试,硬件是好的。
证明如下:
java实现其功能代码如下:
package com.main2; import gnu.io.CommPortIdentifier; import gnu.io.SerialPort; import gnu.io.SerialPortEvent; import gnu.io.SerialPortEventListener; import java.io.ByteArrayOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.Enumeration; public class Test extends Thread implements SerialPortEventListener { static Enumeration portList; static CommPortIdentifier portId; static InputStream inputStream; static OutputStream outputStream; static SerialPort serialPort; static int count = 0; public static void main(String[] args) { portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals("COM3")) { Test test = new Test(); } } } } public Test() { try { //打开通讯 serialPort = (SerialPort) portId.open("ReadCommApp", 2000); serialPort.setRTS(false);//此步骤可以省略,猜测默认情况即是false serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); byte[] bt = new byte[]{(byte)0xaa,(byte)0x00,(byte)0xdd,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x55}; outputStream = serialPort.getOutputStream(); outputStream.write(bt); outputStream.flush(); outputStream.close(); Thread.sleep(200); //50~~1400 serialPort.setRTS(true); inputStream = serialPort.getInputStream(); serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); } catch (Exception e) { e.printStackTrace(); } } public void serialEvent(SerialPortEvent event) { try{ if (event.getEventType() == event.DATA_AVAILABLE){ ByteArrayOutputStream bos = new ByteArrayOutputStream(); int ch; while((ch=inputStream.read()) != -1){ count++; if(count>2){ bos.write(ch); } } byte[] bt = bos.toByteArray(); for(byte b : bt){ System.out.print("b="+b+"/t");//b=-86 b=0 b=-35 b=3 b=0 b=0 b=85 b=85 } bos.close(); } }catch(Exception e){ e.printStackTrace(); } } }
这段破代码搞了我很长时间,一直没有成功获取返回值,差点要了我的命。但是现在我的命保住了。呵呵。终于获得了正确的返回值。返回结果为:b=-86 b=0 b=-35 b=3 b=0 b=0 b=85 b=85。
为了测试这段数字的十六进制形式是否跟上面的串口调试工具得到的结果一样,将这段数字转化为十六进制,代码如下:int num1 = -86,num2=0,num3=-35,num4=3,num5=85; System.out.println(num1+"的十六进制:"+Integer.toHexString(num1)+ "/n" + num2+"的十六进制:"+Integer.toHexString(num2)+ "/n" + num3+"的十六进制:"+Integer.toHexString(num3)+ "/n" + num4+"的十六进制:"+Integer.toHexString(num4)+ "/n" + num5+"的十六进制:"+Integer.toHexString(num5));
结果为:
-86的十六进制:ffffffaa
0的十六进制:0
-35的十六进制:ffffffdd
3的十六进制:3
85的十六进制:55
为了得到只有2位的表示形式,自己判断一下就行了,这里就不介绍了。
PS:
1:以前的程序错在没有写监听事件。
2:以前的程序在获得返回值后将serialPort端口关闭了【这个其实我想不通为什么不能关闭,我觉得应该关闭】
3:获得portId是不能使用简写,即portId = CommPortIdentifier.getPortIdentifier("COM3");这个是让人比较来火的,居然不能写成简写形式,NND,真晕!
再PS一下:我还是喜欢我的代码,原因2个字“精简”!看网上的东西废话太多,让人郁闷。