Мини-программа WeChat Bluetooth Communication HC08
Мини-программа WeChat Bluetooth Communication HC08

Подведите итоги по последовательному порту Bluetooth, изученному за последние два дня. По человеческой версии информации не так много, поэтому в основном полагаюсь на просмотр чужих складов и документов.

  • Часть микроконтроллера,При использовании последовательного порта Bluetooth связь осуществляется через последовательный порт. Проще, чем я думал,
  • Мини часть программы,Там так много Служить и характеристик,А о человеческой версии информации не так много.

Если у вас есть какие-либо вопросы по этой статье, или если вы все еще что-то не поняли, вы можете связаться через личное сообщение.

Последовательный порт Bluetooth HC08

Часть Bluetooth была завершена производителем оборудования, и для связи с хостом доступны только несколько проводов. Протокол, используемый HC08 для связи с хостом, — это последовательный порт. Для управления модулем последовательного порта Bluetooth нет необходимости опрашивать 0011. Вам нужно только отправлять команды подчиненному устройству HC08 через последовательный порт.

image.png
image.png

Подключение и отключение осуществляются периферийными устройствами. После успешного соединения появляется последовательный порт. Данные, отправленные Bluetooth через последовательный порт, будут прозрачно передаваться на другой конец, и на входящие данные также будет отвечать последовательный порт. Настройка HC08 — это фактически настройка UART. Его также можно подключить к компьютеру через USB-TTL.

Настроить последовательный порт

Теперь найдите, где находятся контакты на схеме.

image.png
image.png
image.png
image.png

PA9 и PA10 также являются входными и выходными контактами USART.

Язык кода:javascript
копировать
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_TIM1,ENABLE);

GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);

GPIO_SetBits(GPIOA,GPIO_Pin_10);

Этот stm32 имеет интегрированное оборудование USART, и для инициализации ему требуется только вызов библиотечных функций. Конкретные значения параметров представлены в предыдущих статьях.

Язык кода:javascript
копировать
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate=9600;
USART_InitStructure.USART_HardwareFlowControl=ENABLE;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_Init(USART1,&USART_InitStructure);

Аппаратное обеспечение выполняет только операции чтения и чтения.,При получении изменения уровня от последовательного порта,Автоматически помещать 1 байт данных в сдвиговый регистр.,ВоляUSART_IT_RXNEПоложение флага - высокий уровень。 Если установлено высокое значение, запускается прерывание, считывается один байт данных и флаг прерывания очищается. Если он не очищен, следующий байт данных не будет получен.

Язык кода:javascript
копировать
USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_InitStructure);

Отправляемые данные часто состоят из нескольких байтов. Как определить, закончилось ли сообщение? Общие практики включают в себя,Согласен напоследок хорошие новости,Например, когда концовка\r\nОтметить текущее сообщение как завершенное。 В этой статье используется метод: прерывание по таймеру. Если в течение определенного периода времени нет новых данных, это означает, что текущие данные закончились.

Язык кода:javascript
копировать
void TIM1_UP_IRQHandler(){
	if(rxBufferPointer&&millis-lastTime>10){
		rxBufferPointer=0;
		isOK=1;
	}
	millis++;
	TIM_ClearITPendingBit(TIM1,TIM_IT_Update);
}

Прерывание таймера срабатывает каждую миллисекунду, и значение таймера сохраняется. rxBufferPointerуказывает на следующий байтданныеуказатель。 Когда текущее сообщение закончится,Этот указатель должен быть сброшен на0,логотипisOKУстановить один。Внешний мир определяет, закончилось ли сообщение,Просто взглянув наisOKлоготип的状态。

Язык кода:javascript
копировать
void USART1_IRQHandler(){
	if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET){
		lastTime=millis;
		rxBuffer[rxBufferPointer++]=USART_ReceiveData(USART1);
		rxSize=rxBufferPointer;
		USART_ClearITPendingBit(USART1,USART_IT_RXNE);
	}
}

Если сообщение не окончено,自动Воля当前接收的данные ДепозитrxBufferPointerуказывает на следующую позицию байта。

image.png
image.png

Поместите переменные, модифицированные extern, в файл заголовка, и затем вы сможете прочитать их непосредственно после импорта этого файла заголовка. Размер массива — 256, указатель — 8 бит и может указывать до 256 адресов памяти. 传递的消息没有结束логотип,Чтобы отметить конечное положение,нужно пройтиrxSizeДлина сообщения, когда хранилище заканчивает чтение。 Для сравнения строк требуетсяstrcmp,Вместо использования простого==

