初级会员

- 积分
- 79
- 金钱
- 79
- 注册时间
- 2017-9-19
- 在线时间
- 15 小时
|
10金钱
stm32f103VCT6 串口中断接收到帧后经过处理只能接收到一帧数据,下次发就就死机了。不知道怎么回事。
有大神帮看看这劣质代码嘛?[mw_shl_code=c,true]void uart2_init(u32 bound){
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能gpio A
//RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); // 使能USART2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2|RCC_APB2Periph_GPIOA, ENABLE); //使能USART2,GPIOA时钟
//USART1_TX GPIOA.2
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA.2 //引脚配置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.2
//USART1_RX GPIOA.3初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;//PA.3
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.3
//Usart1 NVIC 配置 优先级配置
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//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(USART2, &USART_InitStructure); //初始化串口2
USART_ITConfig(USART2, USART_IT_IDLE, ENABLE);//开启串口空闲中断 //
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART2, ENABLE); //使能串口2
}
uint8_t USART2_RX_STA;
u8 Res_Buff[100];
uint8_t ResFlag;
uint8_t Data_flag;
void USART2_IRQHandler(void) //串口1中断服务程序
{
uint8_t Clear=Clear;
uint8_t i=0;
uint8_t kk;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断
{
Res_Buff[ResFlag++] = USART_ReceiveData(USART2);
}
else if(USART_GetITStatus(USART2,USART_IT_IDLE)!=RESET) //如果接收到一帧数据
{
Clear=USART2->SR;//读SR寄存器
Clear=USART2->DR; //读取DR寄存器(先读SR再读DR,为了清除IDLE中断)
USART2_RX_STA=1;
}
//////////////////
if(USART2_RX_STA==1) //接收到帧状态判断
{
USART2_RX_STA=0;
if(ResFlag==25)
{
if(Res_Buff[0]==0x0f&&Res_Buff[24]==0x00)
{
while(ResFlag--)
{
USART_SendData(USART1,Res_Buff[i++]); //发送sbus信号至飞控
while(USART_GetFlagStatus(USART1,USART_FLAG_TC) == RESET);//等待发送结束///
}
}
}
else {
Data_flag=ResFlag-3;
if(Res_Buff[0]==0x2f&&Res_Buff[1]==0x2f&&Res_Buff[2]==Data_flag)
{
kk=3;
while(Data_flag--)
{
USART_SendData(UART4,Res_Buff[kk++]); //发送数传至飞控
while(USART_GetFlagStatus(UART4,USART_FLAG_TC) == RESET);//等待发送结束///
}
}
}
}
}
[/mw_shl_code]
上面代码的意思是将两个2f的头的帧去掉再将第三个代表帧长的字节去掉。之后的就是我的原始数据。但是现在在串口空闲中断下单片机只能发送一帧数据。再发的话就不管用了。很忧伤。
|
-
接收情况
最佳答案
查看完整内容[请看2#楼]
if(USART2_RX_STA==1) //接收到帧状态判断
{
USART2_RX_STA=0;
if(ResFlag==25)
{
if(Res_Buff[0]==0x0f&&Res_Buff[24]==0x00)
...
|