求教: java串口通信

dingfengwei 2012-12-06 11:19:54
在用java进行串口通信操作时遇到下面问题
Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path
Caught java.lang.UnsatisfiedLinkError: com.sun.comm.SolarisDriver.readRegistrySerial(Ljava/util/Vector;Ljava/lang/String;)I while loading driver com.sun.comm.SolarisDriver
Error loading SolarisSerial: java.lang.UnsatisfiedLinkError: no SolarisSerialParallel in java.library.path
Caught java.lang.UnsatisfiedLinkError: com.sun.comm.SolarisDriver.readRegistrySerial(Ljava/util/Vector;Ljava/lang/String;)I while loading driver com.sun.comm.SolarisDriver

怎么解决?这三个文件怎么配置(win32com.dll comm.jar javax.comm.properties)
我java的安装路径D:\Program Files\Java Java下有两个文件夹

我的环境变量
CLASSPATH=.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%tomcat_home%\lib\servlet-api.jar;%JAVA_HOME%\jre\lib\ext\comm.jar
JAVA_HOME=D:\Program Files\Java\jdk1.6.0_10
PATH=%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
...全文
440 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jane_zxq 2014-06-20
  • 打赏
  • 举报
回复
楼主我想问一下,我也是运行了SimpleRead,但是compile的时候是对的,每次运行都会出现
Welcome to DrJava. Working directory is C:\commapi\samples\Simple
> run SimpleRead
Static Error: Undefined class 'SimpleRead', 并且跳出提示框
>
dingfengwei 2013-01-10
  • 打赏
  • 举报
回复
引用 19 楼 zhouyusunquan 的回复:
引用 17 楼 dingfengwei 的回复:不好意思 现在才回 还是不行 那三个文件的配置还是不管用 照着我的做,怎么不行了
我知道了 我用的是myeclipse自带的jre 我用RXTXcomm.jar试了下 可以了 不过还是谢谢你啊
dingfengwei 2013-01-09
  • 打赏
  • 举报
