新手入门
- 积分
- 11
- 金钱
- 11
- 注册时间
- 2020-1-4
- 在线时间
- 2 小时
|
1金钱
原本例程里hc05是接usart3的pb10和pb11 ,因为我已经把pb11接了dht11所以我用的usart1的pa9和pa10接的hc05的rx与tx,编译都没有问题,但是蓝牙连接上之后电脑上的串口调试助手一直收到问号或者空白数据,如图上一样,下面是我的主函数和hc05.c的代码 ,程序我也放附件里了,请各位帮我看看是怎么回事
int main(void)
{
u8 t=0;
u8 temperature;
u8 humidity;
u8 reclen=0;
int tmp;
BEEP_Init();//蜂鸣器初始化
delay_init(); //延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
DHT11_Init();//dht11初始化
OLED_Init(); //初始化OLED
usmart_dev.init(72); //初始化USMART
initial_olcd(); //初始化
clear_screen(); //清屏
disp_string_8x16_16x16(1,1,"温度:");
disp_string_8x16_16x16(3,1,"湿度:");
delay_ms(1000); //等待蓝牙模块上电稳定
HC05_Init(); //初始化ATK-HC05模块
USART_RX_STA=0;
while(1)
{
if(t%10==0) //每100ms读取一次
{
DHT11_Read_Data(&temperature,&humidity); //读取温湿度值
display_number_16x8(1,46,temperature);
display_number_16x8(3,46,humidity);
u1_printf("%d %d\r\n",temperature,humidity); //发送到蓝牙模块
tmp=(int)temperature;
if((tmp<=10) || (tmp>=25))
{
beep = !beep;
led2 = 1;
}
else
{
beep = 0;
led2 = 0;
}
delay_ms(50);
}
delay_ms(10);
t++;
if(t==20)
{
t=0;
}
if(USART_RX_STA&0X8000) //接收到一次数据了
{
reclen=USART_RX_STA&0X7FFF; //得到数据长度
USART_RX_BUF[reclen]=0; //加入结束符
if(reclen==9||reclen==8) //控制DS1检测
{
if(strcmp((const char*)USART_RX_BUF,"关闭报警器")==0); //关闭蜂鸣器
{
beep = 0;
}
}
USART_RX_STA=0;
// disp_string_8x16_16x16(5,1,USART_RX_BUF);
}
}
//////////////////////////////////////
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); //根据设定参数初始化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); //根据设定参数初始化GPIOA4
GPIO_SetBits(GPIOA,GPIO_Pin_4);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
HC05_KEY=1;
HC05_LED=1;
usart_init(9600); //初始化串口1为:9600,波特率.
while(retry--)
{
HC05_KEY=1; //KEY置高,进入AT模式
delay_ms(10);
printf("AT\r\n"); //发送AT测试指令
HC05_KEY=0; //KEY拉低,退出AT模式
for(t=0;t<10;t++) //最长等待50ms,来接收HC05模块的回应
{
if(USART_RX_STA&0X8000)break;
delay_ms(5);
}
if(USART_RX_STA&0X8000) //接收到一次数据了
{
temp=USART_RX_STA&0X7FFF; //得到数据长度
USART_RX_STA=0;
if(temp==4&&USART_RX_BUF[0]=='O'&&USART_RX_BUF[1]=='K')
{
temp=0;//接收到OK响应
break;
}
}
}
if(retry==0)temp=1; //检测失败
return temp;
}
//////////下面是u1_printf的代码
void u1_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART_TX_BUF); //此次发送数据的长度
for(j=0;j<i;j++) //循环发送数据
{
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART1,USART_TX_BUF[j]);
}
}
|
|