HC-05 블루투스 모듈 -------- 휴대폰 및 STM32 통신(코드 작성)(호스트 컴퓨터 구성) 유모 수준 자습서


⏩ 여러분 안녕하세요! 임베디드 매니아이자 시스템 아키텍트가 되고 싶은 후배 샤오광입니다.
⏩과거에는 전기 레이스든 프로젝트든 휴대폰과 stm32 간의 통신, 전기 레이스의 두 대의 차량 통신 또는 원격 감지 자동차의 stm32 및 stm32 등 ⏩이 기사는
HC-05 Bluetooth 모듈과 휴대폰 간의 통신에 대한 자세한 자습서입니다.
⏩읽어주셔서 감사합니다. 제가 틀렸다면 정정해주세요.
HC-05 블루투스 모듈 루틴
링크: https://pan.baidu.com/s/1-dNXPluImjaH1PcfHfpMyA?pwd=6666
추출 코드: 6666



1. 블루투스 모듈 원리

1. 블루투스 모듈의 작동 원리

Bluetooth 장치는 전파를 사용하여 전화기와 컴퓨터를 연결합니다. Bluetooth 제품은 연결을 지원하는 Bluetooth 라디오 및 소프트웨어와 함께 작은 Bluetooth 모듈로 구성됩니다. 두 개의 Bluetooth 장치가 서로 통신하려면 페어링해야 합니다. Bluetooth 장치 간의 통신은 Bluetooth 기술을 사용하여 연결된 장치 네트워크인 피코넷이라는 단거리 임시 네트워크를 통해 이루어집니다. 이 유형의 네트워크는 연결된 2~8개의 장치를 수용할 수 있습니다. 네트워크 환경이 성공적으로 생성되면 하나의 장치가 마스터 장치로 작동하고 다른 모든 장치는 슬레이브 장치로 작동합니다. Intang Zhongchuang은 Bluetooth 장치가 무선 단거리 센서에 합류하고 이탈할 때 동적으로 자동으로 설정합니다.

2. 블루투스 모듈의 전송 방식

최근 몇 년 동안 블루투스 기술의 지속적인 발전으로 블루투스의 전송 속도는 지속적으로 향상되고 전력 소비는 지속적으로 감소하여 블루투스의 적용 범위가 더욱 광범위해졌습니다. 그러나 완전한 블루투스 시스템을 설계하려면 무선 주파수 설계, 프로토콜 스택, 시스템 통합 및 블루투스 모듈 선택 및 기타 전문 지식 측면과 같은 블루투스 관련 기술 지식을 완전히 마스터해야 합니다.
Bluetooth 모듈은 직렬 포트(SPI, IIC) 및 MCU 제어 장치를 통해 데이터를 전송할 수 있습니다. Bluetooth 모듈은 호스트와 슬레이브로 사용할 수 있습니다. 마스터는 다른 Bluetooth 모듈을 검색하고 능동적으로 연결을 설정할 수 있지만 슬레이브는 능동적으로 연결을 설정할 수 없으며 다른 사람이 연결될 때까지만 기다릴 수 있습니다.

3. 블루투스 모듈의 종류

1. HC-05 Bluetooth 모듈 소개
HC-05 Bluetooth 직렬 통신 모듈(이하 모듈이라고 함)에는 명령 응답 작동 모드와 자동 연결 작동 모드의 두 가지 작동 모드가 있습니다.자동 연결 작동 모드에서 모듈은 마스터(Master), 슬레이브(Slave) 및 루프백(Loopback) 세 가지 직무 역할로 나뉩니다.
모듈이 자동 연결 작업 모드에 있을 때 사전 설정된 방법에 따라 자동으로 데이터를 전송하고 모듈이 명령 응답 작업 모드에 있을 때 다음 모든 AT 명령을 실행할 수 있으며 사용자는 다양한 보낼 수 있습니다. 모듈을 설정하기 위해 모듈에 AT 명령 제어 매개 변수를 설정하거나 제어 명령을 내립니다. 모듈의 외부 핀(PIO11)의 입력 레벨을 제어하여 모듈의 두 작동 모드 간 전환을 실현할 수 있습니다.
2. HC-06 슬레이브 블루투스 모듈은
슬레이브로만 사용할 수 있습니다.
기타 저전력 BLE 블루투스 4.0 모듈(cc2540 또는 cc2541), JDY-10 블루투스 4.0 BLE 모듈 등이 있습니다. 여기서는 HC-05 블루투스 모듈을 사용합니다. 예로서.

2. 휴대폰과 STM32 간의 통신

1. 블루투스 모듈 구성

