循环发送数据逻辑很简单,需要用到定时器函数:setInterval和clearInterval
在循环发送选择框有效的时候,就开启循环发送定时器,选择框无效的时候,就清除循环发送定时器
wxml代码:
<!--发送区底部bottom部分-->
<view class="sendBottomView">
<checkbox checked="{{cycleSendFlag}}" bindtap="cycleSendCheckBoxClick"/>循环发送(ms):
<input class="cycleSendInput" bindinput="cycleSendInputEvent" value="{{cycleSendInputText}}" disabled="{{cycleSendFlag?true:false}}"/>
<!-- <button class="addSendInputItemButton" style="width: 20%;">添加</button> -->
</view>
cycleSendInputEvent代码:
cycleSendInputEvent: function(e) {
// 对输入数据做判断
var value = e.detail.value;
var pos = e.detail.cursor;
if (pos > 0) {
for (let i=0; i<value.length; i++) {
// 限制输入数据类型和长度
if (value[i] < '0' || value[i] > '9' || i>4) {
wx.showToast({
title: '请输入10进制数据(1~99999)',
icon: 'none',
duration: 1500
});
this.data.cycleSendInputText = value.slice(0, i); //直接从非数字进制数据的位置截取
return {
value: this.data.cycleSendInputText,
cursor: i
}
}
}
this.data.cycleSendInputText = value;
} else {
this.data.cycleSendInputText = "";
}
},
时间间隔输入框函数主要是判断是输入信息是否OK,并记录时间到对应的变量中。
cycleSendCheckBoxClick代码:
cycleSendCheckBoxClick: function(e) {
if (!this.data.cycleSendFlag) { // 开启循环发送
.....
各种异常判断处理:设备是否连接、写入ID是否选择、间隔时间是否合理等等
.....
this.data.cycleSendFlag = true;
this.setData({['cycleSendFlag']:this.data.cycleSendFlag});
debug.Debug(BLECTR_MODUAL_NAME, debug.DEBUG_DEBUG, "开始循环发送", cycleTime);
this.userData.cycleTimersNumer = setInterval(
(res)=>{
debug.Debug(BLECTR_MODUAL_NAME, debug.DEBUG_DEBUG, "循环发送一次数据");
for (let i=0; i<this.data.sendDataList.length; i++) {
if (this.data.sendDataList[i].checkBoxChecked && this.data.sendDataList[i].inputText.length > 0) {
var writeValue = "";
// 16进制方式发送,每两个字符组成一个数据,如果遇到非16进制字符,数据转换将中止
if (this.userData.hexSendFlag) {
writeValue = this.transformSendDataByHex(this.data.sendDataList[i].inputText);
} else { // 字符方式发送
writeValue = this.transformSendDataByChar(this.data.sendDataList[i].inputText);
}
ble.writeDevCharValue(
this.userData.currDevId,
this.userData.currWriteChar.serId,
this.userData.currWriteChar.charId,
writeValue,
(res, errCode)=> { // 循环发送不做数据发送成功和失败的判断
// if (res) {
// debug.Debug(BLECTR_MODUAL_NAME, debug.DEBUG_DEBUG, "数据发送成功", errCode);
// } else {
// debug.Debug(BLECTR_MODUAL_NAME, debug.DEBUG_DEBUG, "数据发送失败", errCode);
// }
}
);
}
}
},
cycleTime,
0,
);
} else { // 终止循环发送
this.data.cycleSendFlag = false;
this.setData({['cycleSendFlag']:this.data.cycleSendFlag}); // 需要setData,否则输入框的disable状态不会改变
clearInterval(this.userData.cycleTimersNumer);
debug.Debug(BLECTR_MODUAL_NAME, debug.DEBUG_DEBUG, "停止循环发送数据");
}
},
该博客介绍了如何使用JavaScript的setInterval和clearInterval函数来实现在WXML页面上根据用户选择实现蓝牙设备的循环数据发送。当用户勾选复选框时启动定时器,不勾选时清除定时器。内容包括输入数据的合法性检查、循环发送的异常判断以及数据发送逻辑。同时,涉及了数据转换、设备连接状态和写入操作的验证。

1万+

被折叠的 条评论
为什么被折叠?