image.png
image.png

Эта часть была кратко объяснена. Настройка последовательного порта Bluetooth фактически представляет собой настройку USART, поскольку методом связи между stm32 и HC08 является последовательный порт. Более подробный процесс настройки вы можете прочитать в моем предыдущем блоге.

Апплет WeChat

Генеральный проект строительства

Если у вас есть опыт создания небольших программ, вы можете пропустить эту часть.

Создать апплет WeChat

Если у вас нет AppID, вы можете зарегистрировать его и настроить так, как он будет выглядеть. Это вряд ли повлияет на последующую разработку. Мой выбор: не использовать облачные сервисы и базовые шаблоны JS.

image.png
image.png

Установить глобальный единый стиль

Поместите этот кодCVприезжатьapp.wxssсередина:

Язык кода:javascript
копировать
page {
  font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Helvetica,
    Segoe UI, Arial, Roboto, 'PingFang SC', 'miui', 'Hiragino Sans GB', 'Microsoft Yahei',
    sans-serif;
}

С помощью этого кода достигается одинаковая ситуация отображения на разных устройствах.

image.png
image.png

Избавьтесь от неиспользуемых страниц

удалитьlogsпапка。 существоватьapp.jsonсерединаудалить"pages/logs/logs"эта линия。 (На самом деле, если вы не удалите его, это не повлияет на ваше использование)

image.png
image.png

Чистые App() и Page()

удалитьapp.jsindex.wxmlindex.wxssindex.jsсередина的全部内容。 Затем выберите поле с□的инициализация模板。,инициализацияapp.jsиindex.js

image.png
image.png

В этой статье настраиваются всего три страницы, а инициализация двух других страниц аналогична описанной выше.

Язык кода:javascript
копировать
"pages": [
  "pages/index/index",
  "pages/BLE/Services/Services",
  "pages/BLE/control/control"
],

Интерфейс сканирования устройств

Цель этого шага — отобразить отсканированные устройства Bluetooth на индексной странице. Согласно официальным требованиям WeChat, этот процесс выглядит следующим образом:

  • Включите адаптер Bluetooth
  • Начать сканирование

Bluetooth的可用状态и扫描状态可以существоватьwx.onBluetoothAdapterStateChange()回调серединаполучать。 扫描的设备可以существоватьwx.onBluetoothDeviceFound()回调серединаполучать。 Чтобы облегчить отладку:

  • В App.js,Монтировать метод глобального инструментаfail
  • ВоляonBluetoothAdapterStateChange的通知结果打印существовать页面上。

app.js монтирует глобальный метод обработки сбоев

Язык кода:javascript
копировать
App({
  fail:(res)=>{
    wx.showToast({
      title: res.errMsg,
      icon:"none"
    })
  }
})

index.js реагирует на события изменения состояния адаптера

Поместите сюдаonBluetoothAdapterStateChangeОтдельно упаковано,Установлен под этим. сделать структуру кода более понятной,避免существоватьonLoad()Вложенные слои отображаются ниже。

Язык кода:javascript
копировать
Page({
  data: {
    available: false,
    discovering: false
  },
  onLoad: function (options) {
    this.onBluetoothAdapterStateChange();
  },
  onBluetoothAdapterStateChange() {
    wx.onBluetoothAdapterStateChange(({
      available,
      discovering
    }) => {
      this.setData({
        available,
        discovering
      })
    })
  }
})

Отобразите некоторые значения во внешнем интерфейсе, чтобы облегчить последующую отладку.

image.png
image.png

После включения адаптера необходимо запустить проверку. функция обработки после обнаружения устройства. Решение здесь — добавить обнаруженное устройство в массив. Если сообщается о дублирующих устройствах,那么нужно пройти数组的.splice()метод,Заменить новым оборудованием. Чтобы было проще определить, есть ли дубликаты,Вы можете создать массив_deviceIds挂载существоватьthisВниз,Уникальный идентификатор запоминающего устройстваdeviceId。 Чтобы упростить структуру кода и избежать слоев вложенности, код инкапсулируется отдельно и монтируется под ним.

image.png
image.png

Событие щелчка для начала поиска:onTapDiscover

Язык кода:javascript
копировать
<button bind:tap="onTapDiscover">{{discovering?"Завершить поиск":"Начать поиск"}}</button>