구성 단계:
(1) 블루투스 모듈의 en 버튼을 길게 눌러 USB-TTL 모듈을 통해 컴퓨터에 연결합니다.
모듈이 2초 간격으로 깜박이면 연결이 성공하고 AT 명령 모드로 들어가는 것입니다.
참고: 버튼이 없으면 en 핀을 high에 연결한 다음 USB를 통해 TTL로 컴퓨터에 연결하십시오.
(2) XCOM(직렬 포트 디버깅 도우미)을 열고 연결된 직렬 포트를 선택하고 전송 속도를 38400으로 구성하고 직렬 포트를 엽니다.
여기에 이미지 설명 삽입
참고: 직렬 포트를 찾을 수 없는 경우 CH340 드라이버가 설치되어 있는지 확인하십시오.
(3) 명령 구성:
입력: AT+ORGL\\기본 상태
복원 반환: 확인
입력: AT
반환: 확인
입력: AT+NAME=xiaoguang\\블루투스 장치 이름 설정
반환: 확인
입력: AT+PSWD=1234\\블루투스 장치 암호 설정
반환: 확인
입력: AT+UART=9600,0,0\\ 시리얼 웨이브 전송 속도를 115200으로 설정, 정지 비트 없음, 패리티 비트 없음
반환: OK
입력: AT+CMODE=1\\모든 블루투스 주소 연결
반환: OK
참고: AT+NAME?명령을 제외하고 OK가 반환되지 않으면 Bluetooth 모듈이 명령 응답 모드로 들어가는지 확인하십시오.
(4) 블루투스 모듈이 다시 켜지고 표시등이 빠르게 깜박입니다. 휴대폰에서 블루투스 디버거를 켜서 블루투스 모듈에 연결합니다. 연결 후 블루투스 모듈이 2초 간격으로 두 번 깜박입니다.
사진 설명을 추가해주세요
이름을 찾을 수 없으면 AT+ADDR?주소를 확인하고 지침에 따라 연결할 수 있습니다.
여기로 이동하면 블루투스 모듈이 이미 휴대폰과 연결될 수 있음을 알 수 있습니다.

2. 코드 작성

우리가 구성하는 통신 프로토콜은
패킷 헤더(0xA5) + 데이터 + 패리티 + 패킷 끝(0x5A)입니다.
이 예에서 수신할 데이터는 int 정수와 char 유형으로 총 5바이트이므로 a 전체 패킷은 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) + 숫자(4) + 검사 숫자(1) + 패킷 테일(1) = 8바이트

사진 설명을 추가해주세요
(2) 호스트 컴퓨터 수신 데이터 패킷 설정:
패킷 헤더(1) + ok(1) + 패리티 숫자(1) + 패킷 테일(1) = 4바이트
사진 설명을 추가해주세요
(3) 데이터 패킷 구조 설정
사진 설명을 추가해주세요
(4) 호스트 컴퓨터 그래픽 인터페이스 편집 :
보내기:
숫자: 편집 가능한 텍스트
c: 스위치
수신:
확인: 텍스트
사진 설명을 추가해주세요

3. 디버깅 결과

1. 주요 기능의 샘플 코드:

#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 명령 모드로 들어갈 수 없습니까?
블루투스 모듈이 고장났으니 다른 모듈로 교체하면 됩니다
2. AT 명령 모드로 들어갈 수 있지만 명령을 보내면 OK가 반환되지 않습니다.
블루투스 모듈이 고장났습니다. 직접 교체하십시오.
3. 휴대폰이 블루투스 모듈과 연결할 수 없거나 설정된 이름의 블루투스 모듈을 찾을 수 없습니까?
해결 방법: 전원을 다시 켜고
AT+ADDR?를 통해 블루투스 모듈의 주소를 확인하고 해당 주소를 찾아 연결하십시오
4. 휴대폰의 상위 컴퓨터에서 보낸 데이터를 받을 수 없습니까?
제가 가르쳐드린 방법으로 수신코드가 구성되어 있는지 확인해보세요
5. 휴대폰 호스트 컴퓨터가 데이터를 수신할 수 없나요?
데이터 패킷의 형식이 올바른지, 체크 디지트가 올바르게 계산되었는지 확인하십시오.
6. 수신된 데이터가 불규칙합니까?
위의 인터럽트 수신 기능과 같아 패킷의 처음부터 수신을 시작하고 패킷의 끝에서 끝나야 데이터가 잘못 배치되지 않습니다.참고: 여전히 해결되지 않은
문제가 있는 경우 댓글 영역이나 개인 메시지 나에게.

요약하다

사실 STM32와 STM32 사이의 통신은 같은 방식으로 위의 코드를 또 복사하여 데이터 패킷 수신을 변경하는 것이다.
위의 컴퓨터는 블루투스 디버거를 사용하며, 코드는 제가 직접 변경하고, 필요하시면 저에게 비공개 메시지를 보내주셔도 됩니다.
HC-05 블루투스 모듈 루틴
링크: https://pan.baidu.com/s/1-dNXPluImjaH1PcfHfpMyA?pwd=6666
추출 코드: 6666

Supongo que te gusta

Origin blog.csdn.net/qq_52608074/article/details/127970509
Recomendado
Clasificación