回复
引用 16 楼 zhouyusunquan 的回复:
你也在搞串口通信,首先下载Configure Virtual Serial Port Driver,和一个sscom32工具 /** * 扫描枪串口的操作 * * @version 1.0 */ public class ScanCommProc extends Thread { CommPortIdentifier portId; S……
还是不行哇
dingfengwei 2013-01-09
  • 打赏
  • 举报
回复
不好意思 现在才回 还是不行 那三个文件的配置还是不管用
zhouyusunquan 2013-01-09
  • 打赏
  • 举报
回复
引用 17 楼 dingfengwei 的回复:
不好意思 现在才回 还是不行 那三个文件的配置还是不管用
照着我的做,怎么不行了
dingfengwei 2012-12-24
  • 打赏
  • 举报
回复
总是出现这个错误啊
zhouyusunquan 2012-12-24
  • 打赏
  • 举报
回复
你也在搞串口通信,首先下载Configure Virtual Serial Port Driver,和一个sscom32工具 /** * 扫描枪串口的操作 * * @version 1.0 */ public class ScanCommProc extends Thread { CommPortIdentifier portId; SerialPort serialPort; public InputStream in; public OutputStream out; String content = ""; MainFrame mf; public ScanCommProc() { } public ScanCommProc(MainFrame mf) { this.mf = mf; } /** * 串口初始化 * * @return 返回1 初始化串口成功, -1失败 */ public int Initialize() { try { String comm = PropertiesUtil.getStrValue("scanCom").trim(); String scanBtl = PropertiesUtil.getStrValue("scanBtl").trim(); comm = "COM" + comm; System.out.println("scanCom=" + comm); portId = CommPortIdentifier.getPortIdentifier(comm); serialPort = (SerialPort) portId.open("scanCommPort", 3000); in = serialPort.getInputStream(); out = serialPort.getOutputStream(); serialPort.setSerialPortParams(Integer.parseInt(scanBtl), SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); return 1; } catch (Exception e) { e.printStackTrace(); return -1; } } /** * 从串口中取数据 * * @return */ public String readPort() { try { String retstr = ""; int c = 0; byte[] tmp = new byte[2048]; c = in.read(tmp); String d = new String(tmp, 0, c); retstr = retstr.concat(d); return retstr; } catch (Exception e) { e.printStackTrace(); return ""; } } /** * 往串口发数据 * * @param Msg */ public void WritePort(String msg) { int c; try { out.write(0x01); out.write(0x02); out.write(0x01); out.write(0x04); char[] msgchars = msg.toCharArray(); out.write(msg.getBytes()); out.write(0x01); out.write(0x03); } catch (IOException e) { e.printStackTrace(); } } public synchronized void putString(String d) { String retstr = ""; content = content.concat(d); } public String getContent() { return content; } /** * 关闭串口 */ public void closePort() { serialPort.close(); } } 然后把win32com.dll拷贝到system32下和jdk/bin目录下 把javax.comm.properties拷贝到jdk1.6.0_32\jre\lib\ext,jdk1.6.0_32\jre\lib,jdk1.6.0_32\lib 然后你模拟建立两个串口,通过一个串口发送数据,用sscom32查看你接收到的数据,然后通过sscom32发送数据,看你收到的返回数据
speeder 2012-12-19
  • 打赏
  • 举报
回复
看到了,有问题吗?你想做成啥样的?
speeder 2012-12-19
  • 打赏
  • 举报
回复
看不到啥啊?
speeder 2012-12-19
  • 打赏
  • 举报
回复
import java.util.*; import javax.comm.*; public class PortTest { static CommPortIdentifier portId; static Enumeration portList; public static void main(String[] args){ portList=CommPortIdentifier.getPortIdentifiers(); while(portList.hasMoreElements()) { portId=(CommPortIdentifier)portList.nextElement();//强制转换为通信端口类型。 if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL)//端口为串口类型 { System.out.println(portId.getName()); } } } }
dingfengwei 2012-12-14
  • 打赏
  • 举报
回复
谢谢大家 我就是在myeclipse中编了个串口测试程序 这是目录

运行结果
刷新会出现这个
speeder 2012-12-08
  • 打赏
  • 举报
回复
架构是B/S的还是c/s的?我用eclipse试过串口程序,就用上面的方法,没问题啊。 能详细说一下你怎么用的吗。
speeder 2012-12-07
  • 打赏
  • 举报
回复
光复制到文件目录下不管用。 还需要在你的程序中引入相应的包。参考上面的读串口的例子。
钓鱼君 2012-12-07
  • 打赏
  • 举报
回复
过来学习。
子晓聊技术 2012-12-07
  • 打赏
  • 举报
回复
针对你这个问题,原因可能是你的代码使用的是myeclipse自带的jre,当然找不到driver了,你需要把相应的dll以及properties文件放到myclipse的jre下
子晓聊技术 2012-12-07
  • 打赏
  • 举报
回复
java串口通信我以前搞过,建议你不要用comm,使用RXTXcomm.jar比较好。这是我写的一篇关于串口通讯的文章,你可以参考一下 http://xiaoliouc.iteye.com/admin/blogs/1638730
dingfengwei 2012-12-07
  • 打赏
  • 举报
回复
引入了 我用的是myeclipse开发环境 不引入包在编程时就会提示错误 可是在运行时出现Caught java.lang.ClassNotFoundException: com.sun.comm.Win32Driver while loading driver com.sun.comm.Win32Driver
dingfengwei 2012-12-06
  • 打赏
  • 举报
回复
我把那三个文件按你说的方式复制到指定的文件目录下 还是出现错误Caught java.lang.ClassNotFoundException: com.sun.comm.Win32Driver while loading driver com.sun.comm.Win32Driver
speeder 2012-12-06
  • 打赏
  • 举报
回复
//串口事件 public void serialEvent(SerialPortEvent event) { switch(event.getEventType()) { case SerialPortEvent.BI:/*Break interrupt,通讯中断*/ case SerialPortEvent.OE:/*Overrun error,溢位错误*/ case SerialPortEvent.FE:/*Framing error,传帧错误*/ case SerialPortEvent.PE:/*Parity error,校验错误*/ case SerialPortEvent.CD:/*Carrier detect,载波检测*/ case SerialPortEvent.CTS:/*Clear to send,清除发送*/ case SerialPortEvent.DSR:/*Data set ready,数据设备就绪*/ case SerialPortEvent.RI:/*Ring indicator,响铃指示*/ case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Output buffer is empty,输出缓冲区清空*/ break; case SerialPortEvent.DATA_AVAILABLE:/*Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端*/ byte[] readBuffer = new byte[20]; try { while (inputStream.available() > 0) { int numBytes = inputStream.read(readBuffer); } System.out.print(new String(readBuffer)); } catch (IOException e) {} break; } } }
speeder 2012-12-06
  • 打赏
  • 举报
回复
读串口的例程 import java.io.*; import java.util.*; import javax.comm.*; public class SimpleRead implements Runnable, SerialPortEventListener { static CommPortIdentifier portId; static Enumeration portList;//枚举类 InputStream inputStream; SerialPort serialPort; Thread readThread; public static void main(String[] args) { portList = CommPortIdentifier.getPortIdentifiers();/*不带参数的getPortIdentifiers方法获得一个枚举对象,该对象又包含了系统中管理每个端口的CommPortIdentifier对象。注意这里的端口不仅仅是指串口,也包括并口。这个方法还可以带参数。getPortIdentifiers(CommPort)获得与已经被应用程序打开的端口相对应的CommPortIdentifier对象。getPortIdentifier(String portName)获取指定端口名(比如“COM1”)的CommPortIdentifier对象。*/ while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)/*getPortType方法返回端口类型*/ { // if (portId.getName().equals("COM1"))/* 找Windows下的第一个串口*/ { if (portId.getName().equals("/dev/term/a"))/*找Unix-like系统下的第一个串口*/ { SimpleRead reader = new SimpleRead(); } } } } public SimpleRead() { try { serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);/* open方法打开通讯端口,获得一个CommPort对象。它使程序独占端口。如果端口正被其他应用程序占用,将使用CommPortOwnershipListener事件机制,传递一个PORT_OWNERSHIP_REQUESTED事件。每个端口都关联一个InputStream 何一个OutputStream。如果端口是用open方法打开的,那么任何的getInputStream都将返回相同的数据流对象,除非有close被调用。有两个参数,第一个为应用程序名;第二个参数是在端口打开时阻塞等待的毫秒数。*/ } catch (PortInUseException e) {} try { inputStream = serialPort.getInputStream();/*获取端口的输入流对象*/ } catch (IOException e) {} try { serialPort.addEventListener(this);/*注册一个SerialPortEventListener事件来监听串口事件*/ } catch (TooManyListenersException e) {} serialPort.notifyOnDataAvailable(true);/*数据可用*/ try { serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);/*设置串口初始化参数,依次是波特率,数据位,停止位和校验*/ } catch (UnsupportedCommOperationException e) {} readThread = new Thread(this); readThread.start(); } public void run() { try { Thread.sleep(20000); } catch (InterruptedException e) {} }
加载更多回复(1)

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