OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7158|回复: 36

简单的用USART3控制蓝牙模块,与手机相连接受信息

[复制链接]

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
发表于 2015-7-23 13:17:58 | 显示全部楼层 |阅读模式
5金钱
我只想用USART3控制蓝牙的TXD,RXD口,不用KEY和LED,然后用手机蓝牙助手和蓝牙模块相连,从手机发送了一信息到蓝牙模块,然后可以显示到电脑XCOM上面。代码如下:
#include "delay.h"
#include "usart2.h"
#include "sys.h"
#include "stm32f10x_tim.h"

__align(8)  u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART2_MAX_SEND_LEN字节
#ifdef USART3_RX_EN   //如果使能了接收    
//串口接收缓存区
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART2_MAX_RECV_LEN个字节.
#endif

u16 USART3_RX_STA=0;  
void USART3_Init(u32 pclk1,u32 bound)
{
   //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART3|RCC_APB2Periph_GPIOB, ENABLE); //使能USART1,GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
     //USART1_TX  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    //USART1_RX  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);  

   //Usart1 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//蓝牙一般设置为38400;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

    USART_Init(USART3, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART3, ENABLE); 
}

void USART3_IRQHandler(void)
{
u8 res;    
if(USART3->SR&(1<<5))//接收到数据
{  
res=USART3->DR;  
if(USART3_RX_STA<USART3_MAX_RECV_LEN) //还可以接收数据
{
TIM4->CNT=0;         //计数器清空
if(USART3_RX_STA==0)TIM4_Set(1); //使能定时器4的中断 
USART3_RX_BUF[USART3_RX_STA++]=res; //记录接收到的值  
}else 
{
USART3_RX_STA|=1<<15; //强制标记接收完成

}    
}   

void TIM4_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStructure;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能

//定时器TIM3初始化
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断

//中断优先级NVIC设置
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM4中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //先占优先级3级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


TIM_Cmd(TIM4, ENABLE);  //使能TIMx  
}

void TIM4_IRQHandler(void)   //TIM4中断
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx更新中断标志 

}
}

void TIM4_Set(u8 sta)
{
if(sta)
{
    TIM4->CNT=0;         //计数器清空
TIM4->CR1|=1<<0;     //使能定时器4
}else TIM4->CR1&=~(1<<0);//关闭定时器4   
}


void  Send_HC05(u16 data)
{
USART3->DR=data;
while((USART3_RX_STA&0x40)==0);
}

u8 Receive_HC05(void)
{
u8 temp;
if((USART3_RX_STA&0x20)==0)
temp=USART3->DR;
return temp;
}


