最近學(xué)習(xí)使用HC05 藍(lán)牙模塊進(jìn)行單片機(jī) 連接使用,進(jìn)行手機(jī)端數(shù)據(jù)通信,用到了,和大家分享一下。
HC05 藍(lán)牙模塊介紹
HC05 模塊,是 ALIENTEK 生成的一款高性能主從一體藍(lán)牙串口模塊,可以同各種帶藍(lán)牙功能的電腦、藍(lán)牙主機(jī)、手機(jī)、PDA、PSP 等智能終端配對(duì),該模塊支持非常寬的波特率范圍:4800~1382400,并且模塊兼容 5V 或 3.3V 單片機(jī)系統(tǒng),可以很方便與您的產(chǎn)品進(jìn)行連接。
實(shí)物圖如下(正反兩面)
接線方式
RXD ----------------->T
TXD ------------------>R
GND ------------------->GND
VCC -------------------->VCC(5v)
EN/KEY ----------------->VCC(3.3v )
配置成功后通信只需要連接4跟線即可(RXD,TXD,GND ,VCC)實(shí)現(xiàn)藍(lán)牙通信
可以直接接線在stm32各類(lèi)型好板子進(jìn)行配置,也可以u(píng)sb 配置如下圖
該模塊的使用方式
AT指令操作
藍(lán)牙模塊需要通過(guò)AT指令進(jìn)行模式與連接的設(shè)置,不同型號(hào)的藍(lán)牙模塊它的AT指令也可能會(huì)有差別,如果發(fā)現(xiàn)發(fā)送指令后模塊沒(méi)有回應(yīng),檢查一下AT指令是否發(fā)送正確,是否進(jìn)入命令模式,這里就要查看自己手中的兩個(gè)藍(lán)牙模塊的資料包了,若兩個(gè)藍(lán)牙模塊不同,則它們的配置指令也可能會(huì)不相同,就要用對(duì)應(yīng)的指令配置了。
串口工具示例1(正確返回OK)
串口工具示例2
以上2種串口工具均可以配置
模塊連接
要連接兩個(gè)藍(lán)牙模塊,就相當(dāng)于兩個(gè)藍(lán)牙模塊進(jìn)行配對(duì),也就是兩個(gè)藍(lán)牙設(shè)備進(jìn)行配對(duì),那么應(yīng)該用哪一個(gè)去尋找目標(biāo)對(duì)應(yīng)的藍(lán)牙設(shè)備呢?這里就需要一個(gè)設(shè)備為主機(jī),另一個(gè)設(shè)備則為從機(jī),只能通過(guò)主機(jī)來(lái)尋找從機(jī)進(jìn)行連接配對(duì),從機(jī)只能等待連接,而不能主動(dòng)地尋找設(shè)備進(jìn)行連接。
說(shuō)到主機(jī)與從機(jī),就要看看自己手中的藍(lán)牙模塊是否支持主機(jī)模式了,至少要有一塊主從一體的藍(lán)牙模塊,這里我簡(jiǎn)單直接將HC05 設(shè)置為從機(jī),用手機(jī)去連接進(jìn)行通信。(該模塊支持藍(lán)牙4.0,基本上4G,5G手機(jī)藍(lán)牙已經(jīng)是5.0 了,所以我用老款手機(jī))
我的配置要求
HC05
9600
從機(jī)
1234
配置完成后,即可進(jìn)行藍(lán)牙通訊連接
//------------------------------前面的都是第一步藍(lán)牙的配置,下面開(kāi)始通信編寫(xiě)代碼---------------------------------------------//
通信思路
藍(lán)牙模塊連接串口3,進(jìn)行手機(jī)連接藍(lán)牙發(fā)送內(nèi)容和命令操作
HC05部分
//初始化HC05模塊
//返回值:0,成功;1,失敗.
u8 HC05_Init(void)
{
u8 retry=10,t;
u8 temp=1;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能PORTA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉輸入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化A15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根據(jù)設(shè)定參數(shù)初始化GPIOA4
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
HC05_KEY=1;
HC05_LED=1;
USART3_Init(9600); //初始化串口3為:9600,波特率.
while(retry--)
{
HC05_KEY=1; //KEY置高,進(jìn)入AT模式
delay_ms(10);
u3_printf("AT\r\n"); //發(fā)送AT測(cè)試指令
HC05_KEY=0; //KEY拉低,退出AT模式
for(t=0;t<10;t++) //最長(zhǎng)等待50ms,來(lái)接收HC05模塊的回應(yīng)
{
if(USART3_RX_STA&0X8000)break;
delay_ms(5);
}
if(USART3_RX_STA&0X8000) //接收到一次數(shù)據(jù)了
{
temp=USART3_RX_STA&0X7FFF; //得到數(shù)據(jù)長(zhǎng)度
USART3_RX_STA=0;
if(temp==4&&USART3_RX_BUF[0]=='O'&&USART3_RX_BUF[1]=='K')
{
temp=0;//接收到OK響應(yīng)
break;
}
}
}
if(retry==0)temp=1; //檢測(cè)失敗
return temp;
}
//獲取HC05模塊的角色
//返回值:0,從機(jī);1,主機(jī);0XFF,獲取失敗.
u8 HC05_Get_Role(void)
{
u8 retry=0X0F;
u8 temp,t;
while(retry--)
{
HC05_KEY=1; //KEY置高,進(jìn)入AT模式
delay_ms(10);
u3_printf("AT+ROLE?\r\n"); //查詢角色
for(t=0;t<20;t++) //最長(zhǎng)等待200ms,來(lái)接收HC05模塊的回應(yīng)
{
delay_ms(10);
if(USART3_RX_STA&0X8000)break;
}
HC05_KEY=0; //KEY拉低,退出AT模式
if(USART3_RX_STA&0X8000) //接收到一次數(shù)據(jù)了
{
temp=USART3_RX_STA&0X7FFF; //得到數(shù)據(jù)長(zhǎng)度
USART3_RX_STA=0;
if(temp==13&&USART3_RX_BUF[0]=='+')//接收到正確的應(yīng)答了
{
temp=USART3_RX_BUF[6]-'0';//得到主從模式值
break;
}
}
}
if(retry==0)temp=0XFF;//查詢失敗.
return temp;
}
//HC05設(shè)置命令
//此函數(shù)用于設(shè)置HC05,適用于僅返回OK應(yīng)答的AT指令
//atstr:AT指令串.比如:"AT+RESET"/"AT+UART=9600,0,0"/"AT+ROLE=0"等字符串
//返回值:0,設(shè)置成功;其他,設(shè)置失敗.
u8 HC05_Set_Cmd(u8* atstr)
{
u8 retry=0X0F;
u8 temp,t;
while(retry--)
{
HC05_KEY=1; //KEY置高,進(jìn)入AT模式
delay_ms(10);
u3_printf("%s\r\n",atstr); //發(fā)送AT字符串
HC05_KEY=0; //KEY拉低,退出AT模式
for(t=0;t<20;t++) //最長(zhǎng)等待100ms,來(lái)接收HC05模塊的回應(yīng)
{
if(USART3_RX_STA&0X8000)break;
delay_ms(5);
}
if(USART3_RX_STA&0X8000) //接收到一次數(shù)據(jù)了
{
temp=USART3_RX_STA&0X7FFF; //得到數(shù)據(jù)長(zhǎng)度
USART3_RX_STA=0;
if(temp==4&&USART3_RX_BUF[0]=='O')//接收到正確的應(yīng)答了
{
temp=0;
break;
}
}
}
if(retry==0)temp=0XFF;//設(shè)置失敗.
return temp;
}
///
//str:命令串.(這里注意不再需要再輸入回車(chē)符)
void HC05_CFG_CMD(u8 *str)
{
u8 temp;
u8 t;
HC05_KEY=1; //KEY置高,進(jìn)入AT模式
delay_ms(10);
u3_printf("%s\r\n",(char*)str); //發(fā)送指令
for(t=0;t<50;t++) //最長(zhǎng)等待500ms,來(lái)接收HC05模塊的回應(yīng)
{
if(USART3_RX_STA&0X8000)break;
delay_ms(10);
}
HC05_KEY=0; //KEY拉低,退出AT模式
if(USART3_RX_STA&0X8000) //接收到一次數(shù)據(jù)了
{
temp=USART3_RX_STA&0X7FFF; //得到數(shù)據(jù)長(zhǎng)度
USART3_RX_STA=0;
USART3_RX_BUF[temp]=0; //加結(jié)束符
printf("\r\n%s",USART3_RX_BUF);//發(fā)送回應(yīng)數(shù)據(jù)到串口1
}
}
主函數(shù)
//顯示HC05模塊的主從狀態(tài)
void HC05_Role_Show(void)
{
if(HC05_Get_Role()==1)
{
LCD_ShowString(10,140,200,16,16,"ROLE:Master"); //主機(jī)
}
else
{
LCD_ShowString(10,140,200,16,16,"ROLE:Slave "); //從機(jī)
}
}
//顯示HC05模塊的連接狀態(tài)
void HC05_Sta_Show(void)
{
if(HC05_LED)
{
LCD_ShowString(110,140,120,16,16,"STA:Connected "); //連接成功
}
else
{
LCD_ShowString(110,140,120,16,16,"STA:Disconnect"); //未連接
}
}
int main()
{
u8 t=0;
u8 key;
u8 sendmask=0;
u8 sendcnt=0;
u8 sendbuf[20];
u8 reclen=0;
SysTick_Init(72);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中斷優(yōu)先級(jí)分組 分2組
LED_Init();
KEY_Init();
USART1_Init(115200);
TFTLCD_Init(); //LCD初始化
FRONT_COLOR=RED;
LCD_ShowString(10,10,tftlcd_data.width,tftlcd_data.height,16,"PRECHIN");
LCD_ShowString(10,30,tftlcd_data.width,tftlcd_data.height,16,"www.prechin.com");
LCD_ShowString(10,50,tftlcd_data.width,tftlcd_data.height,16,"BT05 BlueTooth Test");
delay_ms(1000); //等待藍(lán)牙模塊上電穩(wěn)定
while(HC05_Init()) //初始化HC05模塊
{
printf("HC05 Error!\r\n");
LCD_ShowString(10,90,200,16,16,"HC05 Error! ");
delay_ms(500);
LCD_ShowString(10,90,200,16,16,"Please Check!!!");
delay_ms(100);
}
printf("HC05 OK!\r\n");
LCD_ShowString(10,90,210,16,16,"KEY_UP:ROLE KEY1:SEND/STOP");
LCD_ShowString(10,110,200,16,16,"HC05 Standby!");
LCD_ShowString(10,160,200,16,16,"Send:");
LCD_ShowString(10,180,200,16,16,"Receive:");
FRONT_COLOR=BLUE;
HC05_Role_Show();
delay_ms(100);
USART3_RX_STA=0;
while(1)
{
key=KEY_Scan(0);
if(key==KEY_UP_PRESS) //切換模塊主從設(shè)置
{
key=HC05_Get_Role();
if(key!=0XFF)
{
key=!key; //狀態(tài)取反
if(key==0)HC05_Set_Cmd("AT+ROLE=0");
else HC05_Set_Cmd("AT+ROLE=1");
HC05_Role_Show();
HC05_Set_Cmd("AT+RESET"); //復(fù)位HC05模塊
delay_ms(200);
}
}
else if(key==KEY1_PRESS)
{
sendmask=!sendmask; //發(fā)送/停止發(fā)送
if(sendmask==0)LCD_Fill(10+40,160,240,160+16,WHITE);//清除顯示
}
else delay_ms(10);
if(t==50)
{
if(sendmask) //定時(shí)發(fā)送
{
sprintf((char*)sendbuf,"PREHICN HC05 %d\r\n",sendcnt);
LCD_ShowString(10+40,160,200,16,16,sendbuf); //顯示發(fā)送數(shù)據(jù)
printf("%s\r\n",sendbuf);
u3_printf("PREHICN HC05 %d\r\n",sendcnt); //發(fā)送到藍(lán)牙模塊
sendcnt++;
if(sendcnt>99)sendcnt=0;
}
HC05_Sta_Show();
t=0;
LED1=!LED1;
}
if(USART3_RX_STA&0X8000) //接收到一次數(shù)據(jù)了
{
LCD_Fill(10,200,240,320,WHITE); //清除顯示
reclen=USART3_RX_STA&0X7FFF; //得到數(shù)據(jù)長(zhǎng)度
USART3_RX_BUF[reclen]='\0'; //加入結(jié)束符
printf("reclen=%d\r\n",reclen);
printf("USART3_RX_BUF=%s\r\n",USART3_RX_BUF);
if(reclen==10||reclen==11) //控制D2檢測(cè)
{
if(strcmp((const char*)USART3_RX_BUF,"+LED2 ON\r\n")==0)LED2=0;//打開(kāi)LED2
if(strcmp((const char*)USART3_RX_BUF,"+LED2 OFF\r\n")==0)LED2=1;//關(guān)閉LED2
}
LCD_ShowString(10,200,209,119,16,USART3_RX_BUF);//顯示接收到的數(shù)據(jù)
USART3_RX_STA=0;
}
t++;
}
}
串口1
int fputc(int ch,FILE *p) //函數(shù)默認(rèn)的,在使用printf函數(shù)時(shí)自動(dòng)調(diào)用
{
USART_SendData(USART1,(u8)ch);
while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);
return ch;
}
//串口1中斷服務(wù)程序
//注意,讀取USARTx->SR能避免莫名其妙的錯(cuò)誤
u8 USART1_RX_BUF[USART1_REC_LEN]; //接收緩沖,最大USART_REC_LEN個(gè)字節(jié).
//接收狀態(tài)
//bit15, 接收完成標(biāo)志
//bit14, 接收到0x0d
//bit13~0, 接收到的有效字節(jié)數(shù)目
u16 USART1_RX_STA=0; //接收狀態(tài)標(biāo)記
/*******************************************************************************
* 函 數(shù) 名 : USART1_Init
* 函數(shù)功能 : USART1初始化函數(shù)
* 輸 入 : bound:波特率
* 輸 出 : 無(wú)
*******************************************************************************/
void USART1_Init(u32 bound)
{
//GPIO端口設(shè)置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/* 配置GPIO的模式和IO口 */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX //串口輸出PA9
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化串口輸入IO */
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX //串口輸入PA10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING; //模擬輸入
GPIO_Init(GPIOA,&GPIO_InitStructure); /* 初始化GPIO */
//USART1 初始化設(shè)置
USART_InitStructure.USART_BaudRate = bound;//波特率設(shè)置
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個(gè)停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無(wú)奇偶校驗(yàn)位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無(wú)硬件數(shù)據(jù)流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_Cmd(USART1, ENABLE); //使能串口1
USART_ClearFlag(USART1, USART_FLAG_TC);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//開(kāi)啟相關(guān)中斷
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中斷通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//搶占優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelSubPriority =3; //子優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器、
}
/*******************************************************************************
* 函 數(shù) 名 : USART1_IRQHandler
* 函數(shù)功能 : USART1中斷函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void USART1_IRQHandler(void) //串口1中斷服務(wù)程序
{
u8 r;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中斷
{
r =USART_ReceiveData(USART1);//(USART1->DR); //讀取接收到的數(shù)據(jù)
if((USART1_RX_STA&0x8000)==0)//接收未完成
{
if(USART1_RX_STA&0x4000)//接收到了0x0d
{
if(r!=0x0a)USART1_RX_STA=0;//接收錯(cuò)誤,重新開(kāi)始
else USART1_RX_STA|=0x8000; //接收完成了
}
else //還沒(méi)收到0X0D
{
if(r==0x0d)USART1_RX_STA|=0x4000;
else
{
USART1_RX_BUF[USART1_RX_STA&0X3FFF]=r;
USART1_RX_STA++;
if(USART1_RX_STA>(USART1_REC_LEN-1))USART1_RX_STA=0;//接收數(shù)據(jù)錯(cuò)誤,重新開(kāi)始接收
}
}
}
}
}
串口3
//串口接收緩存區(qū)
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收緩沖,最大USART3_MAX_RECV_LEN個(gè)字節(jié).
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //發(fā)送緩沖,最大USART3_MAX_SEND_LEN字節(jié)
//通過(guò)判斷接收連續(xù)2個(gè)字符之間的時(shí)間差不大于10ms來(lái)決定是不是一次連續(xù)的數(shù)據(jù).
//如果2個(gè)字符接收間隔超過(guò)10ms,則認(rèn)為不是1次連續(xù)數(shù)據(jù).也就是超過(guò)10ms沒(méi)有接收到
//任何數(shù)據(jù),則表示此次接收完畢.
//接收到的數(shù)據(jù)狀態(tài)
//[15]:0,沒(méi)有接收到數(shù)據(jù);1,接收到了一批數(shù)據(jù).
//[14:0]:接收到的數(shù)據(jù)長(zhǎng)度
vu16 USART3_RX_STA=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到數(shù)據(jù)
{
res =USART_ReceiveData(USART3);
if((USART3_RX_STA&(1<<15))==0)//接收完的一批數(shù)據(jù),還沒(méi)有被處理,則不再接收其他數(shù)據(jù)
{
if(USART3_RX_STA<USART3_MAX_RECV_LEN) //還可以接收數(shù)據(jù)
{
TIM_SetCounter(TIM7,0);//計(jì)數(shù)器清空 //計(jì)數(shù)器清空
if(USART3_RX_STA==0) //使能定時(shí)器7的中斷
{
TIM_Cmd(TIM7,ENABLE);//使能定時(shí)器7
}
USART3_RX_BUF[USART3_RX_STA++]=res; //記錄接收到的值
}else
{
USART3_RX_STA|=1<<15; //強(qiáng)制標(biāo)記接收完成
}
}
}
}
//初始化IO 串口3
//pclk1:PCLK1時(shí)鐘頻率(Mhz)
//bound:波特率
void USART3_Init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB時(shí)鐘
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3時(shí)鐘使能
USART_DeInit(USART3); //復(fù)位串口3
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //復(fù)用推挽輸出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空輸入
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11
USART_InitStructure.USART_BaudRate = bound;//波特率一般設(shè)置為9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字長(zhǎng)為8位數(shù)據(jù)格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一個(gè)停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//無(wú)奇偶校驗(yàn)位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//無(wú)硬件數(shù)據(jù)流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收發(fā)模式
USART_Init(USART3, &USART_InitStructure); //初始化串口 3
USART_Cmd(USART3, ENABLE); //使能串口
//使能接收中斷
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//開(kāi)啟中斷
//設(shè)置中斷優(yōu)先級(jí)
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//搶占優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子優(yōu)先級(jí)3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根據(jù)指定的參數(shù)初始化VIC寄存器
TIM7_Int_Init(99,7199); //10ms中斷
USART3_RX_STA=0; //清零
TIM_Cmd(TIM7,DISABLE); //關(guān)閉定時(shí)器7
}
//串口3,printf 函數(shù)
//確保一次發(fā)送數(shù)據(jù)不超過(guò)USART3_MAX_SEND_LEN字節(jié)
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF); //此次發(fā)送數(shù)據(jù)的長(zhǎng)度
for(j=0;j<i;j++) //循環(huán)發(fā)送數(shù)據(jù)
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循環(huán)發(fā)送,直到發(fā)送完畢
USART_SendData(USART3,USART3_TX_BUF[j]);
}
}
串口軟件和手機(jī)助手軟件以及PZ-HC05藍(lán)牙模塊開(kāi)發(fā)手冊(cè)–整理好放在百度網(wǎng)盤(pán),請(qǐng)前往下載
鏈接:https://pan.baidu.com/s/1jIcNQIdTpD8tQpnPk052NQ
提取碼:j0nr
–來(lái)自百度網(wǎng)盤(pán)超級(jí)會(huì)員V10的分享文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-792651.html
上一節(jié)學(xué)習(xí) stm32(TTL)串口通信控制16路舵機(jī)控制板(維特智能)
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-792651.html
到了這里,關(guān)于學(xué)習(xí) stm32 無(wú)線藍(lán)牙模塊HC05配置與應(yīng)用(手機(jī)藍(lán)牙連接發(fā)送參數(shù))的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!