STM32识别字符串

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

STM32接收特定字符串,滤除回车符,直接得到所需字符串

分配USART2用于实现此功能

考虑很久,接收不打算用while(1)查询的方式实现了,浪费时钟周期,直接中断实现

USART配置

/******************************串口函数******************************/

void USART_Configuration(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

USART_InitTypeDef USART_InitStructure;

NVIC_InitTypeDef NVIC_InitStructure;

//第1步:打开GPIO和USART部件的时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE); //打开GPIOA时钟允许复用

RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //打开USART1时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); //打开USART2时钟

// 第2步:将USART Tx的GPIO配置为推挽复用模式

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_9; //Pin_2 - USART2_TX Pin_9 - USART1_TX

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

// 第3步:将USART Rx的GPIO配置为浮空输入模式

// 由于CPU复位后,GPIO缺省都是浮空输入模式,因此下面这个步骤不是必须的

// 但是,我还是建议加上便于阅读,并且防止其它地方修改了这个口线的设置参数

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_10; //Pin_3 - USART2_RX Pin_10 - USART1_RX

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

// 第4步:配置USART 数据格式、波特率等参数

// - BaudRate = 115200 baud

// - Word Length = 8 Bits

// - One Stop Bit

// - No parity

// - Hardware flow control disabled (RTS and CTS signals)

// - Receive and transmit enabled

USART_ART_BaudRate = 115200; //USARTDIV=72000000/(115200*16)=39.0625对应误差率为0(查看参考手册)

USART_ART_WordLength = USART_WordLength_8b;

USART_ART_StopBits = USART_StopBits_1;

USART_ART_Parity = USART_Parity_No;

USART_ART_HardwareFlowControl = USART_HardwareFlowControl_None;

USART_ART_Mode = USART_Mode_Rx | USART_Mode_Tx;

USART_Init(USART1, &USART_InitStructure);

USART_Init(USART2, &USART_InitStructure);

// 第5步:使能 USART,配置完毕

USART_Cmd(USART1, ENABLE);

USART_Cmd(USART2, ENABLE);

//CPU的小缺陷:串口配置好,如果直接Send,则第1个字节发送不出去

//如下语句解决第1个字节无法正确发送出去的问题

USART_ClearFlag(USART1, USART_FLAG_TC); //清发送外城标志,Transmission Complete flag USART_ClearFlag(USART2, USART_FLAG_TC);

//USART2要与wifi通信,因此需要接收命令,这里使用串口中断接收命令

NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //配置优先级组1

NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级2级

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

//使能收发中断

USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

}

我们日常所说的回车(ENTER)其实分为两步:回车:ASCII-0x0d 换行:ASCII-0x0a,接收的话必须要都滤除0x0d,0x0a,才能正常判断接收到的字符串,于是,索性接收到这两个字符串都不要,扔了就行

void USART2_IRQHandler(void)

{

uint8_t tmp;

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //判断发生接收中断

{

tmp = USART_ReceiveData(USART2);

if((tmp==0x0d)||(tmp==0x0a))

{

相关文档
最新文档