16_微信小程序-BLE低功耗蓝牙开发-循环发送数据

该博客介绍了如何使用JavaScript的setInterval和clearInterval函数来实现在WXML页面上根据用户选择实现蓝牙设备的循环数据发送。当用户勾选复选框时启动定时器,不勾选时清除定时器。内容包括输入数据的合法性检查、循环发送的异常判断以及数据发送逻辑。同时,涉及了数据转换、设备连接状态和写入操作的验证。

循环发送数据逻辑很简单,需要用到定时器函数: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, "停止循环发送数据");
	}
},

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值