我接手一个项目,要和底层的硬件进行数据传输,找了好多资料。现在共享出来
========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 还需要提示权限,