OpenEdv-开源电子网

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

STM32串口USART2中断接收解析字符串,急,急,急!感谢诸位帮帮忙

[复制链接]

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-10-7
在线时间
0 小时
发表于 2015-6-17 15:18:36 | 显示全部楼层 |阅读模式
5金钱
源码:
#include "stm32f10x.h"
#include "usart.h"
#include "sys.h"

#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((USART2->SR&0X40)==0);//????,??????   
    USART2->DR = (u8) ch;      
return ch;
}
#endif 

void uart_init(u32 br_num)
{
USART_InitTypeDef USART_InitStructure;
// USART_ClockInitTypeDef USART_ClockInitStruct;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//开启USART1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

//配置PA2作为USART1 Tx
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA , &GPIO_InitStructure);
//配置PA3作为USART1 Rx
GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA , &GPIO_InitStructure);
   //Usart2 NVIC 
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority= 1 ;//************//
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //0-3

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
//配置USART2
//中断被屏蔽了
USART_InitStructure.USART_BaudRate = br_num;//br_num;       //波特率可以通过地面站配置
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_Tx | USART_Mode_Rx;  //发送、接收使能
// //配置USART1时钟
// USART_ClockInitStruct.USART_Clock = USART_Clock_Disable;  //时钟低电平活动
// USART_ClockInitStruct.USART_CPOL = USART_CPOL_Low;  //SLCK引脚上时钟输出的极性->低电平
// USART_ClockInitStruct.USART_CPHA = USART_CPHA_2Edge;  //时钟第二个边沿进行数据捕获
// USART_ClockInitStruct.USART_LastBit = USART_LastBit_Disable; //最后一位数据的时钟脉冲不从SCLK输出


USART_Init(USART2, &USART_InitStructure);
// USART_ClockInit(USART2, &USART_ClockInitStruct);

//使能USART1接收中断
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
//使能USART1
USART_Cmd(USART2, ENABLE); 
}

u8 TxBuffer[256];
u8 TxCounter=0;
u8 count=0;
u8 RxBuffer[16]={0};
static u8 RxState = 0;

void Uart2_IRQ(void)
{
if (USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)//??!????if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)???
    {
        USART_ReceiveData(USART2);
    }

//发送中断
if((USART2->SR & (1<<7))&&(USART2->CR1 & USART_CR1_TXEIE))//if(USART_GetITStatus(USART1,USART_IT_TXE)!=RESET)
{
USART2->DR = TxBuffer[TxCounter++]; //写DR清除中断标志          
if(TxCounter == count)
{
USART2->CR1 &= ~USART_CR1_TXEIE; //关闭TXE中断
//USART_ITConfig(USART1,USART_IT_TXE,DISABLE);
}
}
//接收中断 (接收寄存器非空) 
if(USART2->SR & (1<<5))//if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)    
{
u8 com_data = USART2->DR;
static u8 _data_len = 0,_data_cnt = 0;

if(RxState==0)
{
RxState=0;
RxBuffer[0]=com_data;
}
else if(RxState==1)
{
RxState=2;

RxBuffer[1]=com_data;
}
else if(RxState==2)
{
RxState=3;
RxBuffer[2]=com_data;
}
if(RxState==3)
{
RxState=4;
RxBuffer[4]=com_data;
}
else if(RxState==4)
{
RxState=5;
RxBuffer[5]=com_data;
}
else if(RxState==5)
{
RxState=6;
RxBuffer[6]=com_data;
}
else if(RxState==6)
{
RxState = 7;
RxBuffer[7]=com_data;
}
else if(RxState==7)
{
RxState = 8;
RxBuffer[8]=com_data;
}
else if(RxState==8)
{
RxState = 9;
RxBuffer[9]=com_data;
// Data_Receive_Anl(RxBuffer,_data_cnt+5);
}
else
RxState = 0;

}
}

void Uart2_Put_Char(unsigned char DataToSend)//static 
{
TxBuffer[count++] = DataToSend;  
USART_ITConfig(USART2, USART_IT_TXE, ENABLE); 
}

void Uart2_Put_String(unsigned char *Str)
{
//判断Str指向的数据是否有效.
while(*Str)
{
//是否是回车字符 如果是,则发送相应的回车 0x0d 0x0a
if(*Str=='\r')Uart2_Put_Char(0x0d);
else if(*Str=='\n')Uart2_Put_Char(0x0a);
else Uart2_Put_Char(*Str);
//指针++ 指向下一个字节.
Str++;
}
}

void Uart2_Put_Buf(unsigned char *DataToSend , u8 data_num)
{
uint8_t i;
for(i=0;i<data_num;i++)
TxBuffer[count++] = *(DataToSend+i);
if(!(USART2->CR1 & USART_CR1_TXEIE))
USART_ITConfig(USART2, USART_IT_TXE, ENABLE); 
}

以上源码可以使用prinft发送字符串
不知道怎么接收字符串,在寄存器里面是怎么跑的……
急求诸位帮忙解决,谢谢

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

使用道具 举报

2

主题

239

帖子

0

精华

高级会员

Rank: 4

积分
545
金钱
545
注册时间
2015-6-5
在线时间
110 小时
发表于 2015-6-17 17:03:17 | 显示全部楼层
UART Rx 中斷時 把資料塞給Rx buffer
主循環裡面在去判斷RX buffer內容

不要在中斷裡面處理字串判斷
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-10-7
在线时间
0 小时
 楼主| 发表于 2015-6-17 20:24:56 | 显示全部楼层
回复【2楼】Rocks:
------------------------------
哥们 加个QQ吧:我的1534932165,这个很急很急很急,晚上必须弄好,谢谢!

我本身是做算法的,32还是3年前大学时候搞过……
 
我按照你的方法试试,感激不尽,我就是在中断里面判断RX buffer的  估计是这里出问题了
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-10-7
在线时间
0 小时
 楼主| 发表于 2015-6-17 21:25:22 | 显示全部楼层
回复【2楼】Rocks:
---------------------------------
哥们,我试了一下,还是不行,每当我通过手机给STM32(接有蓝牙HC06)发送字符,板子就会卡死……,请问这个是怎么回事啊
回复

使用道具 举报

3

主题

8

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2013-10-7
在线时间
0 小时
 楼主| 发表于 2015-6-17 21:29:54 | 显示全部楼层
回复【2楼】Rocks:
---------------------------------
这个板子  是手机通过蓝牙给STM32(接了蓝牙HC06)发送字符,手机已经可以接受STM32发送的字符串了

程序有3个定时器中断(先占优先级:0, 从占:1 2 3),一个串口中断(先占:0,从占:0),不知道这个优先级设置有没有问题,请指教指教
 http://bbs.elecfans.com/jishu_488481_1_1.html     

麻烦哥们帮我看看  谢谢谢谢
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-17 23:23:01 | 显示全部楼层
楼主可以参考下我们的串口例程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

3

帖子

0

精华

新手上路

积分
42
金钱
42
注册时间
2020-1-14
在线时间
17 小时
发表于 2020-5-14 15:25:52 | 显示全部楼层
程序对吗
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-28 06:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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