HC-05 Bluetooth モジュール -------- 携帯電話と STM32 通信 (コードの書き込み) (ホスト コンピューターの構成) ナニー レベルのチュートリアル


⏩ 皆さんこんにちは!システムアーキテクトを志望する後輩の組込みマニアの小光です。
⏩過去に、電気レースでもプロジェクトでも、携帯電話とstm32間の通信、電気レースでの2台の車両通信、または2台間の無線通信など、Bluetoothモジュールが使用されましたstm32やリモートセンシングカーのstm32など ⏩この記事は
BluetoothモジュールHC-05と携帯電話の通信について詳しく解説したチュートリアルです。
⏩読んでくれてありがとう、間違っていたら訂正してください。
HC-05 Bluetooth モジュール ルーチン
リンク: https://pan.baidu.com/s/1-dNXPluImjaH1PcfHfpMyA?pwd=6666
抽出コード: 6666



1. Bluetooth モジュールの原理

1. Bluetooth モジュールの動作原理

Bluetooth デバイスは、電波を使用して電話とコンピュータを接続します。Bluetooth 製品は、小さな Bluetooth モジュールと、Bluetooth ラジオおよび接続をサポートするソフトウェアで構成されています。2 つの Bluetooth デバイスが相互に通信するには、ペアリングする必要があります。Bluetooth デバイス間の通信は、Bluetooth テクノロジを使用して接続されたデバイスのネットワークである、ピコネットと呼ばれる短距離のアドホック ネットワークを介して行われます。このタイプのネットワークは、接続された 2 ~ 8 台のデバイスに対応できます。ネットワーク環境が正常に作成されると、1 つのデバイスがマスター デバイスとして機能し、他のすべてのデバイスがスレーブ デバイスとして機能します。Intang Zhongchuang は、Bluetooth デバイスが無線短距離センサーに参加および離脱するタイミングを動的かつ自動的に確立します。

2. Bluetooth モジュールの伝送方式

近年のBluetooth技術の継続的な開発により、Bluetoothの伝送速度は継続的に改善され、消費電力は継続的に削減され、Bluetoothの適用範囲がより広範になりました。ただし、完全な bluetooth システムを設計する場合は、無線周波数設計、プロトコルスタック、システム統合、bluetooth モジュールの選択、およびその他の専門知識の側面など、bluetooth に関する関連する技術的知識を完全に習得する必要があります。
Bluetooth モジュールは、シリアル ポート (SPI、IIC) および MCU 制御デバイスを介してデータを送信できます。Bluetooth モジュールは、ホストおよびスレーブとして使用できます。マスターは他の Bluetooth モジュールを検索してアクティブに接続を確立できますが、スレーブはアクティブに接続を確立できず、他のユーザーが自分自身を接続するのを待つことしかできません。

3. Bluetooth モジュールの種類

1. HC-05 Bluetooth モジュールの紹介
HC-05 Bluetooth シリアル通信モジュール (以下、モジュールと呼びます) には、コマンド応答動作モードと自動接続動作モードの 2 つの動作モードがあり、自動接続動作モードでは、モジュールは、マスター (Master)、スレーブ (Slave)、ループバック (Loopback) の 3 つの役割に分けられます。
モジュールが自動接続動作モードにある場合、事前に設定された方法に従ってデータを自動的に送信します; モジュールがコマンド応答動作モードにある場合、次のすべての AT コマンドを実行でき、ユーザーはさまざまな送信を行うことができます。モジュールをセットアップするためのモジュールへの AT コマンド 制御パラメータを設定するか、制御コマンドを発行します。モジュールの外部ピン (PIO11) の入力レベルを制御することにより、モジュールの 2 つの動作モード間の切り替えを実現できます。
2. HC-06 スレーブ Bluetooth モジュールは
スレーブとしてのみ使用できます.
その他には、低電力 BLE Bluetooth 4.0 モジュール (cc2540 または cc2541), JDY-10 Bluetooth 4.0 BLE モジュールなどが含まれます. ここでは、HC-05 Bluetooth モジュールを使用します例として。

