夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks
          這個是一個JAVA代碼的解決方案,但我測試后發(fā)現(xiàn)讀不到數(shù)據(jù),不知道那里有問題,現(xiàn)在還沒有解決。
          package com;    

          /*    
          程序文件名稱:ReadComm.java    
          功能:從串行口COM1中接收數(shù)據(jù)    
          */
              
          import java.awt.*;    
          import java.awt.event.*;    
          import java.io.*;    
          import java.util.*;    
          import javax.comm.*;    

          class R_Frame extends Frame implements Runnable,ActionListener,SerialPortEventListener    
              {    
          /* 檢測系統(tǒng)中可用的通訊端口類 */    
              static CommPortIdentifier portId;    
          /* Enumeration 為枚舉型類,在java.util中 */    
              static Enumeration portList;    
              InputStream inputStream;    
          /* 聲明RS-232串行端口的成員變量 */    
              SerialPort serialPort;    
              Thread readThread;    
              String str="";    
              TextField out_message=new TextField("上面文本框顯示接收到的數(shù)據(jù)");    
              TextArea in_message=new TextArea();    
              Button btnOpen=new Button("打開串口");    
          /*建立窗體*/    
              R_Frame()    
              {    
              super("串口接收數(shù)據(jù)");    
              setSize(200,200);    
              setVisible(true);    
              btnOpen.addActionListener(this);    
              add(out_message,"South");    
              add(in_message,"Center");    
              add(btnOpen,"North");    
              
                  
                  
              /*獲取系統(tǒng)中所有的通訊端口 */    
                  portList=CommPortIdentifier.getPortIdentifiers();    
                      /* 用循環(huán)結(jié)構(gòu)找出串口 */    
                  while (portList.hasMoreElements()){    
                  /*強制轉(zhuǎn)換為通訊端口類型*/    
                  portId=(CommPortIdentifier)portList.nextElement();    
                  if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){    
                      if (portId.getName().equals("COM1")) {    
                          try {    
                      serialPort = (SerialPort) portId.open("ReadComm", 2000);    
                      out_message.setText("已打開端口COM1 ,正在接收數(shù)據(jù)..... ");    
                      }    
                  catch (PortInUseException e) { }    

                  /*設(shè)置串口監(jiān)聽器*/    
                  try {    
                  serialPort.addEventListener(this);    
                  }    
                  catch (TooManyListenersException e) { }    
                  /* 偵聽到串口有數(shù)據(jù),觸發(fā)串口事件*/    
                  serialPort.notifyOnDataAvailable(true);    
                  } //if end    
                  } //if end    
                  } //while end    
                  readThread = new Thread(this);    
                  readThread.start(); //線程負(fù)責(zé)每接收一次數(shù)據(jù)休眠20秒鐘    
                  } //R_Frame() end    


              
              /*點擊按扭所觸發(fā)的事件:打開串口,并監(jiān)聽串口. */    
          public void actionPerformed(ActionEvent event)    
              {    
                  /*獲取系統(tǒng)中所有的通訊端口 */    
                  portList=CommPortIdentifier.getPortIdentifiers();    
                  /* 用循環(huán)結(jié)構(gòu)找出串口 */    
                  while (portList.hasMoreElements()){    
                  /*強制轉(zhuǎn)換為通訊端口類型*/    
                  portId=(CommPortIdentifier)portList.nextElement();    
                  if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){    
                  if (portId.getName().equals("COM1")) {    
                  try {    
                  serialPort = (SerialPort) portId.open("ReadComm", 2000);    
                  out_message.setText("已打開端口COM1 ,正在接收數(shù)據(jù)..... ");    
                  }    
                  catch (PortInUseException e) { }    

              /*設(shè)置串口監(jiān)聽器*/    
                  try {    
                  serialPort.addEventListener(this);    
                  }    
                  catch (TooManyListenersException e) { }    
              /* 偵聽到串口有數(shù)據(jù),觸發(fā)串口事件*/    
                  serialPort.notifyOnDataAvailable(true);    
                  } //if end    
                  } //if end    
                  } //while end    
                  readThread = new Thread(this);    
                  readThread.start(); //線程負(fù)責(zé)每接收一次數(shù)據(jù)休眠20秒鐘    
                  } //actionPerformed() end    

                  /*接收數(shù)據(jù)后休眠20秒鐘*/    
          public void run() {    
                  try {    
                  Thread.sleep(20000);    
                  }    
              catch (InterruptedException e) { }    
                  } //run() end    

                  /*串口監(jiān)聽器觸發(fā)的事件,設(shè)置串口通訊參數(shù),讀取數(shù)據(jù)并寫到文本區(qū)中*/    
          public void serialEvent(SerialPortEvent event) {    
              /*設(shè)置串口通訊參數(shù):波特率、數(shù)據(jù)位、停止位、奇偶校驗*/    
                  try {    
                  serialPort.setSerialPortParams(9600,    
                  SerialPort.DATABITS_8,    
                  SerialPort.STOPBITS_1,    
                  SerialPort.PARITY_NONE);    
                  }    
                  catch (UnsupportedCommOperationException e) {}    
                      byte[] readBuffer = new byte[20];    
                  try {    
                      inputStream = serialPort.getInputStream();    
                  }    
                  catch (IOException e){    
          }    
                  try {    

                  while (inputStream.available() > 0)    
                  {    
                      int numBytes = inputStream.read(readBuffer);    
                          } //while end    
                      str=new String(readBuffer);    
                  /*接收到的數(shù)據(jù)存放到文本區(qū)中*/    
                      in_message.append(str+"\n");    
                      }    
                      catch (IOException e){    
                      }    
                      } //serialEvent() end    
                  } //類R_Frame end    

                  public class ReadComm    
                  {    
          public static void main(String args[])    
                  {    
                  /* 實例化接收串口數(shù)據(jù)的窗體類 */    
                  R_Frame R_win=new R_Frame();    
                  /* 定義窗體適配器的關(guān)閉按鈕功能 */    
                  R_win.addWindowListener(new WindowAdapter()    
                  {    
                  public void windowClosing(WindowEvent e)    
                  {    
                  System.exit(0);    
                  }    
              });    
                  R_win.pack();    
              }    
          }    
           
           
           
          這個是在web頁面上的實現(xiàn),修改了下現(xiàn)在可以讀到數(shù)據(jù),但這個需要注冊MSCOMM組件,還算比較理想吧!
          <%@ page contentType="text/html; charset=gb2312" language="java"    %>    
          <html>    
          <head>    
          <title>JavaScript MSCOMM32.OCX </title>    

          <SCRIPT ID=clientEventHandlersJS LANGUAGE=javascript>    
          //重寫 mscomm 控件的唯一事件處理代碼    
          function MSComm1_OnComm()    
          {    
          var len=0;    
          if(MSComm1.CommEvent==1)//如果是發(fā)送事件    
          {    
              window.alert("請讀條碼");//這句正常,說明發(fā)送成功了    
          }    
          else if(MSComm1.CommEvent==2)//如果是接收事件    
          {    
                  document.form1.txtReceive.value=document.form1.txtReceive.value + MSComm1.Input;    
          }    

          }    
          </SCRIPT>    

          <SCRIPT LANGUAGE=javascript FOR=MSComm1 EVENT=OnComm>    
          // MSComm1控件每遇到 OnComm 事件就調(diào)用 MSComm1_OnComm()函數(shù)    
          MSComm1_OnComm()    
          </SCRIPT>    


          <script language="JavaScript" type="text/JavaScript">    
          //打開端口并發(fā)送命令程序    
          function OpenPort()    
          {    
          if(MSComm1.PortOpen==false)    
          {    
          MSComm1.PortOpen=true;    
          MSComm1.Output="R";//發(fā)送命令    
          //window.alert("成功發(fā)出命令!");
          }    
          else    
          {    
              window.alert ("已經(jīng)開始接收數(shù)據(jù)!");    
          }    
          }    
          </script>    

          </head>    
          <OBJECT CLASSID="clsid:648A5600-2C6E-101B-82B6-000000000014" id=MSComm1 codebase="MSCOMM32.OCX" type="application/x-oleobject"    
          style="LEFT: 54px; TOP: 14px" >    
          <PARAM NAME="CommPort" VALUE="1">    
          <PARAM NAME="DTREnable" VALUE="1">    
          <PARAM NAME="Handshaking" VALUE="0">    
          <PARAM NAME="InBufferSize" VALUE="1024">    
          <PARAM NAME="InputLen" VALUE="0">    
          <PARAM NAME="NullDiscard" VALUE="0">    
          <PARAM NAME="OutBufferSize" VALUE="512">    
          <PARAM NAME="ParityReplace" VALUE="?">    
          <PARAM NAME="RThreshold" VALUE="1">    
          <PARAM NAME="RTSEnable" VALUE="1">    
          <PARAM NAME="SThreshold" VALUE="2">    
          <PARAM NAME="EOFEnable" VALUE="0">    
          <PARAM NAME="InputMode" VALUE="0">    

          <PARAM NAME="DataBits" VALUE="8">    
          <PARAM NAME="StopBits" VALUE="1">    
          <PARAM NAME="BaudRate" VALUE="9600">    
          <PARAM NAME="Settings" VALUE="9600,N,8,1">    
          </OBJECT>    

          <body>    
          <form name="form1">    
          <input type="button" name="Submit" value="提交" onClick="OpenPort()">    
          <input type="text" name="txtReceive" size=50 value="">    
          </form>    
          </body>    
          </html>
          posted on 2009-10-28 16:28 HUIKK 閱讀(528) 評論(0)  編輯  收藏 所屬分類: TOOL
          主站蜘蛛池模板: 手游| 桦南县| 海南省| 嵊泗县| 鄯善县| 柳江县| 花莲市| 富裕县| 锡林郭勒盟| 海安县| 麻城市| 蓬莱市| 无棣县| 宣汉县| 会东县| 丹寨县| 麻城市| 高邮市| 禄劝| 洛浦县| 株洲市| 东台市| 阿图什市| 班玛县| 宜昌市| 鞍山市| 泾源县| 苍南县| 色达县| 星子县| 甘洛县| 沧州市| 周宁县| 凤城市| 望城县| 洪江市| 南木林县| 城步| 西城区| 安西县| 阿合奇县|