Это событие требует реализации различных стратегий в зависимости от текущей ситуации:

  • Если адаптер не включен,Затем включите адаптер,И найдите устройства Bluetooth в обратном вызове.
  • Если адаптер включен,но не в состоянии сканирования,Так прямо Начать сканирование。
  • Если сканирование выполняется, отключите сканирование.

В первых двух случаях вам необходимо очистить список сканируемых устройств перед выполнением, чтобы убедиться, что сканируемые устройства актуальны и действительны.

Язык кода:javascript
копировать
onTapDiscover() {
  if (this.data.discovering) {
    wx.stopBluetoothDevicesDiscovery();
  } else {
    this.setData({
      devices: []
    })
    this._deviceIds = []
    if (this.data.available) {
      wx.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: true
      })
    } else {
      this.openBluetoothAdapter();
    }
  }
},
openBluetoothAdapter() {
  wx.openBluetoothAdapter({
    success: () => {
      wx.startBluetoothDevicesDiscovery({
        allowDuplicatesKey: true
      })
    },
    fail: getApp().fail
  })
}

Для внешнего интерфейса,Суть статьи не в этом,Проведено на короткое время,специфическийwxssНастройка переводимого кода,Настройте в соответствии с потребностями.

image.png
image.png

проходитьonTapDeviceфункция,Обработка событий подключения,проходитьdata-deviceIdвходящий。проходитьdeviceIdполучать Служитьсписок。 После успешного подключения следует прекратить сканирование и отключить эту ресурсоёмкую операцию. Операции со списком услуг завершаются на новой странице.

Язык кода:javascript
копировать
onTapDevice(e){
  let deviceId=e.currentTarget.dataset.deviceid
  wx.showModal({
    title: 'Connected or not',
    content: deviceId,
    success (res) {
      if (res.confirm) {
        getApp().Toast("connecting");
        wx.createBLEConnection({
          deviceId,
          success:()=>{
            wx.stopBluetoothDevicesDiscovery();
            wx.navigateTo({
              url: `/pages/BLE/Services/Services?deviceId=${deviceId}`
            })
          }
        })
      }
    }
  })
}

Интерфейс списка услуг

image.png
image.png

На этом этапе относительно мало операций.,所以可以直接Воляполучать Служитьсписок的метод定义существоватьonLoadвнутри。 Если вы вернетесь на предыдущую страницу,意味着середина断连接。所以需要существоватьonUnloadметодсередина断开当前连接。 onUnloadметод会существовать当页面的生命周期结束时自动执行。 Конкретный код будет представлен в исходном коде позже. В этом проекте не используются сторонние библиотеки компонентов, это родной Аплет. WeChat, совместимый с большинством сред.

интерфейс управления

Это самая сложная часть статьи. (Это не сложно, когда вы это поймете)

image.png
image.png

Вначале я просканировал несколько сервисов, каждый с несколькими подписями, и не знал, что делать. Хотя некоторые функции имеют атрибут уведомления, при попытке уведомления по-прежнему выдается сообщение об ошибке. Или нет ответа от чтения или записи. Текущее решение состоит в том, чтобы просмотреть характеристики службы, попробовать прочитать/записать/уведомить и установить текущие успешные характеристики службы в обратном вызове успеха. В настоящее время нормальная связь возможна на HC08. Раньше я понимал, что нужно одновременно выполнять чтение/запись/уведомление о функции. Но на самом деле он может быть разбросан по нескольким функциям, работающим вместе для выполнения одной и той же услуги.

image.png
image.png

Для упрощения структуры кода принят командный режим. Каждая кнопка выполняет один и тот же метод, но передаваемые параметры команды различны. HC08ОтправилданныесуществоватьonBLECharacteristicValueChangeсередина处理。вместоread,Я не знаю, что делает Рид в данный момент. Отправляется ArrayBuffer, и при отправке его необходимо преобразовать в ArrayBuffer. Его необходимо реализовать:

  • ab2str
  • ab2hex
  • str2ab

str — это строка,hex - это шестнадцатеричный код,Окончательная форма выражения также является строкой,abдаArrayBuffer,Этот видданные Потоковая форма。2就даto,Чтобы избежать неприятностей,То же произношение,Просто пишу2。 Пожалуйста, обратитесь к исходному коду конкретного процесса. репозиторий кода:https://github.com/WuShFeng/BLE

Первый молодой полноприводный автомобиль на новой энергии

Эта статья написана в начале учебного года, и ее много раз прерывали. Я хотел написать много вещей, но забыл. Добавлю еще, когда вспомню.

ссылка

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose