串口通信小结

我接手一个项目,要和底层的硬件进行数据传输,找了好多资料。现在共享出来

========javascript 与串口通信================================

首先需要一个控件(MSCOMM32.OCX)下载地址:http://www.800disk.com/?lcbjava

这里传送的指令的是ESC/POS指令,用来控制客户显示屏的显示。

第一步,

手工注册:

      第一:用Windows下的注册工具 regsvr32 注册 OCX控件,点击“开始”->"运行",再在中填入: 

                 Regsvr32 控件的绝对路径/Mscomm32.ocx 

     一般放在:C:/WINDOWS/system32下

 

      第二:在注册表中建一个主键:先点击“开始”,"运行",在在其中输入 regedit  命令打开注册表,找到

         HKEY_CLASSES_ROOT/Licenses,再在其中添加主鍵:

            4250E830-6AC2-11cf-8ADB-00AA00C00905

     并设其值: kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun

第二步,编写JSP页面和JavaScript代码:
<SCRIPT   ID=clientEventHandlersJS   LANGUAGE=javascript>   
  <!--   
  function   MSComm1_OnComm()     
  {   
    var   len=0; 
     window.alert("happy");  
    if(MSComm1.CommEvent==1)//发送事件
  {   
        window.alert("ok");//发送成功
  }   
    
  document.execCommand('Refresh');//刷新页面
  
  return   false;   
 }   
 -->   
  </SCRIPT>  
   
  <SCRIPT   LANGUAGE=javascript   FOR=MSComm1   EVENT=OnComm>   
  <!--  
  // MSComm1控件每遇到OnComm事件就调用MSComm1_OnComm()函数
          MSComm1_OnComm();
   -->   
  </SCRIPT>   
  <script   language="JavaScript"   type="text/JavaScript">   
  <!-- 
   var countDown = 1;
  //答应端口并传输数据  
  function   OpenPort()   
  {   
  
   if(MSComm1.PortOpen==false)   
      {   
       MSComm1.PortOpen=true;   
  var k = form1.txtReceive.value;
  var len = k.length;
 var num;
//因为客户显示屏只能显示8为数据
 if(len < 1){
  form1.txtReceive.value = "";
   num = '00000000';
   window.alert("你还没有输入数据");
 }
  if(len == 4){
     num = '0000'+k;
  }
  if(len == 5){
    num = '000'+k;
  }
  if(len == 6){
  num = '00'+k;
  }
  if(len == 7){
  num = '0'+k;
  }
  if(len == 8){
    num = k;
  }
  if(len > 8){
  num = '00000000';
  window.alert("你输入 数据太大,不能正常显示");
  }
  if(len== 3){
    num = '00000'+k;
  }
  if(len == 2){
    num = '000000'+k;
  }
  if(len == 1){
   num = '0000000'+k;
  }
       MSComm1.Output='ESC Q A'+num+'CR' ;//传送数据(ESC/POS)
        MSComm1.OutBufferCount = '0';
       MSComm1.PortOpen=false;
    }   
    else   
    {   
     MSComm1.PortOpen=false;
     window.alert   ("被用");
     if(MSComm1.PortOpen==false)   
      {   
       MSComm1.PortOpen=true;   
  var k = form1.txtReceive.value;
       MSComm1.Output='ESC Q A'+k+'CR' ;//传送数据
       MSComm1.OutBufferCount = '0';
       MSComm1.PortOpen=false;
    }     
   } 
    countDown = 0;
  }  
  function regMoney(){
     document.getElementById("time").innerText=countDown;
   if( countDown >=5){
          if(MSComm1.PortOpen==false)   
            {   
              MSComm1.PortOpen=true;   
         var num = '00000000';
     MSComm1.Output='ESC Q A'+num+'CR' ;//传送数据
     MSComm1.OutBufferCount = '0';
     MSComm1.PortOpen=false;
   }
   countDown = 0;
   }
   countDown = countDown + 1;
   } 
  setInterval("regMoney()",1000);
  -->  
  </script>   
  <script   language="JavaScript"   type="text/JavaScript">   
  <!-- 
 function clsPort(){//清屏
       MSComm1.PortOpen=true;   
        var s = '0 CH';
  for(var i=0;i<9;i++){
  MSComm1.Output=s;//需要传送清屏命令
  }
       MSComm1.PortOpen=false; 
  }   
  
  function rePort(){//初始化
   if(MSComm1.PortOpen==false)   
    {   
       MSComm1.PortOpen=true;   
       MSComm1.Output='ESC@ 1BH 40H' ;
       MSComm1.PortOpen= false;   
       
   }
  }
  //灯的控制
  function getled(){
   MSComm1.PortOpen = true;
   MSComm1.Output='ESC s3 32H' ;
   MSComm1.PortOpen = false;
  
  }
    function getdled(){
   MSComm1.PortOpen = true;
   MSComm1.Output='ESC s1 31H' ;
   MSComm1.PortOpen = false;
  
  }
    function getsled(){
   MSComm1.PortOpen = true;
   MSComm1.Output='ESC s3 33H' ;
   MSComm1.PortOpen = false;
  
  }
    function getzled(){
   MSComm1.PortOpen = true;
   MSComm1.Output='ESC s4 34H' ;
   MSComm1.PortOpen = false;
  
  }
  function clsled(){
   MSComm1.PortOpen = true;
   MSComm1.Output='ESC s1 30H' ;
   MSComm1.PortOpen = false;
  
  }
  -->  
 
  </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="512">   
     <PARAM   NAME="InputLen"   VALUE="8">   
     <PARAM   NAME="NullDiscard"   VALUE="0">   
     <PARAM   NAME="OutBufferSize"   VALUE="512">   
     <PARAM   NAME="ParityReplace"   VALUE="?">   
     <PARAM   NAME="RThreshold"   VALUE="8">   
     <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="2400">   
     <PARAM   NAME="Settings"   VALUE="2400,N,8,1"> 
  </OBJECT>   
  <body> 
    
  <form name="form1">   
   <input   type="button"   name="sub"   value="提交"   onClick="OpenPort()"> 
   <input   type="text"   name="txtReceive"   value="">  <br>  
   <input type="button" name="res" value="清屏" onClick="clsPort()">
      <input type="button" name="resig" value="初始化" onClick="rePort()">
       <input type="button" name="resi1" value="總計灯" onClick="getled()">
       <input type="button" name="resi2" value="單價灯" onClick="getdled()">
       <input type="button" name="resi3" value="收款灯" onClick="getsled()">
  <input type="button" name="resi4" value="找零灯" onClick="getzled()">
        <input type="button" name="resipp" value="灯灭" onClick="clsled()">
        <input type="text" name="time" id="time" value="">
  </form>   