//u8 HC05_Init(void)
//{
// u8 retry=10,t;    
// u8 temp=1;
// RCC->APB2ENR|=1<<2;     //使能PORTA时钟
// RCC->APB2ENR|=1<<4;     //使能PORTC时钟
// GPIOA->CRL&=0XFFF0FFFF; //PA4,输入
// GPIOA->CRL|=0X00080000; 
// GPIOA->ODR|=1<<4; //PA4上拉 
// GPIOC->CRL&=0XFFF0FFFF; //PC4,推挽输出
// GPIOC->CRL|=0X00030000; 
// GPIOC->ODR|=1<<4; //PC4输出1
// USART3_Init(36,9600); //初始化串口2为:9600,波特率.
// while(retry--)
// {
// HC05_KEY=1; //KEY置高,进入AT模式
// delay_ms(10);
// u2_printf("AT\r\n"); //发送AT测试指令
// HC05_KEY=0; //KEY拉低,退出AT模式
// for(t=0;t<10;t++) //最长等待50ms,来接收HC05模块的回应
// {
// if(USART3_RX_STA&0X8000)break;
// delay_ms(5);
// }
// if(USART3_RX_STA&0X8000) //接收到一次数据了
// {
// temp=USART3_RX_STA&0X7FFF; //得到数据长度
// USART3_RX_STA=0;  
// if(temp==4&&USART3_RX_BUF[0]=='O'&&USART3_RX_BUF[1]=='K')
// {
// temp=0;//接收到OK响应
// break;
// }
// }    
// }    
// if(retry==0)temp=1; //检测失败
// return temp;  
//}  
////获取ATK-HC05模块的角色
////返回值:0,从机;1,主机;0XFF,获取失败.  
//u8 HC05_Get_Role(void)
//{    
// u8 retry=0X0F;
// u8 temp,t;
// while(retry--)
// {
// HC05_KEY=1; //KEY置高,进入AT模式
// delay_ms(10);
// u2_printf("AT+ROLE?\r\n"); //查询角色
// for(t=0;t<20;t++) //最长等待200ms,来接收HC05模块的回应
// {
// delay_ms(10);
// if(USART3_RX_STA&0X8000)break;
// }
// HC05_KEY=0; //KEY拉低,退出AT模式
// if(USART3_RX_STA&0X8000) //接收到一次数据了
// {
// temp=USART3_RX_STA&0X7FFF; //得到数据长度
// USART3_RX_STA=0;  
// if(temp==13&&USART3_RX_BUF[0]=='+')//接收到正确的应答了
// {
// temp=USART3_RX_BUF[6]-'0';//得到主从模式值
// break;
// }
// }
// }
// if(retry==0)temp=0XFF;//查询失败.
// return temp;
//} 




















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-23 13:18:29 | 显示全部楼层
主函数是:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "usart2.h"
#include "string.h"


int main()
{
u16 temp;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(); //延时初始化
uart_init(9600); 
USART3_Init(72,38400);
TIM4_Init(4999,7199);
temp=Receive_HC05();
printf("%d",temp);
}
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-23 13:19:14 | 显示全部楼层
为什么程序烧到板子上手机搜索不到蓝牙呢?
回复

使用道具 举报

13

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2013-11-12
在线时间
29 小时
发表于 2015-7-23 17:12:42 | 显示全部楼层
手机收索不到蓝牙是串口蓝牙模块的问题吧
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-23 17:35:57 | 显示全部楼层
回复【4楼】jiushibuzhidao:
---------------------------------
我发现把我用F4烧制例程成功了连接了一次,然后把中断的所有程序删了,就可以用了,但是现在又有一个新问题,我想给蓝牙发送数据,让他控制LED的亮灭,为什么不行呢?经鉴定,LED是没有错的,主程序如下:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "usart2.h"
#include "string.h"
#include "led.h"


int main()
{
u16 temp;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(); //延时初始化
uart_init(9600);
LED_Init();
USART3_Init(72,9600);
temp=Receive_HC05();
printf("%d",temp);
// LED0=0;
// LED1=0;
switch(temp)
{
case 00:
LED0=0;
delay_ms(100);
break;
case 01:
LED1=0;
delay_ms(100);
break;

}

}
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-23 17:37:36 | 显示全部楼层
我把蓝牙打开后进入键盘模式,然后设置LED0为00,LED1为01,为什么不行?求大神解答,在线等
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-23 17:46:18 | 显示全部楼层
难道是这个问题?
void  Send_HC05(u16 data)
{
USART3->DR=data;
while((USART3_RX_STA&0x40)==0);
}

