java 串口通信详细及简单实例
程序员文章站
2024-03-08 12:26:34
java 实现串口通信
最近做了一个与硬件相关的项目,刚开始听说用java和硬件打交道,着实下了一大跳。java也可以操作硬件?
后来接触到是用java通过串口通信控制...
java 实现串口通信
最近做了一个与硬件相关的项目,刚开始听说用java和硬件打交道,着实下了一大跳。java也可以操作硬件?
后来接触到是用java通过串口通信控制硬件感觉使用起来还不错,也很方便。
特拿出来和大家一起分享一下。
准备工作:
首先到sun官网下载一个zip包:javacomm20-win32.zip
其中重要的有这几个文件:
win32com.dll
comm.jar
javax.comm.properties
按照说明配置好环境,如下:
将win32com.dll复制到<jdk>\bin目录下;将comm.jar复制到<jdk>\lib;把 javax.comm.properties也同样拷贝到<jdk>\lib目录下。然而在真正运行使用串口包的时候,仅作这些是不够的。因 为通常当运行“java myapp”的时候,是由jre下的虚拟机启动myapp的。而我们只复制上述文件到jdk相应目录下,所以应用程序将会提示找不到串口。解决这个问题的 方法很简单,我们只须将上面提到的文件放到jre相应的目录下就可以了
到这一个可以java 串口开发环境就搭建完成了
确认本机可以使用的串口:
package test; import java.util.enumeration; import java.util.hashmap; import javax.comm.commportidentifier; import javax.comm.serialport; public class getserialports { public void listportchoices() { commportidentifier portid; enumeration en = commportidentifier.getportidentifiers(); // iterate through the ports. while (en.hasmoreelements()) { portid = (commportidentifier) en.nextelement(); if (portid.getporttype() == commportidentifier.port_serial) { system.out.println(portid.getname()); } } } public static void main(string[] args) { getserialports gsp = new getserialports(); gsp.listportchoices(); } }
打开串口,关闭串口:
package test; import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import java.util.enumeration; import java.util.hashmap; import javax.comm.commportidentifier; import javax.comm.portinuseexception; import javax.comm.serialport; import javax.comm.unsupportedcommoperationexception; public class getserialports { private commportidentifier portid; private serialport testport; private commportidentifier myport; private inputstream is; private outputstream os; public void listportchoices() { enumeration en = commportidentifier.getportidentifiers(); // iterate through the ports. while (en.hasmoreelements()) { portid = (commportidentifier) en.nextelement(); if (portid.getporttype() == commportidentifier.port_serial) { system.out.println(portid.getname()); } myport = portid;// 任意取一个串口,比如com1 } } public boolean openport() { try { testport = (serialport) myport.open("com1", 500);// 注意这里必须换成一个真实的串口 try { this.testport.setserialportparams(38400, serialport.databits_8, serialport.stopbits_1, serialport.parity_even); } catch (unsupportedcommoperationexception e) { // todo auto-generated catch block e.printstacktrace(); } try { this.testport.enablereceivetimeout(30); } catch (unsupportedcommoperationexception e) { // todo auto-generated catch block e.printstacktrace(); } this.testport.setoutputbuffersize(1024); this.testport.setinputbuffersize(1024); try { this.is = this.testport.getinputstream(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } try { this.os = this.testport.getoutputstream(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); } this.testport.notifyondataavailable(true); this.testport.notifyonoutputempty(true); this.testport.notifyonbreakinterrupt(true); // this.printerport.addeventlistener(new printportlistener(is)); system.out.println("打开com1机串口成功"); return true; } catch (portinuseexception e) { // todo auto-generated catch block e.printstacktrace(); return false; } } /** * todo 关闭端口 * * @param * @return map * @throws */ public boolean closeport() { // todo auto-generated method stub try { if (null != this.testport) { is.close(); os.close(); this.testport.close(); } system.out.println("关闭com1串口成功"); return true; } catch (exception e) { // todo auto-generated catch block // e.printstacktrace(); system.out.println("关闭com1串口失败"); return false; } } public static void main(string[] args) { getserialports gsp = new getserialports(); gsp.listportchoices(); gsp.openport(); } }
读数据:
/** * todo 接收端口數據 * * @param inputstream * @return string * @throws */ public string readdata(inputstream is) { // 读取缓冲区域 byte[] readbuffer = new byte[4096]; int readdatalength = 0; try { readdatalength = is.read(readbuffer); // for (byte b : readbuffer) { // system.out.print(b); // } // system.out.println(); } catch (ioexception e) { // todo auto-generated catch block e.printstacktrace(); return null; } // 将真实数据保存到零时数组中 byte[] readtemp = new byte[readdatalength]; for (int i = 0; i < readdatalength; i++) { readtemp[i] = readbuffer[i]; } // 将byte数组转换为16进制字符串 string stringtemp = feelthebase.bytestohexstring(readtemp); // system.out.println("指令返回值" + stringtemp); return stringtemp; }
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!