Мини-программа 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
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.