u8 Receive_HC05(void)
{
u8 temp;
if((USART3_RX_STA&0x20)==0)
temp=USART3->DR;
return temp;
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-23 17:46:47 | 显示全部楼层
回复【7楼】程序媛:
---------------------------------
是不是这两个函数的问题?
回复

使用道具 举报

13

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2013-11-12
在线时间
29 小时
发表于 2015-7-23 19:28:07 | 显示全部楼层
回复【5楼】程序媛:
---------------------------------
首先你要确定你有没有收到发过来的数据,调试一下把
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-24 09:00:45 | 显示全部楼层
前面用的是库函数写的,所以不能用DR寄存器直接调用,改过的接收函数如下:
u8  GetData()
{
u8 temp;
while((USART_GetFlagStatus(USART3, USART_FLAG_RXNE))!=0)
{
temp = USART_ReceiveData(USART3);
}
return temp;
}
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-24 09:01:44 | 显示全部楼层
回复【9楼】jiushibuzhidao:
---------------------------------
如何测试是否有接收到数据呢?
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-24 09:22:20 | 显示全部楼层
把case之后的数改成十六进制,编制并且烧到板子上之后,只有LED0亮,但是不闪,这是怎么回事?说明读取到内存函数为0,还是系统默认temp为0但是并没有读取到数据呢?
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12687
金钱
12687
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-7-24 09:28:06 | 显示全部楼层
手机搜不到蓝牙基本就是蓝牙模块由问题

模块上电之后,如果正常的话,就可以搜到
学无止境
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-24 09:33:37 | 显示全部楼层
发现用XCOM时,只要打开串口就会接收一个0,但是不知道是哪里的,这是怎么回事?看来就是这个0让LED0亮起来的
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-24 11:05:43 | 显示全部楼层
又把GetData()改了一下,建立了一块数组,但是显然不是这里的问题,但是为什么打开串口之后自动收到一个0,让LED0亮起来了呢?代码如下:
u8  GetData()
{
u8 temp;
while((USART_GetFlagStatus(USART3, USART_FLAG_RXNE))!=0)
{
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)

{
temp =USART_ReceiveData(USART1);//(USART1->DR);

if((USART3_RX_STA&0x8000)==0)//接收未完成
{
if(USART3_RX_STA&0x4000)//接收到了0x0d
{
if(temp!=0x0a)USART3_RX_STA=0;//接收错误,重新开始
else USART3_RX_STA|=0x8000; //接收完成了 
}
else //还没收到0X0D
{
if(temp==0x0d)USART3_RX_STA|=0x4000;
else
{
USART3_RX_BUF[USART3_RX_STA&0X3FFF]=temp ;
USART3_RX_STA++;
if(USART3_RX_STA>(USART3_REC_LEN-1))USART3_RX_STA=0;//接收数据错误,重新开始接收   
}  
}
}
}
return temp;
}
}
回复

使用道具 举报

13

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2013-11-12
在线时间
29 小时
发表于 2015-7-24 11:12:25 | 显示全部楼层
回复【11楼】程序媛:
---------------------------------
调试跟踪,看数据的变化
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-24 11:20:28 | 显示全部楼层
回复【16楼】jiushibuzhidao:
---------------------------------
好高深呀~能不能说得简单点儿?
回复

使用道具 举报

13

主题

225

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2013-11-12
在线时间
29 小时
发表于 2015-7-24 11:24:28 | 显示全部楼层
回复【17楼】程序媛:
---------------------------------
用仿真器跟踪,看你的串口数据寄存器有没有数据进来
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-24 15:14:09 | 显示全部楼层
加入了中断,也不行,为什么?这是为什么?我要疯了!!!!!
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-24 17:53:41 | 显示全部楼层
就没有大神能帮我看一看吗?
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-7-23
在线时间
0 小时
发表于 2015-7-24 23:09:16 | 显示全部楼层
用手机通过蓝牙模块控制STM32的LED灯,我做过。如果串口和LED灯初始化没问题。LZ试试中断服务函数用这个

void USART1_IRQHandler(void)                 //
{
u16 a;
            
while(1)

while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){} 
  a= USART_ReceiveData(USART1); 

  switch(a)    
{
case 0ED1=0;break;
case 1ED1=1;break;  
}
USART_SendData(USART1,a); 
while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){}
 }
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-25 20:15:56 | 显示全部楼层
回复【21楼】飞翼:
---------------------------------
那主函数怎么写呀?我实在是个菜鸟,跪求答案~~在线等
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-25 21:20:59 | 显示全部楼层
回复【21楼】飞翼:
---------------------------------
主程序写成这样:
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "usart2.h"
#include "string.h"
#include "led.h"


