java串口通信
① java高人指点串口通信
搜了下,都说是配置问题
一种解决方案
win32com.dll 放在 jdk\jre\bin 目录
comm.jar in 放在 jdk\jre\lib\ext目录
javax.comm.properties 放在 jdk\jre\lib目录
另外javax.comm在win下不再维护,可以考虑配合使用rxtx
Sun no longer offer's the Windows platform binaries of javax.comm, however javax.comm 2.0.3 can be used for the Windows platform, by using it in conjunction with the Win32 implementation layer provided by the RxTx project. To use that, download javax.comm for the 'generic' platform (which provides the front-end javax.comm API only, without platform specific back-end implementations bundled). Then acquire the Windows binary implementation rxtx-2.0.7pre1 from http://www.rxtx.org(搬到http://users.frii.com/jarvi/rxtx/index.html了).
② java串口,读取和发送数据
publicstaticvoidprocess(){
try{
EnumerationportList=CommPortIdentifier.getPortIdentifiers();
while(portList.hasMoreElements())
{
CommPortIdentifierportId=(CommPortIdentifier)portList.nextElement();
if(portId.getPortType()==CommPortIdentifier.PORT_SERIAL)//如果端口类型是串口则判断名称
{
if(portId.getName().equals("COM1")){//如果是COM1端口则退出循环
break;
}else{
portId=null;
}
}
}
SerialPortserialPort=(SerialPort)portId.open("Serial_Communication",1000);//打开串口的超时时间为1000ms
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);//设置串口速率为9600,数据位8位,停止位1们,奇偶校验无
InputStreamin=serialPort.getInputStream();//得到输入流
OutputStreamout=serialPort.getOutputStream();//得到输出流
//进行输入输出操作
//操作结束后
in.close();
out.close();
serialPort.close();//关闭串口
}catch(PortInUseExceptione){
e.printStackTrace();
}catch(){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
}
③ java串口通信中怎样以十六进制数发送
做串口通讯的时候基本都是通过io流读取、输出。那么在java开发中发送数据的时候使用OutputStream,而其write()的参数是字节数组、int整形。如果使用字节数组发送的时候,通常可以直接写成out.write("1234".getBytes())。这样一来单片机读到的数据则是31 32 33 34。但是在串口发送的时候先把16进制字符串转化为byte数组在发送出来,则是发送什么读取到的就是什么。使用:out.write(HexString2Bytes("1234"));那么读取到的还是1234。16进制字符串转化为byte数组的方法为:
public static byte[] HexString2Bytes(String src) {
if (null == src || 0 == src.length()) {
return null;
}
byte[] ret = new byte[src.length() / 2];
byte[] tmp = src.getBytes();
for (int i = 0; i < (tmp.length / 2); i++) {
ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
}
return ret;
}
在用java做串口开发的时候建议使用开源的Rxtx做。效率、使用方法都要优。使用sun开源的comm个人觉得不是很便利。rxtx网上有开源实例。可以根据自己个需求进行加以修饰利用。
④ java串口通信数据丢失,怎么解决
解决办法:
1、将两台PC间波特率设置为一样的大小。
2、采取进距离传输,随着距离的增加,信息衰减率也便增加。
3、尽量采用低波特率传输,这样误码率会大大减少。
4、加入数据校验功能,在接收数据一方实现“奇偶校验法”等方法验证数据传输的完整性。
⑤ java 串口通信
这里的Byte并不是Java中八种基本类型中的byte,作为数据类型,byte是要表示负数的,但作为串口值,并不需要负数,所以这里的Byte最大值可以表示255
⑥ java实现串口通信代码
public static void process() {
try {
Enumeration portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements())
{
CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)//如果端口类型是串口则判断名称
{
if(portId.getName().equals("COM1")){//如果是COM1端口则退出循环
break;
}else{
portId=null;
}
}
}
SerialPort serialPort = (SerialPort)portId.open("Serial_Communication", 1000);//打开串口的超时时间为1000ms
serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);//设置串口速率为9600,数据位8位,停止位1们,奇偶校验无
InputStream in = serialPort.getInputStream();//得到输入流
OutputStream out = serialPort.getOutputStream();//得到输出流
//进行输入输出操作
//操作结束后
in.close();
out.close();
serialPort.close();//关闭串口
} catch (PortInUseException e) {
e.printStackTrace();
} catch ( e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
⑦ 在java的web程序中怎么使用串口通讯
最近在做java串口通讯,主要是用个人电脑通过串口从RS485读取数据,并通过crc循环冗余校验,把接收正确的数据解析,插入数据库mysql,并用SSH技术把数据库数据以表格以及图表形式显示
思路:
1.为了从RS485读取数据,由于暂时没有硬件设备,系统是win7,故采用Virtual Serial Port Drive(VSPD)这块虚拟串口软件代替。并下载sscom32.exe模拟串口通信软件。
2. 要想实现串口通信,用Java实现串口通信(windows系统下),需要用到sun提供的串javacomm20-win32.zip。其中要用到三个文件,配置如下:
comm.jar放置到 JAVA_HOME/jre/lib/ext;
win32com.dll放置到 JAVA_HOME/bin;
javax.comm.properties 两个地方都要放
jre/lib(也就是在JAVA文件夹下的jre),JAVA_HOME/jre/lib下
这个配置在我电脑上测试成功,也许不需要这样麻烦。注意的是,如果你使用myeclipse,因为它自带jre,你需要在它所在的jre相应位置放dll以及properties文件。
是不是感觉这个很麻烦,还有windows的限制。后来我们下载rxtx这款开源包代替了刚才的comm。不仅windows下可以,linux下也可以。使用方法很简单,配置如下:
RXTXcomm.jar放到JAVA_HOME/jre/lib/ext
rxtxSerial.dll放到JAVA_HOME/bin
如果你使用myeclipse工具,你需要把rxtxSerial.dll放到它自带的jre里。
3.新建eclipse工程,添加comm.jar或者RXTXcomm.jar包。因为javacomm20-win32.zip包里有样例SimpleRead.java,可以通过这个例子测试串口是否正确
4.接收数据正确后,根据传送接收双方的协议,采用CRC循环校验,根据传输的一方的校验函数判定是否是正确传输
5.把正确结束的数据解析,查看自己指定的通讯规则,然后解析
6.插入数据库,jdbc插入
7.数据统计,定时统计每小时,每天,每月,每年的平均值,采用quartz服务来实现。
8.建立web工程,采用hibernate3,spring3,dwr技术把数据库数据动态显示,图表采用jfreechart,以及AJAX的运用
⑧ 如何用java进行多串口通信
串口的话只能用JAVA调用,然后通过关闭、打开来判断。
另外Java是写不了串口的,需要C才可以
⑨ jsp,java串口通信的问题
可以,使用comm,jar
class SerialExample {
public static void main(String[] args) {
//TO DO: Add your JAVA codes here
long curTime = System.currentTimeMillis();
long serialtime = 8000;
boolean state = true;
SerialBean SB = new SerialBean(2);//设置端口号2
String Msg = "AD 01 0D";//发送命令
SB.Initialize(9600);//设置波率
SB.WritePort(Msg);//发送命令
/* for (int i = 5; i < 10; i++) {
System.out.println( SB.ReadPort(3));//设置读取个数
}
*/
String readdata = SB.ReadPort("0D",4000);//读取以OD结束的数据,4000ms没有数据就返回空
if (readdata.length() > 0) { //System.out.println(readdata.length());//如果有读到数据
System.out.println(readdata);//如果有读到数据
}
while (readdata.length() < 1 && state) {//如果没有读到数据
readdata = SB.ReadPort("0D",4000);
System.out.println(readdata);
if (System.currentTimeMillis() - curTime > serialtime) {
state = false;//设置读取错误超时
}
System.out.println("readdaa:" + state);
System.out.println(System.currentTimeMillis() - curTime);
}
if (!state) {
System.out.println("数据读取超时");
}
SB.ClosePort();//关闭连接
}
}
public class SerialBuffer {
Convents cv = new Convents();
private String Content = "";
private String CurrentMsg, TempContent;
private boolean available = false;
private int LengthNeeded = 1;
String str = "";
byte b;
/**
*
* This function returns a string with a certain length from the incoming
* messages.
*
* @param Length The length of the string to be returned.
*
*/
public synchronized String GetMsg(int Length) {
LengthNeeded = Length;
long timeout=2000;
long curtime=System.currentTimeMillis();
notifyAll();
if (LengthNeeded > Content.length()) {
available = false;
while (available == false) {
try {
if(System.currentTimeMillis()-curtime<timeout) wait();
} catch (InterruptedException e) {
}
}
}
CurrentMsg = Content.substring(0, LengthNeeded);
TempContent = Content.substring(LengthNeeded);
Content = TempContent;
LengthNeeded = 1;
notifyAll();
return CurrentMsg;
}
public synchronized String GetMsg(String endstring,long timeout) {
LengthNeeded =Content.indexOf(endstring);
notifyAll();
if (LengthNeeded < 0) {
available = false;
while (available == false) {
try {
wait(timeout);
available=true;
} catch (InterruptedException e) {
}
}
return "";
}
if (LengthNeeded > 0) {
CurrentMsg = Content.substring(0, LengthNeeded+endstring.length());
TempContent = Content.substring(LengthNeeded+endstring.length());
Content = TempContent;
}
LengthNeeded = -1;
notifyAll();
return CurrentMsg;
}
public synchronized void PutChar(int c) {
Content = Content.concat(cv.byteToHexString(c));
if (LengthNeeded < Content.length() && Content.length() > 0) {
available = true;
}
notifyAll();
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package common.serial;
/**
*
* @author Jason
*/
import java.io.*;
import java.util.*;
import javax.comm.*;
import common.code.Convents;
public class SerialBean {
Convents cv=new Convents();
String PortName = "";
CommPortIdentifier portId = null;
SerialPort serialPort = null;
OutputStream out;
InputStream in;
SerialBuffer SB;
ReadSerial RT;
int rate=9600;
String endstring ="";
long timeout=2000;
public SerialBean(int PortID) {
PortName = "COM" + PortID;
}
public int Initialize(int rate) {
int InitSuccess = 1;
int InitFail = -1;
try {
portId = CommPortIdentifier.getPortIdentifier(PortName);
try {
serialPort = (SerialPort) portId.open("Serial_Communication", 2000);
} catch (PortInUseException e) {
return InitFail;
}
//Use InputStream in to read from the serial port, and OutputStream
//out to write to the serial port.
try {
in = serialPort.getInputStream();
out = serialPort.getOutputStream();
} catch (IOException e) {
return InitFail;
}
//Initialize the communication parameters to 9600, 8, 1, none.
try {
serialPort.setSerialPortParams(rate,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch ( e) {
return InitFail;
}
} catch (NoSuchPortException e) {
return InitFail;
}
SB = new SerialBuffer();
RT = new ReadSerial(SB, in);
RT.start();
return InitSuccess;
}
public String ReadPort(int Length) {
String Msg;
Msg = SB.GetMsg(Length);
return Msg;
}
public String ReadPort(String endstring,long timeout) {
String Msg;
Msg = SB.GetMsg(endstring,timeout);
return Msg;
}
public void WritePort(String Msg) {
try {
out.write(cv.hexStringToByte(Msg));
} catch (IOException e) {
}
}
public void ClosePort() {
serialPort.close();
}
}
package common.serial;
import java.io.*;
public class ReadSerial extends Thread {
private SerialBuffer ComBuffer;
private InputStream ComPort;
char[] ch;
public ReadSerial(SerialBuffer SB, InputStream Port) {
ComBuffer = SB;
ComPort = Port;
}
@Override
public void run() {
int c;
try {
while (true) {
c=ComPort.read();
ComBuffer.PutChar(c);
}
} catch (IOException e) {
}
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package common.serial;
/**
*
* @author Administrator
*/
public class PortOpreate {
private String sendtxt="";
private String recivetxt="";
private int comid = 1;
private int comrate = 9600;
private int timeout = 4000;
private long waittime = 13000;
private String endtxt = "0D";
private boolean pstate=false;
private String massage="";
public void PortOpreate(boolean hasreturn) {
long curTime = System.currentTimeMillis();
long serialtime = getWaittime();
boolean state = true;
int t=0;
SerialBean SB = new SerialBean(getComid());//设置端口号2
t=SB.Initialize(getComrate());//设置波率
if(t>0){
SB.WritePort(getSendtxt());//发送命令
if (hasreturn) {
String readdata = SB.ReadPort(getEndtxt(), getTimeout());//读取以OD结束的数据,4000ms没有数据就返回空
if (readdata.length() > 0) { //System.out.println(readdata.length());//如果有读到数据
System.out.println(readdata);//如果有读到数据
}
while (readdata.length() < 1 && state) {//如果没有读到数据
readdata = SB.ReadPort(getEndtxt(), getTimeout());
System.out.println(readdata);
if (System.currentTimeMillis() - curTime > serialtime) {
state = false;//设置读取错误超时
}
System.out.println("readdaa:" + state);
System.out.println(System.currentTimeMillis() - curTime);
}
if (!state) {
System.out.println("数据读取超时");
setMassage("数据读取超时");
}
setRecivetxt(readdata);
setPstate(state);
}
SB.ClosePort();//关闭连接
}else{
System.out.println("端口号出现错误");
setMassage("端口号出现错误");
}
}
/**
* @return the sendtxt
*/
public String getSendtxt() {
return sendtxt;
}
/**
* @param sendtxt the sendtxt to set
*/
public void setSendtxt(String sendtxt) {
this.sendtxt = sendtxt;
}
/**
* @return the recivetxt
*/
public String getRecivetxt() {
return recivetxt;
}
/**
* @param recivetxt the recivetxt to set
*/
public void setRecivetxt(String recivetxt) {
this.recivetxt = recivetxt;
}
/**
* @return the comid
*/
public int getComid() {
return comid;
}
public void setComid(int comid) {
this.comid = comid;
}
public int getComrate() {
return comrate;
}
public void setComrate(int comrate) {
this.comrate = comrate;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public long getWaittime() {
return waittime;
}
public void setWaittime(long waittime) {
this.waittime = waittime;
}
public String getEndtxt() {
return endtxt;
}
public void setEndtxt(String endtxt) {
this.endtxt = endtxt;
}
public boolean isPstate() {
return pstate;
}
public void setPstate(boolean pstate) {
this.pstate = pstate;
}
public String getMassage() {
return massage;
}
public void setMassage(String massage) {
this.massage = massage;
}
}
package common.serial;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PortOperatorServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
try {
long curTime = System.currentTimeMillis();
long serialtime = 8000;
boolean state = true;
String Msg = "AD 01 0D";//发送命令
SerialBean SB = new SerialBean(10);//设置端口号2
SB.Initialize(9600);//设置波率
SB.WritePort(Msg);//发送命令
/* for (int i = 5; i < 10; i++) {
System.out.println( SB.ReadPort(3));//设置读取个数
}
*/
String readdata = SB.ReadPort("0D",4000);//读取以OD结束的数据
if (readdata.length() > 0) { //System.out.println(readdata.length());//如果有读到数据
System.out.println(readdata);//如果有读到数据
}
while (readdata.length() < 1 && state) {//如果没有读到数据
readdata = SB.ReadPort("0D",4000);
System.out.println(readdata);
out.println(readdata);
if (System.currentTimeMillis() - curTime > serialtime) {
state = false;//设置读取错误超时
}
System.out.println("readdaa:" + state);
System.out.println(System.currentTimeMillis() - curTime);
}
if (!state) {
System.out.println("数据读取超时");
out.println("数据读取超时");
}
SB.ClosePort();//关闭连接
} finally {
out.close();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
public String getServletInfo() {
return "Short description";
}
}
package common.code;
public final class Convents {
public final static char[] BToA = "0123456789abcdef".toCharArray();
/**
* 把16进制字符串转换成字节数组A1 01 0D
* @param hex
* @return
*/
public byte[] hexStringToByte(String hex) {
String str[] = hex.split(" ");
int len = str.length;
byte[] result = new byte[len];
char[] achar = hex.toCharArray();
for (int i = 0; i < len; i++) {
result[i] = (byte) (toByte(str[i].charAt(0)) * 16 + toByte(str[i].charAt(1)));
}
return result;
}
private static byte toByte(char c) {
byte b = (byte) ("0123456789ABCDEF".indexOf(c));
return b;
}
/**
* 把字节数组转换成16进制字符串
* @param bArray
* @return
*/
public String byteToHexString(int b){
String st="";
st=Integer.toHexString(b);
if (st.length() < 2) {
st="0"+Integer.toHexString(b).toUpperCase()+" ";
} else {
st=Integer.toHexString(b).toUpperCase()+" ";
}
return st;
}
public String bytesToHexString(byte[] bArray) {
StringBuffer sb = new StringBuffer(bArray.length);
String sTemp;
for (int i = 0; i < bArray.length; i++) {
sTemp = Integer.toHexString(bArray[i]).toUpperCase();
}
return sb.toString();
}
}
⑩ java串口通信数据缓存要怎么清空
java串口通信数据缓存要清空步骤:
找到Java的安装目录(默认为C:Program FilesJava)选择当前使用的jre版本,如果用的版本为jre5则进入jre5文件夹,如果用的版本为jre6则进入jre6文件夹。在该文件夹下进入bin文件夹。双击打开文件javacpl.exe
在常规选项中的临时Internet文件点击“设置”按钮再点击“删除文件”按钮,删除所有的临时文件。
删除完缓存之后,需要关闭所有浏览器。再次打开浏览器进入虚拟实验系统即可。