BUG by Using ESP32‘s bluetooth to send data

文章描述了一个ESP32开发板通过蓝牙低功耗(LE)与手机通信,收集学习时间和模式数据,并进行市场数据分析的过程。代码定义了接收、解析和处理来自手机的数据,以及设备连接/断开事件的处理。
摘要由CSDN通过智能技术生成

oringinal code:

# This file is executed on every boot (including wake-boot from deepsleep)
#import esp
#esp.osdebug(None)
#import webrepl
#webrepl.start()
from machine import Pin
from machine import Timer
from time import sleep_ms
import bluetooth
import struct
import machine
Study_hours_today = [] # 学习时间-今日
Learning_model_data_day = [] # 学习模式数据-日
Learning_model_data_week = [] # 学习模式数据-周
Learning_model_data_month = [] # 学习模式数据-月
Learn_marketing_data_analysis_week = [] # 学习市场数据分析-周
Learn_marketing_data_analysis_month1 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month2 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month3 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month4 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month5 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month6 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month7 = [] # 学习市场数据分析-月
Learn_marketing_data_analysis_month8 = [] # 学习市场数据分析-月

BLE_MSG = ""

# 配置串口
uart = machine.UART(2, baudrate=115200) # UART在ESP32上的引脚号为2
uart.init(115200, bits=8, parity=None, stop=1)


def parse_data(data):
    decoded_data = data.decode()
    key, value = decoded_data.split(':') # 根据冒号分割key和value
    value = int(value.split()[0]) # 去掉value后面的“hours”,并将其转换为整数
    if key == 'sht':
        Study_hours_today.append(value)

    elif key == 'lmdd':
        Learning_model_data_day.append(value)

    elif key == 'lmdw':
        Learning_model_data_week.append(value)

    elif key == 'lmdm':
        Learning_model_data_month.append(value)

    elif key == 'lmdaw':
        Learn_marketing_data_analysis_week.append(value)

    elif key == 'lmdam1':
        Learn_marketing_data_analysis_month1.append(value)
    elif key == 'lmdam2':
        Learn_marketing_data_analysis_month2.append(value)
    elif key == 'lmdam3':
        Learn_marketing_data_analysis_month3.append(value)
    elif key == 'lmdam4':
        Learn_marketing_data_analysis_month4.append(value)
    elif key == 'lmdam5':
        Learn_marketing_data_analysis_month5.append(value)
    elif key == 'lmdam6':
        Learn_marketing_data_analysis_month6.append(value)
    elif key == 'lmdam7':
        Learn_marketing_data_analysis_month7.append(value)
    elif key == 'lmdam8':
        Learn_marketing_data_analysis_month8.append(value)
 
        

class ESP32_BLE():
    def __init__(self, name):
        self.led = Pin(2, Pin.OUT)
        self.timer1 = Timer(0)
        self.name = name
        self.ble = bluetooth.BLE()
        self.ble.active(True)
        self.ble.config(gap_name=name)
        self.disconnected()
        self.ble.irq(self.ble_irq)
        self.register()
        self.ble.gatts_write(self.tx, bytes(1000))
        self.advertiser()

    def connected(self):
        self.led.value(1)
        self.timer1.deinit()

    def disconnected(self):        
        self.timer1.init(period=100, mode=Timer.PERIODIC, callback=lambda t: self.led.value(not self.led.value()))

    def ble_irq(self, event, data):
        global BLE_MSG
        if event == 1: #_IRQ_CENTRAL_CONNECT 手机链接了此设备
            self.connected()
        elif event == 2: #_IRQ_CENTRAL_DISCONNECT 手机断开此设备
            self.advertiser()
            self.disconnected()
        elif event == 3: #_IRQ_GATTS_WRITE 手机发送了数据 
            buffer = self.ble.gatts_read(self.rx)
            BLE_MSG = buffer.decode('UTF-8').strip()
            
    def register(self):        
        service_uuid = '6E400001-B5A3-F393-E0A9-E50E24DCCA9E'
        reader_uuid = '6E400002-B5A3-F393-E0A9-E50E24DCCA9E'
        sender_uuid = '6E400003-B5A3-F393-E0A9-E50E24DCCA9E'

        services = (
        (
          bluetooth.UUID(service_uuid), 
         (
            (bluetooth.UUID(sender_uuid), bluetooth.FLAG_NOTIFY | 0xFB), 
            (bluetooth.UUID(reader_uuid), bluetooth.FLAG_WRITE | 0xFB),
             
              
            
            )
            ), 
            )

        ((self.tx, self.rx,), ) = self.ble.gatts_register_services(services)


    def send(self, data):
        self.ble.gatts_notify(0, self.tx, data)

    def advertiser(self):
        name = bytes(self.name, 'UTF-8')
        adv_data = bytearray('\x02\x01\x02') + bytearray((len(name) + 1, 0x09)) + name
        self.ble.gap_advertise(100, adv_data)
        print(adv_data)
        print("\r\n")