int main()
{
// u16 X = 3;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(); //延时初始化
uart_init(9600);
LED_Init();
USART3_Init(36,9600);

while(1)
{

USART3_IRQHandler();

}
}
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-25 21:22:00 | 显示全部楼层
回复【21楼】飞翼:
---------------------------------
usart3.c写成这样行吗?
#include "delay.h"
#include "usart2.h"
#include "sys.h"
#include "stm32f10x_tim.h"
#include "usart.h"
#include "stdarg.h"
#include "stdio.h"    
#include "string.h"
#include "led.h"

//串口发送缓存区 
__align(8) u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];  //发送缓冲,最大USART2_MAX_SEND_LEN字节
#ifdef USART3_RX_EN    //如果使能了接收      
//串口接收缓存区 
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];  //接收缓冲,最大USART2_MAX_RECV_LEN个字节.
#endif

u16 USART3_RX_STA=0;  
void USART3_Init(u32 pclk1,u32 bound)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
//使能USART3,GPIOA时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
     //USART3_TX  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
    GPIO_Init(GPIOB, &GPIO_InitStructure);
   
    //USART3_RX   
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    GPIO_Init(GPIOB, &GPIO_InitStructure);  

   //Usart3 NVIC 配置

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

USART_InitStructure.USART_BaudRate = bound;//蓝牙一般设置为38400;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式

    USART_Init(USART3, &USART_InitStructure); //初始化串口
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
    USART_Cmd(USART3, ENABLE); 
}


void USART3_IRQHandler(void)                 // 

u16 a;
 
while(1)
{  
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET)
{}  
  a= USART_ReceiveData(USART1);  

  switch(a)     

case 0ED1=0;break; 
case 1ED1=1;break;   

USART_SendData(USART3,a);  
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET)
{}
}
}
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-25 21:22:50 | 显示全部楼层
但是手机显示连接失败,而且打开串口也什么都不打印。这是怎么回事?
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-7-23
在线时间
0 小时
发表于 2015-7-25 22:41:16 | 显示全部楼层
回复【25楼】程序媛:
---------------------------------
手机连接失败是因为蓝牙模块连接的问题,确保好线有没插错。我的HC05之前调好以后,连接上手机是没问题的。但是如果是用电脑的串口助手打开,回复任意16进制数字还是没回复的话,那就是程序问题。一步步解决吧。我再帮你看看程序
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-7-23
在线时间
0 小时
发表于 2015-7-25 22:49:48 | 显示全部楼层
回复【25楼】程序媛:
---------------------------------
程序大体看上去没问题,你串口助手的波特率有没调到9600,要和你初始化的波特率一致,才可以正常收发程序。
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-7-23
在线时间
0 小时
发表于 2015-7-25 23:28:47 | 显示全部楼层
回复【25楼】程序媛:
---------------------------------
中断服务函数的
a= USART_ReceiveData(USART1); 
改回
a= USART_ReceiveData(USART3);
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-26 08:45:48 | 显示全部楼层
回复【28楼】飞翼:
---------------------------------
按你说的改了,而且XCOM上设置的是9600,手机连接成功,但是XCOM上并不打印任何数据,是不是我主程序写的有问题?你再帮我看看行吗?
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-7-23
在线时间
0 小时
发表于 2015-7-26 13:17:33 | 显示全部楼层
#include "sys.h" 
#include "usart.h"
#include "delay.h"
#include "usart2.h" 
#include "string.h" 
#include "led.h" 


int main() 

// u16 X = 3; 
Stm32_Clock_Init(9); //系统时钟设置 
delay_init();  //延时初始化 
uart_init(9600); 
LED_Init();
USART3_Init(36,9600); 

while(1) 


u16 a;
  
while(1)
{   
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET) 
{}   
  a= USART_ReceiveData(USART1);   

  switch(a)      
{  
case 0ED1=0;break;  
case 1ED1=1;break;    
}  
USART_SendData(USART3,a);   
while(USART_GetFlagStatus(USART3, USART_FLAG_RXNE) == RESET) 
{} 



}