</body>   
</html>
=======JAVA 串口通信===============================================================
import java.applet.Applet;
import java.awt.Graphics;
import java.io.*;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import javax.comm.*;
import netscape.javascript.JSObject;
public class OpenCommLpt extends Applet {
private String portName = "";
private int x = 10;
private int y = 20;
static { System.setSecurityManager(null); }//不使用安全管理器 网管u家u.bitscn@com 
//Caught java.lang.NullPointerException: name can't be null while loading driver com.sun.comm.Win32Driver
//如果没有static { System.setSecurityManager(null); }就会包上面的错,为什么,我不知道,请知道的指点
public void init() {
// Put your code here
}
public void start() {
try {
//applet 调用 javascript函数
JSObject.getWindow (this).eval ("javascript:getFocus()") ; 
}catch (Exception ex) {
}
}
public void paint(Graphics  g){
try{
g.drawString(portName, x, y);
}catch(Exception e){
g.drawString("123", x, y);
}
}
/*發送數據*/
public void sendMesNum(String num){
listPortChoices("ESC Q A "+num+" CR");
}
public  void listPortChoices(String num) {  
       CommPortIdentifier portId;  
       CommPort serialPort = null;
       OutputStream outputStream = null;
       String messageString = num;
//得到说有的端口
       Enumeration en = CommPortIdentifier.getPortIdentifiers();   
       while (en.hasMoreElements()) {  
        try{
           portId = (CommPortIdentifier) en.nextElement();  
          // portName += portId.getName();
          // repaint();
           if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                 //要串口
            if (portId.getName().equals("COM1")) {
//指明com1端口
              // if (portId.getName().equals("/dev/term/a")) {
                   try {
//打开端口
                       serialPort = (SerialPort)
                           portId.open("SimpleWriteApp", 2000);
                   } catch (PortInUseException e) {
                    portName ="端口占用";
                    repaint();
                   }
                   try {
//得到输出流
                       outputStream = serialPort.getOutputStream();
                   } catch (IOException e) {}
                   try {
//设置串口
                       ((SerialPort) serialPort).setSerialPortParams(2400,
                           SerialPort.DATABITS_8,
                           SerialPort.STOPBITS_1,
                           SerialPort.PARITY_NONE);
                   } catch (UnsupportedCommOperationException e) {}
                   try {
//输出数据到串口
                    outputStream.write(messageString.getBytes());
                   } catch (IOException e) {}
                   //关闭输出流 
  outputStream.close();
                  //断开端口占用
  serialPort.close();
               }
           }
        }catch(Exception e){
       
        }
       }  
   }  
//并口
public int openBox(){
int k =1;
try {
PrintWriter pw = null;
try {
//开钱箱指令
FileWriter fw = new FileWriter("LPT1:");
pw = new PrintWriter(fw);
char[] c = {27,'p',0,60,240}; 
pw.write(c); 
           pw.flush();
           pw.close();
} catch (IOException e1) {
 k =0;
}
} catch (Exception e){
k =0;
return k;
}
}
================================================================
需要用到的javacomm20-win32.jar 解压里面有三个文件
comm.jar//复制到jdk下面jdk1.6.0_10/jre/lib/ext/里面
javax.comm.properties//复制到/jdk1.6.0_10/jre/lib/里面
win32com.dll//复制到/jdk1.6.0_10/jre/bin/里面
applet  还需要提示权限,

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值