1业务场景介绍
在UI5自开发页面中获取电子秤的称重数量,电子秤连接电脑COM口,或者通过USB连接电脑。(还可以蓝牙这里不讨论,地磅和SAP GUI 也可以这样获取数据)
2实现方法
使用的是微软的ActiveX控件,JS调用MSCOMM32.dll的串口控件对串口进行控制,过ActiveX控件目前只针对IE浏览器支持较好,所以建议在IE浏览器上就行开发。
ActiveX控件是Microsoft的ActiveX技术的一部分,创建它的主要技术是Microsoft的ActiveX技术,其中主要是组件对象模型(COM),ActiveX控件等价于以前的OLE控件或OCX
3前提条件
3.1插件下载
网上搜索、下载最新版本的MSCOMM32.OCX,解压后将mscomm32.ocx文件,保存至系统目录:
C:\Windows\SysWOW64\MSCOMM32.OCX(64位)
C:\Windows\System32\MSCOMM32.OCX(32位)
3.2注册
以管理员身份运行命令提示符(win+x),执行:
regsvr32 c:\Windows\SysWOW64\mscomm32.ocx(64位)
regsvr32 c:\Windows\ System32\mscomm32.ocx(32位)
3.3修改注册表
打开注册表(开始—>运行,输入命令regedit,打开注册表),在HKEY_CLASSES_ROOT\Licenses右键,新建—>项4250E830-6AC2-11cf-8ADB-00AA00C00905
数值数据:kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun
3.4浏览器设置
在IE浏览器,internet选项中,安全选择项中的Internet和本地Internet自定义安全级别。
有关ActiveX控件的使用设置为启动或者提示。
4借助串口调试助手测试
推荐友善串口调试助手进行测试。
电子称连接电脑后,可在设备管理器中查看连接的是电脑的哪个端口,
再调试助手中设置对应的端口和参数,进行测试:
点击打开,就会接收到称重数据。
5实现过程
5.1代码实现
在view中定义一个输入框和按钮,点击按钮获取电子称上的称重数量。
<Page title="克重">
<content>
<f:Form id="SearchSCDDForm" maxContainerCols="12" editable="true">
<f:layout>
<f:ResponsiveGridLayout labelSpanL="3"
labelSpanM="3" emptySpanL="0" emptySpanM="0" columnsL="4"
columnsM="1" />
</f:layout>
<f:formContainers>
<f:FormContainer>
<f:formElements>
<f:FormElement label="称重数量">
<f:fields>
<Input id="Menge" width="8em" />
</f:fields>
</f:FormElement>
</f:formElements>
</f:FormContainer>
<f:FormContainer>
<f:formElements>
<f:FormElement>
<f:fields>
<Button id="Accept" width="10em" text="获取数量" press="GetData" />
</f:fields>
</f:FormElement>
</f:formElements>
</f:FormContainer>
</f:formContainers>
</f:Form>
</content>
</Page>
Controller中实现按钮的方法。
GetData: function(evt){
//创建MSComm对象
var Menge = this.byId("Menge");
var MSComm1 = new ActiveXObject("MSCOMMLib.MSComm.1");
if (MSComm1.PortOpen == true) {
try {
MSComm1.PortOpen = false;
} catch (ex) {
alert(ex.message);
}
}
MSComm1.RThreshold = 1; // 接收一个字节就触发omcom事件
var inputvalue = "";
for(var com = 1;com<=7;com++){
if (MSComm1.PortOpen == false)
{
MSComm1.CommPort = com;
MSComm1.Settings = "9600,o,7,1"
MSComm1.OutBufferCount = 0; // 清空发送缓冲区
MSComm1.InBufferCount = 0; // 滑空接收缓冲区
MSComm1.RThreshold = 1; // 接收一个字节就触发omcom事件
try {
MSComm1.PortOpen = true;
} catch (ex) {
}
if (MSComm1.PortOpen == true) {
var controller = this;
setTimeout(function() {
inputvalue = MSComm1.Input;
if (inputvalue != "") {
var Arry1 = inputvalue.split("+");
if(Arry1.length==1){
messages.showText("请先连接电子秤称重");
return;
}
var Arry2 = Arry1[1].split("[ ]");
var zczsl = parseFloat(Arry2[0]);
Menge.setValue(zczsl)
MSComm1.PortOpen = "false";
}
}, 100);
}
}
}
}
代码说明:
首先创建MSComm对象
关闭串口(设置了串口号,波特率,收发缓冲等等,参数是在电子秤端进行设置的,还需将电子秤设置成稳定后自动持续输出),设置完参数,打开串口;for循环的作用是,没法确定数据从哪个端口传出,这里默认7个端口,哪个端口有数据传过来,就接收。
接收电子秤发出的数据,并进行处理;
5.2结果展示