def send():
   led.value(not led.value())
   print('LED is ON.' if led.value() else 'LED is OFF')
   for i in range(1):
    ble.send('sht:{} '.format(Study_hours_today[i]))
    sleep_ms(1000)

    ble.send('lmdd:{} '.format(','.join(str(i) for i in Learning_model_data_day)))
    sleep_ms(400)

    ble.send('lmdw:{} '.format(','.join(str(i) for i in Learning_model_data_week)))
    sleep_ms(400)

    ble.send('lmdm:{} '.format(','.join(str(i) for i in Learning_model_data_month)))
    sleep_ms(400)
    
    
    ble.send('lmdaw:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_week)))
    sleep_ms(400)

    ble.send('lmdam1:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month1)))
    sleep_ms(400)
    ble.send('lmdam2:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month2)))
    sleep_ms(400)
    ble.send('lmdam3:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month3)))
    sleep_ms(400)   
    ble.send('lmdam4:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month4)))
    sleep_ms(400)
    ble.send('lmdam5:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month5)))
    sleep_ms(400)
    ble.send('lmdam6:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month6)))
    sleep_ms(400)
    ble.send('lmdam7:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month7)))
    sleep_ms(400)  
    ble.send('lmdam8:{} '.format(','.join(str(i) for i in Learn_marketing_data_analysis_month8)))
    sleep_ms(400)
 

# 发送最后一组,剩余 3个数据
 
def simulate_button_press():
    but.on()  # 设置引脚为高电平
    sleep_ms(400)
    but.off()  # 设置引脚为低电平


if __name__ == "__main__":
    ble = ESP32_BLE("ESP32BLE")
    led = Pin(2, Pin.OUT)

    while(1):

      for i in range(50):
       if uart.any(): # 判断串口是否有数据可读
         data = uart.readline() # 读取一行数据
      
         parse_data(data) # 解析数据并放入相应的数组中
      if len(Study_hours_today) == 1 and \
           len(Learning_model_data_day) == 4 and \
           len(Learning_model_data_week) == 4 and \
           len(Learning_model_data_month) == 4 and \
           len(Learn_marketing_data_analysis_week) == 7 and \
           len(Learn_marketing_data_analysis_month1) == 7 and \
           len(Learn_marketing_data_analysis_month2) == 7 and \
           len(Learn_marketing_data_analysis_month3) == 7 and \
           len(Learn_marketing_data_analysis_month4) == 7 and \
           len(Learn_marketing_data_analysis_month5) == 7 and \
           len(Learn_marketing_data_analysis_month6) == 7 and \
           len(Learn_marketing_data_analysis_month7) == 7 and \
           len(Learn_marketing_data_analysis_month8) == 2:
                       send()
      data='b'
      Study_hours_today=Study_hours_today[-1:]
      Learning_model_data_day=Learning_model_data_day[-4:]
      Learning_model_data_week=Learning_model_data_week[-4:]
      Learning_model_data_month=Learning_model_data_month[-4:]
      Learn_marketing_data_analysis_week=Learn_marketing_data_analysis_week[-7:]
      Learn_marketing_data_analysis_month1=Learn_marketing_data_analysis_month1[-7:]
      Learn_marketing_data_analysis_month2=Learn_marketing_data_analysis_month2[-7:]
      Learn_marketing_data_analysis_month3=Learn_marketing_data_analysis_month3[-7:]
      Learn_marketing_data_analysis_month4=Learn_marketing_data_analysis_month4[-7:]
      Learn_marketing_data_analysis_month5=Learn_marketing_data_analysis_month5[-7:]
      Learn_marketing_data_analysis_month6=Learn_marketing_data_analysis_month6[-7:]
      Learn_marketing_data_analysis_month7=Learn_marketing_data_analysis_month7[-7:]
      Learn_marketing_data_analysis_month8=Learn_marketing_data_analysis_month8[-2:]

In this place,we can see so many words to judge the length whether enough.Why we use so many word to judge?Yes,you can think that if we don't use this word to judge,we will suprisly find 

it will offer a error :list is out of range

why?
because as a slave computer,if it can't receive data,we use send fuction will appear this wrong.So we should check this length and send,it can avoid this problem


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值