国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > Java > 正文

Java實現的串口通信功能示例

2024-07-13 10:16:53
字體:
來源:轉載
供稿:網友

本文實例講述了Java實現的串口通信功能。分享給大家供大家參考,具體如下:

用Java實現串口通信(windows系統下),需要用到sun提供的串口包 javacomm20-win32.zip。其中要用到三個文件,配置如下:

1.comm.jar放置到 JAVA_HOME/jre/lib/ext;
2.win32com.dll放置到 JAVA_HOME/bin;
3.javax.comm.properties 兩個地方都要放
    jre/lib(也就是在JAVA文件夾下的jre)
   JAVA_HOME/jre/lib

說一下我應用的環境。電子秤稱重時,計算機通過串口給稱重控制顯示器發送一次命令“R”,控制顯示器則發送一次重量數據給串口,計算機再讀取將數據顯示在網頁上。這樣就構成了一個實時稱重系統。

讀寫串口的代碼如下:

package com.chengzhong.tools;import java.io.*;import javax.comm.CommPortIdentifier;import javax.comm.*;/**** This bean provides some basic functions to implement full duplex* information exchange through the serial port.**/public class SerialBean{public static String PortName;public static CommPortIdentifier portId;public static SerialPort serialPort;public static OutputStream out;public static InputStream in;//保存讀數結果public static String result="";public static int openSignal=1;/**** Constructor** @param PortID the ID of the serial to be used. 1 for COM1,* 2 for COM2, etc.**/public SerialBean(int PortID){ PortName = "COM" +PortID;}/**** This function initialize the serial port for communication. It starts a* thread which consistently monitors the serial port. Any signal captured* from the serial port is stored into a buffer area.**/public int Initialize(){  openSignal=1;  try  {  portId = CommPortIdentifier.getPortIdentifier(PortName);  try  {  serialPort = (SerialPort)  portId.open("Serial_Communication", 2000);  } catch (PortInUseException e)  {    if(!SerialBean.portId.getCurrentOwner().equals("Serial_Communication"))    {      openSignal=2; //該串口被其它程序占用    }else if(SerialBean.portId.getCurrentOwner().equals("Serial_Communication")){      openSignal=1;      return openSignal;    }   return openSignal;  }  //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)  {     openSignal=3;  //輸入輸出流錯誤     return openSignal;  }  //Initialize the communication parameters to 9600, 8, 1, none.  try  {  serialPort.setSerialPortParams(9600,  SerialPort.DATABITS_8,  SerialPort.STOPBITS_1,  SerialPort.PARITY_NONE);  } catch (UnsupportedCommOperationException e)  {     openSignal=4;  //參數不正確     return openSignal;  }  } catch (NoSuchPortException e)  {     portId=null;     openSignal=5; //沒有該串口     return openSignal;  }  // when successfully open the serial port, create a new serial buffer,  // then create a thread that consistently accepts incoming signals from  // the serial port. Incoming signals are stored in the serial buffer.// return success informationreturn openSignal;}/**** This function returns a string with a certain length from the incoming* messages.** @param Length The length of the string to be returned.**/public static void ReadPort(){  SerialBean.result="";int c;try {  if(in!=null){    while(in.available()>0)    {      c = in.read();      Character d = new Character((char) c);      SerialBean.result=SerialBean.result.concat(d.toString());    }  }} catch (IOException e) {  // TODO Auto-generated catch block  e.printStackTrace();}}/**** This function sends a message through the serial port.** @param Msg The string to be sent.**/public static void WritePort(String Msg){try{  if(out!=null){    for (int i = 0; i < Msg.length(); i++)       out.write(Msg.charAt(i));  }} catch (IOException e) {  return;}}/**** This function closes the serial port in use.**/public void ClosePort(){ serialPort.close();}}

這樣通過 SerialBean.result 就可得到讀數結果。

至于把數據放到網頁上,就要用到Ajax了,這里用到了一個Ajax框架dwr, dwr類Put.java 如下:

package com.chengzhong.dwr;import java.io.IOException;import com.chengzhong.tools.Arith;import com.chengzhong.tools.SerialBean;public class Put {  //2011.9.17  public String write(){    //發送指令R,儀器發送一次凈重數據    SerialBean.WritePort("R");    //讀取數據    SerialBean.ReadPort();    String temp=SerialBean.result.trim();  //我這里temp是形如 wn125.000kg 的數據    if(!temp.equals("") && temp.length()==11)    {       return (change(temp)).toString();    }else{      return "";    }  }  //響應開始稱重  public String startWeight(String num){     int n=Integer.parseInt(num.trim());     SerialBean SB = new SerialBean(n);     SB.Initialize();     return SerialBean.openSignal+""; //返回初始化信息  }//響應停止稱重  public void endWeight(){    try {      //關閉輸入、輸出流      SerialBean.in.close();      SerialBean.out.close();    } catch (IOException e) {      // TODO Auto-generated catch block      e.printStackTrace();    }    if(SerialBean.serialPort!=null){      SerialBean.serialPort.close(); //關閉串口    }    SerialBean.serialPort=null;    SerialBean.portId=null;    SerialBean.result="";  }  /**      * 將形如 wn125.000kg 格式的重量轉換為 125.000 (kg)(四舍五入,小數點后保留兩位)   */   public String change(String source){     Double result=0.0;     String s1=source.substring(2,9);     try{       result=Double.parseDouble(s1);       result=Arith.round(result,2);     }catch(Exception e){       e.printStackTrace();       return "";     }     return result.toString();   }}

注:Arith.java是一個java 的高精度計算文件。

package com.chengzhong.tools;import java.math.BigDecimal;/*** 由于Java的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供精* 確的浮點數運算,包括加減乘除和四舍五入。*/public class Arith{  //默認除法運算精度  private static final int DEF_DIV_SCALE = 10;  //這個類不能實例化  private Arith(){  }  /**   * 提供精確的加法運算。   * @param v1 被加數   * @param v2 加數   * @return 兩個參數的和   */  public static double add(double v1,double v2){    BigDecimal b1 = new BigDecimal(Double.toString(v1));    BigDecimal b2 = new BigDecimal(Double.toString(v2));    return b1.add(b2).doubleValue();  }  /**   * 提供精確的減法運算。   * @param v1 被減數   * @param v2 減數   * @return 兩個參數的差   */  public static double sub(double v1,double v2){    BigDecimal b1 = new BigDecimal(Double.toString(v1));    BigDecimal b2 = new BigDecimal(Double.toString(v2));    return b1.subtract(b2).doubleValue();  }  /**   * 提供精確的乘法運算。   * @param v1 被乘數   * @param v2 乘數   * @return 兩個參數的積   */  public static double mul(double v1,double v2){    BigDecimal b1 = new BigDecimal(Double.toString(v1));    BigDecimal b2 = new BigDecimal(Double.toString(v2));    return b1.multiply(b2).doubleValue();  }  /**   * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到   * 小數點以后10位,以后的數字四舍五入。   * @param v1 被除數   * @param v2 除數   * @return 兩個參數的商   */  public static double div(double v1,double v2){    return div(v1,v2,DEF_DIV_SCALE);  }  /**   * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale參數指   * 定精度,以后的數字四舍五入。   * @param v1 被除數   * @param v2 除數   * @param scale 表示表示需要精確到小數點以后幾位。   * @return 兩個參數的商   */  public static double div(double v1,double v2,int scale){    if(scale<0){      throw new IllegalArgumentException(        "The scale must be a positive integer or zero");    }    BigDecimal b1 = new BigDecimal(Double.toString(v1));    BigDecimal b2 = new BigDecimal(Double.toString(v2));    return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  }  /**   * 提供精確的小數位四舍五入處理。   * @param v 需要四舍五入的數字   * @param scale 小數點后保留幾位   * @return 四舍五入后的結果   */  public static double round(double v,int scale){    if(scale<0){      throw new IllegalArgumentException(        "The scale must be a positive integer or zero");    }    BigDecimal b = new BigDecimal(Double.toString(v));    BigDecimal one = new BigDecimal("1");    return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();  }}

網頁頁面上:

<script type="text/javascript" src="/ChengZhong/dwr/engine.js"></script><script type="text/javascript" src="/ChengZhong/dwr/util.js"></script><script type='text/javascript' src='/ChengZhong/dwr/interface/ss.js' ></script><script type='text/javascript' > var ID;   function begin(){    ID=window.setInterval('get()',500); //每隔半秒自動調用 get(),取得毛重數據填入文本框中   } function get()   {    ss.write(readIt);  //調用dwr類 Put.java 中的write方法   }   function readIt(Data){    if(Data!=null && Data!="")    {      document.getElementById("mzBF").value=Data;        }   }</script>

dwr的使用就不說了

 

希望本文所述對大家java程序設計有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 温泉县| 长治市| 米易县| 桐城市| 泰来县| 灵山县| 沙田区| 安宁市| 太仓市| 沈丘县| 林甸县| 和龙市| 亚东县| 会宁县| 岑巩县| 广汉市| 桐庐县| 湘潭市| 化德县| 伊通| 岐山县| 上栗县| 资兴市| 沈阳市| 师宗县| 府谷县| 丰原市| 平阳县| 杭锦旗| 新郑市| 洞口县| 平舆县| 庆云县| 广南县| 山东省| 钦州市| 祁东县| 贵州省| 丽水市| 上蔡县| 从化市|