前言

本篇博客详细的介绍如何实现HC08主从机设置,命名,以及如何实现两个STM32通过HC08互相通信,并附带完整的操作步骤,以及源代码。

目录

一、HC08主从配置

1.1VOFA+的下载及基本用法

1.1.1VOFA+的下载        

1.1.2VOFA+的基本用法   

1.2配置HC08主从机及其他

二、两个STM32通过HC08互相通信

2.1硬件连接

2.2软件实现(附完整源码)

三.手机APP连接HC08

四.HC08的AT指令表


一、HC08主从配置

1.1VOFA+的下载及基本用法

1.1.1VOFA+的下载        

VOFA+是一款非常简单好用的串口上位机软件,既可以监视波形调试参数,又可以发送串口指令,满足电赛控制题调试的一切需求,是未来拿下国一同学们的必备工具,官网下载链接如下:

                                                      下载中心 | VOFA-Plus上位机

图1是VOFA+的界面,一般只需要修改端口号与波特率,按照STM32配置的串口波特率修改即可。

   


Android 蓝牙下发指令_stm32

图1

1.1.2VOFA+的基本用法   

1.蓝色图标是启动按钮,成功连接后,接受发送来的串口数据,闪蓝色。

2.红色图标是协议与连接,在此界面设置串口参数配置,如图2。


Android 蓝牙下发指令_嵌入式硬件_02

图2

       

3.绿色图标界面设置串口指令,点击选择“命令”,如图3。


Android 蓝牙下发指令_嵌入式硬件_03

图3

4.成功生成“命令8”,选择编辑,可以修改名称和发送内容,编辑完成后,双击退出编辑,点击“命令8”控件,就可以发送“1234”了如图4(未退出编辑模式),之后就需要用这个功能给HC08发送信息。


Android 蓝牙下发指令_嵌入式硬件_04

图4

1.2配置HC08主从机及其他

基本步骤:

1.利用USB转串口模块,将HC08物理连接电脑,并打开VOFA+真正与HC08串口通讯,波特率设置为9600(出厂默认波特率是9600,连接上后可以自定义)。

2.按照AT指令表,编辑VOFA+的命令工具,向HC08发送对应的AT指令。

注意:设置一个为主机,一个为从机,上电即可自动连接。HC08 支持一对一连接,第一次连接后,主机会自动记忆配对对象。如需连接其他模块,必须先清除配对记忆。主从机可以互发消息。(配对中HC08板载灯闪烁,连接成功板载灯常亮

图5中,我的命令控件叫“设置主机”,发送的内容为“AT+ROLE=M”,查AT指令表(附文末)知该命令设置主机,设置从机则改M为S,“AT+ROLE=S”


Android 蓝牙下发指令_Android 蓝牙下发指令_05

图5

图6中,我的命令控件叫“设置波特率”,发送的内容为懒得打了,如图所示,查表知该命令为设置HC08波特率,再次强调一下HC08出厂设置的波特率是9600


Android 蓝牙下发指令_嵌入式硬件_06

图6

二、两个STM32通过HC08互相通信

2.1硬件连接

Android 蓝牙下发指令_嵌入式硬件_07

2.2软件实现(附完整源码)

实现思路:

1.实现两个STM32与HC08主从机串口通讯。
2.连从机的STM32与连主机的STM32互相发送信息,收到对应消息点亮的板载灯。

注意:两灯均被点亮说明,实现互相通讯,代码方面两个单片机的代码是一样的,接受中断函数,判断是否收到另一个单片机发送的字符‘a’,同时在main函数的while(1)里一直向另一个单片机发送字符‘a’,现象是先后上电后,两个32的板载灯几乎同时被点亮。

main文件

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "HC08.h"

int main(void)
{

	HC08_Init();//初始化HC08串口
	GPIO_InitTypeDef  GPIO_InitStructure;//初始化板载灯B5

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOE, ENABLE);

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;				 
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 
	GPIO_Init(GPIOB, &GPIO_InitStructure);					 
	GPIO_ResetBits(GPIOB,GPIO_Pin_5);//熄灭B5					
	while (1)
	{
		HC08_SendByte('a');//发送‘a’
	}
}

HC08.h文件

#ifndef __HC08_H
#define __HC08_H

void HC08_Init(void);
void HC08_SendByte(uint8_t Byte);
//void HC08_SendString(char *String);

#endif

HC08.c文件

#include "stm32f10x.h"                  // Device header

void HC08_Init(void)//USART1 A9-TX A10-RX
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1, 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_IN_FLOATING;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate = 9600;//波特率
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
	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);
	
	USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1, ENABLE);
}

void HC08_SendByte(uint8_t Byte)
{
	USART_SendData(USART1, Byte);
	while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);
}

int HC08_data=0;
void USART1_IRQHandler(void)
{
	if(USART_GetITStatus(USART1,USART_IT_RXNE) != RESET)
	{
		HC08_data=USART_ReceiveData(USART1);
		if(HC08_data=='a')//如果STM32”A”发送的消息是‘a’,则板载灯被点亮
		{
		    GPIO_ResetBits(GPIOB,GPIO_Pin_5);
		}
	}
	USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}

三.手机APP连接HC08

步骤:

1.与步骤二的代码相同,不用修改现象是一样的,连接好后,手机端给HC08发送字符‘a’,即可点亮stm32板载灯。

2.下载蓝牙助手APP(此处蓝牙串口调试APP都可以连接,不一定非要下载HC蓝牙助手),附应用信息。

Android 蓝牙下发指令_stm32_08

3.连接搜索,用VOFA+命名的HC08,比如我叫LLBW,点击连接就行,之后发送字符‘a’,看是否点亮板载灯。(是否连接成功)

四.HC08的AT指令表

Android 蓝牙下发指令_单片机_09