2. 携帯電話と STM32 間の通信

1. Bluetooth モジュールの構成

設定手順:
(1) Bluetooth モジュールの en ボタンを長押しして、USB to TTL モジュールを介してコンピュータに接続します。
モジュールが 2 秒間隔で点滅する場合は、接続が成功したことを意味し、AT コマンド モードに入ります。
注: ボタンがない場合は、en ピンを高に接続し、USB を介してコンピュータに TTL に接続します。
(2) XCOM (シリアル ポート デバッグ アシスタント) を開き、接続されているシリアル ポートを選択し、ボー レートを 38400 に設定して、シリアル ポートを開きます。
ここに画像の説明を挿入
注: シリアル ポートが見つからない場合は、CH340 ドライバーがインストールされているかどうかを確認してください。
(3) コマンド構成:
入力: AT+ORGL\\デフォルト状態に戻す
Return: OK
入力: AT
Return: OK
入力: AT+NAME=xiaoguang\\Bluetooth デバイス名を設定
Return: OK
入力: AT+PSWD=1234\\Bluetooth デバイス パスワードを設定
Return: OK
入力: AT+UART=9600,0,0\\シリアル ウェーブのボーレートを 115200、ストップ ビットなし、パリティ ビットなしに設定します
Return: OK
入力: AT+CMODE=1\\任意の Bluetooth アドレス接続
Return: OK
注:AT+NAME?コマンド以外で OK が返されない場合は、Bluetooth モジュールがコマンド応答モードに入っているかどうかを確認してください。
(4) Bluetooth モジュールの電源が再びオンになり、インジケータ ライトがすばやく点滅します. 携帯電話の Bluetooth デバッガをオンにして、Bluetooth モジュールに接続します. 接続後、Bluetooth モジュールは 2 秒間隔で 2 回点滅します:
写真の説明を追加してください
名前が見つからない場合は、AT+ADDR?アドレスを確認し、指示に従って接続できます
ここに行くと、Bluetooth モジュールがすでに携帯電話に接続されていることがわかります。

2. コードの書き方

設定する通信プロトコルは、
パケットヘッダ(0xA5)+データ+パリティ+パケット終了(0x5A)で、
この例では、受信するデータはint型整数とchar型の合計5バイトなので、全体 パケットは 8 バイトです

シリアル ポートの初期化と割り込みサービス機能の設定

/*bsp_usart.h*/
#ifndef __BSP_USART_H
#define __BSP_USART_H
#include "stm32f10x.h"
#include <stdio.h>

#define REC_BUF_SIZE 8    //接收数据包的大小

#define DEBUG_USARTx                     USART2   //蓝牙所用串口2
#define DEBUG_USART_CLK                  RCC_APB1Periph_USART2  //串口时钟
#define DEBUG_USART_APBxClkCmd           RCC_APB1PeriphClockCmd //串口时钟使能
#define DEBUG_USART_BAUDRATE             9600 //波特率设置·

#define DEBUG_USART_GPIO_CLK             RCC_APB2Periph_GPIOA   

#define DEBUG_USART_GPIO_APBxClkCmd       RCC_APB2PeriphClockCmd  //端口时钟

#define DEBUG_USART_TX_GPIO_PORT         GPIOA              //端口宏定义
#define DEBUG_USART_TX_GPIO_PIN          GPIO_Pin_2
#define DEBUG_USART_RX_GPIO_PORT         GPIOA
#define DEBUG_USART_RX_GPIO_PIN          GPIO_Pin_3

#define DEBUG_USART_IRQ                  USART2_IRQn
#define DEBUG_USART_IRQHandler           USART2_IRQHandler   //中断服务函数

static void NVIC_Config(void);
void USART_Config(void);
void Usart_SendByte(USART_TypeDef*pUSARTx,uint8_t data);

