方法如下:
新建eclipse工程,添加comm.jar或者RXTXcomm.jar包。因为javacomm20-win32.zip包里有样例SimpleRead.java,可以通过这个例子测试串口是否正确。
接收数据正确后,根据传送接收双方的协议,采用CRC循环校验,根据传输的一方的校验函数判定是否是正确传输。
把正确结束的数据解析,查看自己指定的通讯规则,然后解析。
插入数据库,jdbc插入。
数据统计,定时统计每小时,每天,每月,每年的平均值,采用quartz服务来实现。
建立web工程,采用hibernate3,spring3,dwr技术把数据库数据动态显示,图表采用jfreechart,以及AJAX的运用
java优点:
java是纯面向对象编程的语言;
平台无关性 (一次编译,到处运行;Write Once,Run Anywhere);
java提供了许多内置的类库,通过这些类库,简化了开发人员的设计工作,同时缩短了项目开发时间;
提供了对Web应用开发的支持,例如,Applet,Servlet,和JSP可以用来开发Web应用程序,,Socket,RMI可以用来开发分布式应用程序的类库;
去除了c++中难以理解,容易混淆的特性(如c++中的多继承,头文件,指针,结构,单元,运算符重载,虚拟基础类,使得程序更加严谨,整洁。
也不是特别麻烦,你先要清楚串口和服务器用的什么协议,假设串口用232,服务器采用TCP,那么你需要做的是建立一个客户端的发送模块,和一个串口的操作模块(结合必须要用到多线程,以队列或者委托来做数据交换)在测试之前一定要保证串口和客户端发送接收是ok的才能做结合功能。因为你串口已经做好了,那你需要的是将采集到的数据(字符串)保存到数组中,然后创建一个指向数组的指针p,然后在客户端模块里,将发送的数据写成&p。建议先将数据转16进制发,应该没毛病。
可以,使用comm,jarclass 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 = 5i <10i++) {
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 (UnsupportedCommOperationException 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/htmlcharset=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 = 5i <10i++) {
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 = 0i <leni++) {
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 = 0i <bArray.lengthi++) {
sTemp = Integer.toHexString(bArray[i]).toUpperCase()
}
return sb.toString()
}
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)