初级会员
- 积分
- 121
- 金钱
- 121
- 注册时间
- 2018-7-13
- 在线时间
- 17 小时
|
5金钱
蓝牙模块自己已经配对成功,在A(发)B(收)单片机上的程序也已经写好了,而且两个单片机上电后可以把A的数据传给单片机B,我现在遇到的问题是:当A关闭时(无发送方),B的输出显示应该为无或者0,但是B的输出却是之前传输过来的数据,求解
串口一的底层代码是:
#ifdef EN_USART1_RX //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误
char USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大64个字节.
//接收状态
//bit7,接收完成标志
//bit6,接收到0x0d
//bit5~0,接收到的有效字节数目
u8 USART_RX_STA=0,idState=0,numberState=0,idLength=0; //接收状态标记
char CharX[Size];//用来存放标志位字符串
char CharY[Size];//用来存放数字字符串
int state=0,speed=0;//用来计数标志位和数字位
float XN,YN;
void USART1_IRQHandler(void)
{
u8 res,i=0;
if(USART1->SR&(1<<5))//接收到数据
{
res=USART1->DR;
if(res=='N')//接收到结束字符(当接收到结束符后,说明接收到了完整的一帧数据,在开始处理数据)
{
for(i=0;i<USART_RX_STA;i++)
{
if(i<Size)//Size=8
{
CharX[i]=' '; //就是相当于清空数组中的值(然后可以每次赋新值给数组)
CharY[i]=' ';
}
if(idState==0&&USART_RX_BUF[i]!=':')
{
CharX[i]=USART_RX_BUF[i];
idLength++;//id长度变量+1
numberState=0;//数据状态未接受
}
else if(idState==0&&USART_RX_BUF[i]==':')
{
idState=1;//表示前面id接受完毕
}
if(idState==1&&numberState==0)//numberState=0;(代表标志位的数据已经接受完)
{
CharY[i-idLength]=USART_RX_BUF[i+1];
}
else if(numberState==0&&USART_RX_BUF[i]==':')
{
numberState=1;
}
}printf("\r\n");
idState=0;
numberState=0;
USART_RX_STA=0;
idLength=0;
}
else//如果接受到正常的字符
{
USART_RX_BUF[USART_RX_STA&0X3F]=res;
USART_RX_STA++;
}
}
// LED3=!LED3;
}
#endif
float * getReceive(void)
{
float value[2]={0,0},*p;
p=value;
value[0]=atof(CharX);
value[1]=atof(CharY);
XN=value[0];
YN=value[1];
return p;
}
//初始化IO 串口1
//pclk2CLK2时钟频率(Mhz)
//bound:波特率
void uart_init(u32 pclk2,u32 bound)
{
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
mantissa=temp; //得到整数部分
fraction=(temp-mantissa)*16; //得到小数部分
mantissa<<=4;
mantissa+=fraction;
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<14; //使能串口时钟
GPIOA->CRH&=0XFFFFF00F;//IO状态设置
GPIOA->CRH|=0X000008B0;//IO状态设置
RCC->APB2RSTR|=1<<14; //复位串口1
RCC->APB2RSTR&=~(1<<14);//停止复位
//波特率设置
USART1->BRR=mantissa; // 波特率设置
USART1->CR1|=0X200C; //1位停止,无校验位.
#if EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
}
float getXN()
{
return XN;
}
float getYN()
{
return YN;
}
|
|