#endif 
/*bsp_usart.c*/
__IO uint8_t usart_value=0;//接收一个字节数据的变量
uint8_t len=0;             //接收数据的数组当前下标   
uint8_t num[20];           //存放接收一次数据包的数组
uint8_t Flag=0;  		   //接收到数据之后Flag=1
static uint8_t f = 0;      //从0xA5开始接收0x5A结束
// 中断服务函数
void DEBUG_USART_IRQHandler(void){
    
    
	if(USART_GetITStatus(DEBUG_USARTx,USART_IT_RXNE)){
    
      //接收中断标志位变化
		usart_value=USART_ReceiveData(DEBUG_USARTx);    //接收一个字节的数据
		if(usart_value == 0xA5)                         //从0xA5开始
		{
    
    
			f = 1;
		}
		if(f == 1)                                      //0xA5之后的数据存放到num[]数组
		{
    
    
			num[len]=usart_value;
			len++;
		}
		
	}
	if(len==REC_BUF_SIZE && usart_value == 0x5A){
    
           //接收到包尾,结束本次接收
		Flag=1;
		len=0;
		f = 0;
	}
	else if(len > REC_BUF_SIZE){
    
                            //如果长度大于数据包的长度,也结束本次接收
		f = 0;
		len = 0;
	}
 	USART_ClearFlag(DEBUG_USARTx,USART_IT_RXNE);        //清除中断标志位
}

わからなかったらコメント読め

パケットコードを受け取る

 /*function.h*/
#ifndef __FUNCTION_H
#define __FUNCTION_H
	
#include "stm32f10x.h"
#include "bsp_usart.h"
#include "function.h"

typedef struct {
    
    
	int  num;
	char c;
}INPUT;

INPUT DATARecv();//接收上位机数据
void BL_Send(USART_TypeDef*pUSARTx,u8 send_ok);//发送数据给上位机

#endif 
#include "function.h"
#include "bsp_usart.h"
#include "math.h"
#include "stm32f10x_it.h" 

extern uint8_t Flag;//数据包是否发送
extern uint8_t num[20];//存储上位机发出的数据包


/**************************************************************************
函数名:DATARecv

作用:  将中断接收的数据包导出到我们的INPUT结构体,结构体和DATARccv可根据实际情况进行更改

返回值:INPUT类型的结构体

使用:BL_Send(DEBUG_USARTx,mode,quan)
***************************************************************************/
INPUT DATARecv(){
    
    
	int a=0;
	uint8_t i;
	INPUT structure;
  
	//接收一个char类型的数据
	structure.c=num[1];
	//接收一个int整形数据
	for(i=2;i<=6;i++){
    
     
		a+=num[i]<<((i-2)*8);
	}
	structure.num=a;
	a = 0;
	Flag=0;    //接收完成
	return structure;
}
/**************************************************************************
函数名:BL_Send

作用:  上位机数据显示,板子发送上位机,根据要发送的数据字节,在调试器上设置接收数据包
				参数1代表串口,后面代表发送的数据,可根据实际情况进行更改

参数:(串口类型,要发送的参数1,参数2,参数3)可修改个数,同时也要修改发送的字节就是下面注释掉的部分

使用:BL_Send(DEBUG_USARTx,mode,quan)
***************************************************************************/
void BL_Send(USART_TypeDef*pUSARTx,u8 send_ok){
    
    
	
	u8 t;
	u8 sum=0;//校验位--数据字节之和的低八位
	u8 i;
	Usart_SendByte(pUSARTx,0xA5);//头
	///发送模式
    Usart_SendByte(pUSARTx,send_ok);
	sum+=send_ok;//校验位就是把数据的每一个字节相加,很重要,不然手机无法接收数据
	Usart_SendByte(pUSARTx,sum);//校验位
	Usart_SendByte(pUSARTx,0x5A);//尾
}

