初级会员
- 积分
- 97
- 金钱
- 97
- 注册时间
- 2021-7-18
- 在线时间
- 37 小时
|
10金钱
使用的STM32F407探索者开发板+两个ATKBLE-01模块,板子串口1用来接收传感器数据,串口3用来连接蓝牙模块,另一个蓝牙模块用USB转TTL与电脑端相连,想通过蓝牙来接收传感器采集的数据,接线如下图1所示(个人感觉没啥问题,主要是代码的问题),后面的分别是main.c,usart.c(串口1),usart3.c(串口3)的中断程序,大部分程序都是采用正点原子安全匹配-从设备的例程,直接接收串口1的数据是可以的,但没有办法通过蓝牙模块接收传感器数据,里面还有像ble_usart.c,ble_app.c等文件都没有动过。
(蓝牙模块接线)
main.c程序
int main(void)
{
u8 t;
u8 len;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
delay_init(168); //初始化延时函数
uart_init(115200); //初始化串口波特率为115200
usart3_init(115200);
LED_Init(); //初始化LED
KEY_Init(); //KEY初始化
Ble_Test(); //ble测试
while(1)
{
if(USART3_RX_STA&0x8000)
{
len=USART3_RX_STA&0x3fff;//得到此次接收到的数据长度
//printf("\r\nthe massenge you sent:\r\n");
for(t=0;t<len;t++)
{
USART_SendData(USART3, USART3_RX_BUF[t]); //向串口3发送数据
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);//等待发送结束
}
if(t==USART_REC_LEN) t=0;
printf("\r\n\r\n");//插入换行
USART3_RX_STA=0;
}
}
}
usart.c中断程序
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 USART1_Res,t,len;
#ifdef OS_TICKS_PER_SEC //如果时钟节拍数定义了,说明要使用ucosII了.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE)!=RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
USART1_Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
if((USART_RX_STA&0x8000)==0)//接收未完成
{
if(USART_RX_STA&0x4000)//接收到了0x0d
{
if(USART1_Res!=0x0a)
{
USART_RX_STA=0;//接收错误,重新开始
}
else USART_RX_STA|=0x8000; //接收完成了
// len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
// //printf("\r\nthe massenge you sent:\r\n");
// for(t=0;t<len;t++)
// {
// USART_SendData(USART3, USART_RX_BUF[t]); //向串口3发送数据
// printf("\r\n\r\n");
// while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束
// }
}
else //还没收到0X0D
{
if(USART1_Res==0x0d)USART_RX_STA|=0x4000;
else
{
USART_RX_BUF[USART_RX_STA&0X3FFF]=USART1_Res ;
USART_RX_STA++;
if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
usart3.c中断程序
void USART3_IRQHandler(void)
{
u8 res;
if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) //接收到数据
{
res = USART_ReceiveData(USART3);
if ((USART3_RX_STA & (1 << 15)) == 0) //接收完的一批数据,还没有被处理,则不再接收其他数据
{
if (USART3_RX_STA < USART3_MAX_RECV_LEN) //还可以接收数据
{
TIM_SetCounter(TIM7, 0); //计数器清空
if (USART3_RX_STA == 0)
{
TIM_Cmd(TIM7, ENABLE); //使能定时器7
}
USART3_RX_BUF[USART3_RX_STA++] = res; //记录接收到的值
}
else
{
USART3_RX_STA |= 1 << 15; //强制标记接收完成
}
}
}
}
|
|