STM32识别字符串
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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))
{