整数コードを送信:

	t=(mode>>0)&0x00FF;
	sum+=t;
	Usart_SendByte(pUSARTx,t);
	t=(mode>>8)&0x00FF;
	sum+=t;
	Usart_SendByte(pUSARTx,t);
	t=(mode>>16)&0x00FF;
	sum+=t;
	Usart_SendByte(pUSARTx,t);
	t=(mode>>24)&0x00FF;
	sum+=t;
	Usart_SendByte(pUSARTx,t);

ホスト コンピューターのデータ パッケージの構成

(1) ホストコンピュータがデータを送信するパケットの設定
パケット ヘッダー (1) + c (1) + num (4) + チェック ディジット (1) + パケット テール (1) = 8 バイト

写真の説明を追加してください
(2) ホストコンピュータ受信データパケット設定:
パケットヘッダ(1) + ok(1) + パリティディジット(1) + パケットテール(1) = 4バイト
写真の説明を追加してください
(3) データパケット構造設定
写真の説明を追加してください
(4) ホストコンピュータグラフィックインターフェース編集:
send:
num: 編集可能なテキスト
c: スイッチ
receive:
ok: テキスト
写真の説明を追加してください

3. デバッグ結果

1. main 関数のサンプル コード:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"

#include "function.h"

extern uint8_t Flag;  //数据包是否发送
INPUT Rec;			      //从车回馈信息 


 int main(void)
 {
    
    	
	delay_init();	    //延时函数初始化	  
	LED_Init();		  	//初始化与LED连接的硬件接口
	USART_Config();   //串口二初始化,若想更改 请在 bsp_usart.h 头文件更改配置

	while(1)
	{
    
    
		if(Flag == 1)   //接收到数据
		{
    
    
			Rec = DATARecv(); //将数据包的数据赋值到结构体中
			if(Rec.c == 0)    //如果接收到0,灭灯
				LED0 = 1;
			else 			  //其他情况开灯	
				LED0 = 0;
			BL_Send(USART2,Rec.num);//将接收的num发送回去
		}
	}
 }

 

2. 結果:
最初はライトがオフで、データ 100 を送信し、データ 100 を返したことがわかります。
写真の説明を追加してください

写真の説明を追加してください
スイッチ c をオンにして num データを変更すると、小さなライトが点灯し、データの変更が返されます。
写真の説明を追加してください

写真の説明を追加してください

4.まとめ

問題の概要

1. Bluetooth モジュールが AT コマンドモードに入れない?
Bluetooth モジュールが壊れているので、別のものに交換してください
2. AT コマンド モードに入ることができますが、コマンドを送信しても OK が返されませんか?
Bluetooth モジュールが壊れています。直接交換してください
3. 携帯電話が Bluetooth モジュールに接続できない、またはセット名の Bluetooth モジュールが見つからない場合は、
解決策: もう一度電源を入れて、
AT+ADDR? で Bluetooth モジュールのアドレスを確認し、対応するアドレスを見つけて接続します
4. 携帯電話の上位コンピュータから送信されたデータを受信できませんか?
受信コードを確認して、教えた方法で設定されているか確認してください
5. 携帯電話のホストコンピュータはデータを受信できませんか?
データ パケットのフォーマットが正しいかどうか、およびチェック ディジットが正しく計算されているかどうかを確認します。
6. 受信データが乱れていますか?
上記の割り込み受信関数のように、パケットの先頭から受信を開始し、パケットの最後で終了するようにして、データが置き忘れないようにする必要があります
。コメント欄かプライベートメッセージください。

要約する

実際、STM32 と STM32 の間の通信は同じ方法で、上記のコードの別のコピーを書き込み、データ パケットの受信を変更します。
上部のコンピューターは Bluetooth デバッガーを使用し、コードは自分で変更します。必要に応じて、私にプライベート メッセージを送信できます。
HC-05 Bluetooth モジュール ルーチン
リンク: https://pan.baidu.com/s/1-dNXPluImjaH1PcfHfpMyA?pwd=6666
抽出コード: 6666

おすすめ

転載: blog.csdn.net/qq_52608074/article/details/127970509