實現要求:用java代碼通過串口向電路板發送指令“aa00dd0000000055”,獲得傳回值“AA00DD03000055”【此處注意,沒有FF】,經串口調試工具測試,硬體是好的。
證明如下:
java實現其功能代碼如下:
package com.main2;</p><p>import gnu.io.CommPortIdentifier;<br />import gnu.io.SerialPort;<br />import gnu.io.SerialPortEvent;<br />import gnu.io.SerialPortEventListener;</p><p>import java.io.ByteArrayOutputStream;<br />import java.io.InputStream;<br />import java.io.OutputStream;<br />import java.util.Enumeration;</p><p>public class Test extends Thread implements SerialPortEventListener {<br />static Enumeration portList;<br />static CommPortIdentifier portId;<br />static InputStream inputStream;<br />static OutputStream outputStream;<br />static SerialPort serialPort;<br />static int count = 0;</p><p>public static void main(String[] args) {<br />portList = CommPortIdentifier.getPortIdentifiers();<br />while (portList.hasMoreElements()) {<br />portId = (CommPortIdentifier) portList.nextElement();<br />if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {<br />if (portId.getName().equals("COM3")) {<br />Test test = new Test();<br />}<br />}<br />}<br />}</p><p>public Test() {<br />try {<br />//開啟通訊<br />serialPort = (SerialPort) portId.open("ReadCommApp", 2000);<br />serialPort.setRTS(false);//此步驟可以省略,猜測預設情況即是false</p><p>serialPort.setSerialPortParams(2400, SerialPort.DATABITS_8,SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);</p><p>byte[] bt = new byte[]{(byte)0xaa,(byte)0x00,(byte)0xdd,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x00,(byte)0x55};</p><p>outputStream = serialPort.getOutputStream();<br />outputStream.write(bt);<br />outputStream.flush();<br />outputStream.close();<br />Thread.sleep(200); //50~~1400</p><p>serialPort.setRTS(true);<br />inputStream = serialPort.getInputStream();</p><p>serialPort.addEventListener(this);<br />serialPort.notifyOnDataAvailable(true);<br />} catch (Exception e) {<br />e.printStackTrace();<br />}<br />}</p><p>public void serialEvent(SerialPortEvent event) {<br />try{<br />if (event.getEventType() == event.DATA_AVAILABLE){<br />ByteArrayOutputStream bos = new ByteArrayOutputStream();<br />int ch;<br />while((ch=inputStream.read()) != -1){<br />count++;<br />if(count>2){<br />bos.write(ch);<br />}</p><p>}<br />byte[] bt = bos.toByteArray();<br />for(byte b : bt){<br />System.out.print("b="+b+"/t");//b=-86 b=0 b=-35b=3 b=0 b=0 b=85 b=85<br />}<br />bos.close();<br />}<br />}catch(Exception e){<br />e.printStackTrace();<br />}<br />}<br />}
這段破代碼搞了我很長時間,一直沒有成功擷取傳回值,差點要了我的命。但是現在我的命保住了。呵呵。終於獲得了正確的傳回值。返回結果為: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;<br />System.out.println(num1+"的十六進位:"+Integer.toHexString(num1)+ "/n" +<br /> num2+"的十六進位:"+Integer.toHexString(num2)+ "/n" +<br /> num3+"的十六進位:"+Integer.toHexString(num3)+ "/n" +<br /> num4+"的十六進位:"+Integer.toHexString(num4)+ "/n" +<br /> 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一下:我還是喜歡My Code,原因2個字“精簡”!看網上的東西廢話太多,讓人鬱悶。