完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行相应赋值。
1 关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行响应赋值。 对于STM32而言,串口这个外设是十分重要的,如果彻底搞懂这个外设,对于我们STM32无疑有很大的帮助 由于代码功能可进行修改便可实现任意功能,所以讲代码分为主模块,功能模块两部分 1.实现代码的主模块 首先关于初始化,其余的代码都一样,只不过多了一个 USART_ITConfig(DEBUG_USARTx, USART_IT_IDLE, ENABLE); 1 /这个中断我们可查对应手册得知,此中断对应的是接受一帧数据的中断,通俗的说就是,我们人和人讲话,我们都是一个字一个字得说和听,但是大脑真正处理的时候,处理的是这一句完整的话,一帧中断的意思可以理解为,我们发完了一句完整的“话”,然后让cpu产生一个中断,去处理我们这句完整的话 2.中断串口处理函数 char rece_buffer[128]; int RxCounter; void USART1_IRQHandler(void ) { u8 clear=clear;//这个变量用于清除IDLE中断,下面会做解释 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;//这两行代码在作用上完全类似于 USART_ClearITPendingBit(USART1, USART_IT_RXNE); //查看手册,对应寄存器可以知道,当我们依次读SR,DR寄存器之后,这个标志位就会自动清除。 RxCounter=0;//这个为接收数据数组的计数数据,这里清零后,方便下一次接收数据 //如果没有这个清零,下次接收就会出问题, //比如第一次我们接收了5个数据,分别对 rece_buffer的0 1 2 3 4 放了数据,当我们第二次接收数据,因为RxCounter //并未清零,会继续给RxCounter的 5 6 7 .........赋值,如此会对我们的数据处理造成很大影响 } } 此代码便是我们功能代码的主体 3.数据的类型的转换 我们都知道串口发送,如果不选择以十六进制发送,则发送的为字符类型,如何把字符转换成数据类型方便我们使用呢? 在这之前关于printf函数的重定向相信大家都不是问题。 #include 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 ("%srn",rece_buffer);//此代码只是为了验证与转换后的结果相同 sscanf (rece_buffer,"%lf",&num );//这两行代码可以把字符串变成浮点,整型等等! //该函数的公式为sscanf( 数组,"渴望转换成为类型",转换数据赋值处 ),通俗地说就是把我们数组里的数据,转换成%lf,然后赋值到num; //如果想赋值为int ,把%lf 改成 %n即可 printf ("%frn",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')//这个k就是命令字符 {//字母区分大小写的 /*这里写LED的关灭程序,以及其他执行模块*/ RxCounter=0;//这个清零很重要,切记!!! } if(rece_buffer[0]=='k'&& rece_buffer[1]=='d'&&rece_buffer[2] =='a'&&rece_buffer[3]=='w' ) //这个kdaw就是命令字符串。*****************************,如果想改变命令字符串,依葫芦画瓢,照着增加或者减少即可, //如果要增加特殊符号,如空格等等,请查阅对于的字符表示形式 {//字母区分大小写的 /*这里写LED的关灭程序,以及其他执行模块*/ RxCounter=0; } } } 识别字符串命令及其赋值 比如我们希望输入k7854rn,就对k变量赋值7854,而输入其他,如m7854rn,则对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=rece_buffer[i+1]; //比如我们输入 k 854 ,rece_buffer里面的数据为 k 8 5 4,然后把后面的三个数据赋给cece_buffer1为 8 5 4 } printf ("%srn",rece_buffer1); sscanf (rece_buffer1,"%f",&num );//将字符转变为浮点 printf ("%frn",num); printf ("rece_buffer[0]=%crn",rece_buffer[0]) ; printf ("rece_buffer[1]=%crn",rece_buffer[1]) ; //printf只是为了验证,无实际意义 } else {printf ("你输入了错误命令"); RxCounter=0; printf ("rece_buffer[0]=%crn",rece_buffer[0]) ; printf ("rece_buffer[1]=%crn",rece_buffer[1]) ;} } } ** 如此便实现了串口常用的几种功能 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1777 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1621 浏览 1 评论
1080 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
728 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1678 浏览 2 评论
1938浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
731浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
570浏览 3评论
595浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
554浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 12:30 , Processed in 0.597303 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号