看样子LZ的中断服务函数是进不了,还有看看了你发的,你用的是F4啊,我的是F103。试试不用中断函数,在USART.C初始化串口就好,然后在MAIN函数写那一段
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-26 13:45:30 | 显示全部楼层
回复【30楼】飞翼:
---------------------------------
我用的是F1呀
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-26 13:50:10 | 显示全部楼层
回复【30楼】飞翼:
---------------------------------
为啥改了还是不行呀?能不能把你的源程序发过来我看看?是用库函数写的吗?在线等你~~
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-7-23
在线时间
0 小时
发表于 2015-7-26 13:53:57 | 显示全部楼层
我用的是F103串口1的。我可以发。

你先改成串口1试试
USART.C的
#include "sys.h"
#include "usart.h"   
//////////////////////////////////////////////////////////////////////////////////   
//????????ucos,?ò°ü?¨???????·????????.
#if SYSTEM_SUPPORT_UCOS
#include "includes.h" //ucos ????   
#endif
//////////////////////////////////////////////////////////////////////////////////  
//±????ò?????§?°??????????×÷???í???????????????ü????????
//ALIENTEK STM32??·?°?
//????1??????    
//??????×?@ALIENTEK
//????????:www.openedv.com
//????????:2012/8/18
//°?±???V1.5
//°??¨?ù??????°?±?????
//Copyright(C) ?????????í??×????????????? 2009-2019
//All rights reserved
//********************************************************************************
//V1.3???????÷ 
//?§???????????????????????¨?????è??.
//????????printf???§??
//???????????????ü??????.
//??????printf??????×?·????§??bug
//V1.4???????÷
//1,??????????????IO??bug
//2,??????USART_RX_STA,????????×??ó????×???????2??14??·?
//3,??????USART_REC_LEN,?????¨??????×??ó???í??????×?????(???ó??2??14??·?)
//4,??????EN_USART1_RX??????·???
//V1.5???????÷
//1,????????UCOSII???§??
//////////////////////////////////////////////////////////////////////////////////    
 

//////////////////////////////////////////////////////////////////
//?????????ú??,?§??printf????,?????è??????use MicroLIB   
#if 1
#pragma import(__use_no_semihosting)             
//±ê×????è?????§??????                 
struct __FILE 

int handle; 

}; 

FILE __stdout;       
//?¨??_sys_exit()??±???????°??÷?ú????    
_sys_exit(int x) 

x = x; 

//???¨??fputc???? 
int fputc(int ch, FILE *f)
{      
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); 
    USART_SendData(USART1,(uint8_t)ch);   
return ch;
}
#endif 

/*????microLib??·?·¨*/
 /* 
int fputc(int ch, FILE *f)
{
USART_SendData(USART1, (uint8_t) ch);

while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET) {}
   
    return ch;
}
int GetKey (void)  { 

    while (!(USART1->SR & USART_FLAG_RXNE));

    return ((int)(USART1->DR & 0x1FF));
}
*/
 
#if EN_USART1_RX   //??????????????
//????1????·??????ò
//×???,????USARTx->SR??±??????????????í?ó   
u8 USART_RX_BUF[USART_REC_LEN];     //????????,×??óUSART_REC_LEN??×???.
//????×???
//bit15?? ?????ê??±ê??
//bit14?? ??????0x0d
//bit13~0?? ???????????§×???????
u16 USART_RX_STA=0;       //????×???±ê??   

//??????IO ????1 
//bound:?¨????
void uart_init(u32 bound){
    //GPIO?????è??
    GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //????USART1??GPIOA?±??
  USART_DeInit(USART1);  //????????1
 //USART1_TX   A.9
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //???????ì????
    GPIO_Init(GPIOA, &GPIO_InitStructure); //??????PA9
   
    //USART1_RX   A.10
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//????????
    GPIO_Init(GPIOA, &GPIO_InitStructure);  //??????PA10


   //USART ???????è??

USART_InitStructure.USART_BaudRate = bound;//??°??è????9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//×??¤??8??????????
USART_InitStructure.USART_StopBits = USART_StopBits_1;//??????????
USART_InitStructure.USART_Parity = USART_Parity_No;//?????????é??
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//???????????÷????
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //??·?????

    USART_Init(USART1, &USART_InitStructure); //??????????
#if EN_USART1_RX   //??????????????  
   //Usart1 NVIC ????
    NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//??????????3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //×???????3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ?¨??????
NVIC_Init(&NVIC_InitStructure); //?ù?????¨????????????VIC?????÷
   
    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//????????
#endif
    USART_Cmd(USART1, ENABLE);                    //???????? 

}

