⏩ 여러분 안녕하세요! 임베디드 매니아이자 시스템 아키텍트가 되고 싶은 후배 샤오광입니다.
⏩과거에는 전기 레이스든 프로젝트든 휴대폰과 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