新手上路
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2018-7-14
- 在线时间
- 0 小时
|
5金钱
想要接收此模块的数据,但在中断服务函数那里接收不到正确的数据,望各位解答
分贝数据命令
如:BB AA 01 7F 02 E7
起始符:BB AA,表示一帧的开始。
命令:01,表示此帧为返回分贝值数据。
数据:7F 02,表示检测到的分贝值为63.9dB。低字节在前,高字节在后,且每单位为0.1dB。
校验值:E7,为BB AA 01 7F 02的的算术和校验值。
注:此帧为模块上电返回固件版本号命令帧后每约500ms返回一次此帧。
void HH_0603_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//TX
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOB,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//RX
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB,&GPIO_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate=115200;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
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_Cmd(USART3, ENABLE);
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
//每收到一个字节进入一次中断!
USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);
//每收到一帧数据进入一次中断!
}
//中断处理函数
void USART3_IRQHandler(void)
{
u8 clear = clear;
USART_ClearFlag(USART3,USART_FLAG_TC);
if(USART_GetITStatus(USART3,USART_IT_RXNE)!=Bit_RESET)
{
RX_Buffer[RX_Counter++] = USART3->DR;
printf("接收数据为:%x",RX_Buffer[RX_Counter]);
delay_ms(1000);
switch(RX_Counter)
{
case 1://校验起始符1字节
if(USART3->DR != UART_BEGIN_STX1)
{
RX_Counter=0;
}
break;
case 2://校验起始符2字节
if(USART3->DR != UART_BEGIN_STX2)
{
RX_Counter=0;
}
break;
case 6://校验
if(CheckSum(RX_Buffer,5) != RX_Buffer[5])
{
RX_Counter=0;
}
else
{
RX_Counter=0;
Uart_RecvFlag=1;
}
break;
}
}
else if(USART_GetFlagStatus(USART3,USART_FLAG_IDLE)!=Bit_RESET)
{
clear=USART3->SR;
clear=USART3->DR;
RX_Counter=0;
}
|
|