void USART1_IRQHandler(void)                 //????1????·??????ò
{
int c;


while(USART_GetFlagStatus(USART1, USART_FLAG_RXNE) == RESET){} //??????

c= (USART_ReceiveData(USART1)); //??????


USART_SendData(USART1,c); 

while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){} 






     } 
#ifdef OS_TICKS_PER_SEC   //?????±?????????¨????,???÷??????ucosII??.
OSIntExit();    
#endif

#endif






MAIN.C的
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
//ALIENTEK????STM32??·?°????é4
//???????é  
//?????§????www.openedv.com
//?????????í??×????????????? 
 int main(void)
 {
  u8 t;
u8 len;
u16 times=0;
delay_init();       //???±??????????   
NVIC_Configuration();   //?è??NVIC????·?×é2:2??????????????2???ì????????
uart_init(9600);  //????????????9600
  LED_Init();      //LED??????????
KEY_Init();          //????????°??ü??????????????
  while(1)
{
LED0=!LED0;
delay_ms(200);
}


}




USART.H的
#ifndef __USART_H
#define __USART_H
#include "stdio.h"
#include "sys.h" 
//////////////////////////////////////////////////////////////////////////////////  
//±????ò?????§?°??????????×÷???í???????????????ü????????
//Mini STM32??·?°?
//????1??????    
//??????×?@ALIENTEK
//????????:www.openedv.csom
//????????:2011/6/14
//°?±???V1.4
//°??¨?ù??????°?±?????
//Copyright(C) ??????×? 2009-2019
//All rights reserved
//********************************************************************************
//V1.3???????÷ 
//?§???????????????????????¨?????è??.
//????????printf???§??
//???????????????ü??????.
//??????printf??????×?·????§??bug
//V1.4???????÷
//1,??????????????IO??bug
//2,??????USART_RX_STA,????????×??ó????×???????2??14??·?
//3,??????USART_REC_LEN,?????¨??????×??ó???í??????×?????(???ó??2??14??·?)
//4,??????EN_USART1_RX??????·???
////////////////////////////////////////////////////////////////////////////////// 
#define USART_REC_LEN   200   //?¨??×??ó????×????? 200
#define EN_USART1_RX  1 //?????¨1??/?????¨0??????1????
  
extern u8  USART_RX_BUF[USART_REC_LEN]; //????????,×??óUSART_REC_LEN??×???.??×?????????·? 
extern u16 USART_RX_STA;          //????×???±ê??
//??????????????????????????×????????ê?¨??
void uart_init(u32 bound);
#endif
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-26 14:02:30 | 显示全部楼层
回复【33楼】飞翼:
---------------------------------
如果用串口1,单片机怎么和上位机通信呢?
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-26 14:02:43 | 显示全部楼层
回复【33楼】飞翼:
---------------------------------
我先试试~~
回复

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-7-23
在线时间
0 小时
发表于 2015-7-26 14:06:02 | 显示全部楼层
用串口1我个人觉得是比较简单和方便的,因为我做的是用手机控制我的四轴飞行器,如果要烧录程序,就把蓝牙模块拔下来,装上我的USB-TTL器连接我电脑,如果要用的时候,就把蓝牙模块那四个接口连上单片机就可以。
回复

使用道具 举报

5

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
95
金钱
95
注册时间
2015-7-14
在线时间
0 小时
 楼主| 发表于 2015-7-26 14:18:05 | 显示全部楼层
回复【33楼】飞翼:
---------------------------------
这里面用到了键盘吗?为什么要定义KEY?能私信把你的文件发一下吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表