关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行相应赋值。
1 关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行响应赋值。
对于STM32而言,串口这个外设是十分重要的,如果彻底搞懂这个外设,对于我们STM32无疑有很大的帮助
由于代码功能可进行修改便可实现任意功能,所以讲代码分为主模块,功能模块两部分
1.实现代码的主模块
首先关于初始化,其余的代码都一样,只不过多了一个
USART_ITConfig(DEBUG_USARTx, USART_IT_IDLE, ENABLE);
/这个中断我们可查对应手册得知,此中断对应的是接受一帧数据的中断,通俗的说就是,我们人和人讲话,我们都是一个字一个字得说和听,但是大脑真正处理的时候,处理的是这一句完整的话,一帧中断的意思可以理解为,我们发完了一句完整的“话”,然后让cpu产生一个中断,去处理我们这句完整的话
2.中断串口处理函数
char rece_buffer[128];
int RxCounter;
void USART1_IRQHandler(void )
{
u8 clear=clear;
USART_ClearFlag(USART1,USART_FLAG_TC);
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)
{
rece_buffer[RxCounter++]=USART1->DR;
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
{
clear=USART1->SR;
clear=USART1->DR;
RxCounter=0;
}
}
此代码便是我们功能代码的主体
3.数据的类型的转换
我们都知道串口发送,如果不选择以十六进制发送,则发送的为字符类型,如何把字符转换成数据类型方便我们使用呢?
在这之前关于printf函数的重定向相信大家都不是问题。
#include <stdio.h>
char rece_buffer[128];
int RxCounter;
void USART1_IRQHandler(void )
{
u8 clear=clear;
double num;
USART_ClearFlag(USART1,USART_FLAG_TC);
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)
{
rece_buffer[RxCounter++]=USART1->DR;
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
{
clear=USART1->SR;
clear=USART1->DR;
RxCounter=0;
printf ("%s\r\n",rece_buffer);
sscanf (rece_buffer,"%lf",&num );
printf ("%f\r\n",num);
}
}
识别命令字符及其字符串
我们学习stm32的时候,经常会想,我可不可以从串口里发送一个命令,比如 “open led”,我们就打开led,输入"m",我们熄灭
,没错,当然可以实现,仍然是同一个模块,只不过稍微改动而已
char rece_buffer[128];
int RxCounter;
void USART1_IRQHandler(void )
{
u8 clear=clear;
USART_ClearFlag(USART1,USART_FLAG_TC);
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)
{
rece_buffer[RxCounter++]=USART1->DR;
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
{
clear=USART1->SR;
clear=USART1->DR;
if(rece_buffer[0]=='p')
{
RxCounter=0;
}
if(rece_buffer[0]=='k'&& rece_buffer[1]=='d'&&rece_buffer[2] =='a'&&rece_buffer[3]=='w' )
{
RxCounter=0;
}
}
}
识别字符串命令及其赋值
比如我们希望输入k7854\r\n,就对k变量赋值7854,而输入其他,如m7854\r\n,则对m赋值7854
char rece_buffer[128];
char rece_buffer1[128];
int RxCounter;
void USART1_IRQHandler(void )
{
u8 clear=clear;
float num;
USART_ClearFlag(USART1,USART_FLAG_TC);
if(USART_GetITStatus(USART1,USART_IT_RXNE)!=Bit_RESET)
{
rece_buffer[RxCounter++]=USART1->DR;
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
}
else if(USART_GetFlagStatus(USART1,USART_FLAG_IDLE)!=Bit_RESET)
{ u8 i;
clear=USART1->SR;
clear=USART1->DR;
if(rece_buffer[0]=='k')
{ RxCounter=0;
for(i=0;i<=(sizeof(rece_buffer)/sizeof(rece_buffer[0]));i++)
{
rece_buffer1[i]=rece_buffer[i+1];
}
printf ("%s\r\n",rece_buffer1);
sscanf (rece_buffer1,"%f",&num );
printf ("%f\r\n",num);
printf ("rece_buffer[0]=%c\r\n",rece_buffer[0]) ;
printf ("rece_buffer[1]=%c\r\n",rece_buffer[1]) ;
}
else {printf ("你输入了错误命令");
RxCounter=0;
printf ("rece_buffer[0]=%c\r\n",rece_buffer[0]) ;
printf ("rece_buffer[1]=%c\r\n",rece_buffer[1]) ;}
}
}
**
如此便实现了串口常用的几种功能
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)