浏览 12169 次
锁定老帖子 主题:JavaScript 扫描枪应用(一)
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (9)
|
|
---|---|
作者 | 正文 |
发表时间:2010-04-12
最后修改:2010-04-14
com.js //com.js /** * 初始化MSComm1对象,并打开串口 */ function initMSComm(){ document.write("<OBJECT id=MSComm1 CLASSID=\"clsid:648A5600-2C6E-101B-82B6-000000000014\" codebase=\"MSCOMM32.OCX\" type=\"application/x-oleobject\" style=\"width:100px;height:30px\" >"); document.write("<PARAM NAME=\"CommPort\" VALUE=\"1\"/> "); document.write("<PARAM NAME=\"DataBits\" VALUE=\"8\"/> "); document.write("<PARAM NAME=\"StopBits\" VALUE=\"1\"/>"); document.write("<PARAM NAME=\"BaudRate\" VALUE=\"9600\"/>"); document.write("<PARAM NAME=\"Settings\" VALUE=\"9600,N,8,1\"/>"); document.write("<PARAM NAME=\"RTSEnable\" VALUE=\"1\"/>"); document.write("<PARAM NAME=\"DTREnable\" VALUE=\"1\"/>"); document.write("<PARAM NAME=\"Handshaking\" VALUE=\"0\"/>"); document.write("<PARAM NAME=\"NullDiscard\" VALUE=\"0\"/> "); document.write("<PARAM NAME=\"ParityReplace\" VALUE=\"?\"/>"); document.write("<PARAM NAME=\"EOFEnable\" VALUE=\"0\"/>"); document.write("<PARAM NAME=\"InputMode\" VALUE=\"0\"/>"); document.write("<PARAM NAME=\"InBufferSize\" VALUE=\"1024\"/>"); document.write("<PARAM NAME=\"InputLen\" VALUE=\"1\"/>"); document.write("<PARAM NAME=\"OutBufferSize\" VALUE=\"512\"/>"); document.write("<PARAM NAME=\"SThreshold\" VALUE=\"0\"/>"); document.write("<PARAM NAME=\"RThreshold\" VALUE=\"1\"/>"); document.write("</OBJECT>"); if(MSComm1.PortOpen==false){ try{ MSComm1.PortOpen=true; }catch(ex){ alert("com1端口打开失败:"+ex.message); } } } var mscomm_scan_value = ""; // 串口响应事件 function MSComm1_OnComm(callBackFunction){ switch(MSComm1.CommEvent){ case 2: //接收事件 if(mscomm_scan_value == "") { mscomm_scan_value = MSComm1.Input; // 定时读取缓存信息 setTimeout("getMSCommScanValue("+callBackFunction+")",300); } break; default: alert("Event Raised!"+MSComm1.CommEvent); } } function getMSCommScanValue(callBackFunction){ // 读取缓存中剩余的信息 while(MSComm1.InBufferSize > 0) { mscomm_scan_value += MSComm1.Input; } // 执行页面传递过来的函数 callBackFunction(mscomm_scan_value); // 清空当前读取信息 mscomm_scan_value = "" } test.html <html> <head> <title>JavaScript串口测试</title> <meta http-equiv="Content-Type" content="text/html; charset=GB2312" /> <script type="text/javascript" src="com.js" > </script> <script type="text/ecmascript" for="MSComm1" event="OnComm"> // MSComm1控件每遇到 OnComm 事件就调用 MSComm1_OnComm()函数 MSComm1_OnComm(mscommCallBack) </script> <script type="text/javascript"> function mscommCallBack(scanValue) { var ewtm = document.getElementById("ewtm"); ewtm.value = scanValue; } </script> </head> <body> <script type="text/javascript" > initMSComm(); </script> 二维条码:<input type="text" id="ewtm"/> </body> </html> 得出以上结果经过几次失败尝试,尝试内容如下: 1. 将test.html文件中的 <script type="text/javascript" for="MSComm1" event="OnComm"> // MSComm1控件每遇到 OnComm 事件就调用 MSComm1_OnComm()函数 MSComm1_OnComm(mscommCallBack) </script>段代码调整为: <script type="text/javascript"> window.onload = function() { MSComm1.OnComm = MSComm1_OnComm;//采用其他方式取代闭包的实现过程 } </script> 2. 在页面head的JavaScript代码中调用initMSComm方法,将Object标签对象添加到页面的一个div中,页面提示加载ActiveX控件,但是无法绑定OnComm事件响应。 3. 当MSComm1.CommEvent为7时表示接收结束,可是只能接收到状态为2的情况,所以无法采用状态为7时的响应事件。 4. 当initMSComm方法调用时,且MSComm1.CommEvent为2的情况下,判断MSComm1.inBufferCount为0时进行事件响应,可能是缓冲等多种原因(具体不太清楚),会导致inBufferCount出现多吃0的情况,所以没有办法使用,最终采用首次执行,定时获取的方式完成缓存内容的读取操作。 我的目的是通过一次方法调用,能够实现对象的加载,响应事件的绑定,以及接收结束执行响应事件操作。由于我对JavaScript不够熟练,所以没能够达到预期的目的,如果有更好的解决办法,希望大家能够给我留言。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-04-12
现在的扫描枪不是和键盘接在一起的么?扫描一个条形码相当于输入一串数字+一回车,怎么会如此复杂?还得用ATX?
|
|
返回顶楼 | |
发表时间:2010-04-12
是好像多写了好多嗯
|
|
返回顶楼 | |
发表时间:2010-04-13
ActiveX而已,关JS啥事?
|
|
返回顶楼 | |
发表时间:2010-04-13
现在的扫描抢。接键盘接口。。不用写任何代码的啊
|
|
返回顶楼 | |
发表时间:2010-04-13
这样的方式可以用来实现程序的定制,使扫描枪只在部分的程序中使用。而且不需要单独为模拟键盘单独开一个进程。说实在的,之前我也是想模拟键盘输入,可是需求要求这样做,也没办法。所以只能在这基础上进行修改。
|
|
返回顶楼 | |
发表时间:2010-04-13
扫描枪!! 有意思!
|
|
返回顶楼 | |
发表时间:2010-04-13
ramus 写道 现在的扫描抢。接键盘接口。。不用写任何代码的啊
楼主说的是通过串口读的, 和你说的设备不一样 |
|
返回顶楼 | |
发表时间:2010-04-14
没有相关的api?
|
|
返回顶楼 | |
发表时间:2010-09-16
楼主你out了吧,这个仅仅是串口的问题,现在的扫描枪都不用写啥了
|
|
返回顶楼 | |