向串口发送数据,并获得返回值 分类: java 20...

本文介绍了一种使用Java进行串口通信的方法,并详细展示了如何通过Java代码向电路板发送指令并正确接收返回值的过程。作者分享了调试过程中的难点及解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现要求:用java代码通过串口向电路板发送指令“aa00dd0000000055”,获得返回值“AA00DD03000055”【此处注意,没有FF】,经串口调试工具测试,硬件是好的。

证明如下:

此工具为串口调试工具,用VB编写的

 

 

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个字“精简”!看网上的东西废话太多,让人郁闷。

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/configman/archive/2010/06/30/4657619.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值