关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行相应赋值。**

2023-05-16

关于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;//这个变量用于清除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 <stdio.h>//因为我们用到了sscanf以及print函数,所以要加入该头文件
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 );//这两行代码可以把字符串变成浮点,整型等等!
//该函数的公式为sscanf( 数组,"渴望转换成为类型",转换数据赋值处 ),通俗地说就是把我们数组里的数据,转换成%lf,然后赋值到num;
//如果想赋值为int ,把%lf 改成 %n即可
				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')//这个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;
					
}
}
}

识别字符串命令及其赋值

比如我们希望输入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];
		//比如我们输入 k 854 ,rece_buffer里面的数据为 k  8   5   4,然后把后面的三个数据赋给cece_buffer1为 8  5   4
		}
				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])	;
	//printf只是为了验证,无实际意义
}
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(使用前将#替换为@)

关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行相应赋值。** 的相关文章

  • stm32的HAL库函数flash无法写入的问题

    记录一下对flash编程操作时出现的问题以及解决办法 问题 在使用HAL库中的HAL FLASH Program uint32 t TypeProgram uint32 t Address uint64 t Data 函数时发现总是没办法写
  • 在地址“0xXXXXXX”处中断,没有可用的调试信息,或在程序代码之外

    配置 使用 Nucleo L476RG 使用 GNU ARM Eclipse 我从 STM32CubeMX 生成了一个极简代码 我已经在我的板载 ST Link 中刷新了 J link 驱动程序 一直在尝试为我的代码运行调试器 但我的程序计
  • c项目makefile多重定义错误

    这个问题是一个对应于创建的repexthis问题 在我的嵌入式 C 项目中 我有两个独立的板 我想为每个板创建两个 c 文件 master c 和 Slave c 其中包含自己的特定main 功能 我使用 stm32cumbemx 生成带有
  • 如何让printf在STM32F103上工作?

    我是 STM32F103 世界的新手 我有一个STM32F103的演示代码 我正在使用arm none eabi来编译它 我尝试了在谷歌上可以找到的内容 但到目前为止没有任何效果 我已经花了三天时间来解决这个问题 任何人都可以给我一个运行良
  • 优化 ARM Cortex M3 代码

    我有一个 C 函数 它尝试将帧缓冲区复制到 FSMC RAM 这些函数将游戏循环的帧速率降低至 10FPS 我想知道如何分析反汇编的函数 我应该计算每个指令周期吗 我想知道CPU把时间花在哪里 在哪个部分 我确信该算法也是一个问题 因为它的
  • 139-基于stm32单片机老人居家监护报警系统Proteus仿真+源程序

    资料编号 139 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 MQ4传感器 电位器模拟 MQ2传感器 电位器模拟 蜂鸣器 电机 制作一个基于stm32单片机老人居家监护报警系统Proteus仿真 2 通过MQ2传
  • 138-基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真+源程序

    资料编号 138 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 ds1302时钟 LED灯 蜂鸣器 电位器 制作一个基于stm32单片机汽车多功能仪表盘显示系统Proteus仿真 2 通过DHT1
  • 136-基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真+源程序

    资料编号 136 一 功能介绍 1 采用stm32单片机 LCD1602显示屏 独立按键 DHT11传感器 蜂鸣器 制作一个基于stm32单片机家庭温湿度防漏水系统设计Proteus仿真 2 通过DHT11传感器检测当前温湿度 并且显示到L
  • Push_back() 导致程序在进入 main() 之前停止

    我正在为我的 STM32F3 Discovery 板使用 C 进行开发 并使用 std deque 作为队列 在尝试调试我的代码 直接在带有 ST link 的设备上或在模拟器中 后 代码最终在 main 中输入我的代码之前在断点处停止 然
  • STM32F4 通过软复位跳转到引导加载程序,无需 BOOT0 和 BOOT1 引脚

    我问这个问题是因为可以在这里找到类似问题的答案 通过应用程序跳转到 STM32 中的引导加载程序 即从用户闪存在引导模式下使用引导 0 和引导 1 引脚 用户 JF002 JF002回答 当我想跳转到引导加载程序时 我在其中一个备份寄存器中
  • STM32F103概要

    The STM32F103x4 STM32F103x6 STM32F103xC STM32F103xD and STM32F103xE are a drop in replacement for STM32F103x8 B medium d
  • HAL 锁定和解锁函数如何使用以及为什么?

    我试图理解另一位程序员编写的代码 它使用了I C http en wikipedia org wiki I C2 B2C通信以将数据写入 STM32 微控制器的 EEPROM 一般来说 我理解他的代码是如何工作的 但我不明白他为什么使用HA
  • STM32 暂停调试器时冻结外设

    当到达断点或用户暂停代码执行时 调试器可以停止 Cortex 中代码的执行 但是 当皮质停止在暂停状态下执行代码时 调试器是否会冻结其他外设 例如 DMA UART 和定时器 您只能保留时间 r 取决于外围设备 我在进入主函数时调用以下代码
  • STM32的HAL中实现单按、长按和双按功能

    我正在尝试实现单击 双击和长按功能来执行不同的功能 到目前为止 我已经理解了单击和长按的逻辑 但我不知道如何检测双击 至于代码 我使用计数器实现了单击和长按 但代码仅停留在第一个 if 条件上 bool single press false
  • CMSIS & STM32,如何开始? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想在 STM32 上使用 CMSIS 启动项目 网上一搜 没找到具体的教程 有些使用 SPL 开始项
  • STM32H5 Nucleo-144 board开箱

    文章目录 开发板资料下载 目标 点亮LD1 绿 LD2 黄 和LD3 红 三个LED灯 开箱过程 博主使用的是STM32CubeMX配置生成代码 具体操作如下 打开STM32CubeMX File gt New project 选择开发板型
  • 特殊寄存器

    特殊寄存器 文章目录 前言 一 背景 二 2 1 2 2 总结 前言 前期疑问 STM32特殊寄存器到底是什么 特殊寄存器怎么查看和调试代码 本文目标 记录和理解特殊寄存器 一 背景 最近在看ucosIII文章是 里面提到特殊寄存器 这就进
  • 嵌入式 C++11 代码 — 我需要 volatile 吗?

    采用 Cortex M3 MCU STM32F1 的嵌入式设备 它具有嵌入式闪存 64K MCU固件可以在运行时重新编程闪存扇区 这是由闪存控制器 FMC 寄存器完成的 所以它不像a b那么简单 FMC 获取缓冲区指针并将数据刻录到某个闪存
  • 使用 STM32 USB 设备库将闪存作为大容量存储设备

    我的板上有这个闪存IC 它连接到我的STM32F04 ARM处理器 处理器的USB端口可供用户使用 我希望我的闪存在通过 USB 连接到 PC 时被检测为存储设备 作为第一步 我在程序中将 USB 类定义为 MSC 效果很好 因为当我将主板
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d

随机推荐

  • Windows 工具之net

    net 是windows平台下用户管理的工具 xff0c 可以来添加 xff0c 删除和修改用户 1 创建用户 xff1a win 43 R 输入cmd xff0c 然后打开命令行窗口 xff0c 输入下面的命令 xff1a net use
  • windows平台相关命令收集

    1 获取IP地址命令 xff1a ipconfig 2 获取MAC地址命令 xff1a ipconfig all 3 查看所有端口信息 netstat nal findstr 8080
  • C/C++中比较好用的HTTP开源库

    以下是一些常用的C C 43 43 开源HTTP库及其对应的开源协议和链接 xff1a 1 libcurl xff1a 使用MIT X开源协议 xff0c 支持多种协议和多种数据传输方式 xff0c 被广泛应用于各种开发场景 官网链接 xf
  • 为Ubuntu网页设置稳定的数据隧道

    网站作为互联网世界中的一个个门户 xff0c 是我们对外表达的窗口 xff0c 无数个人和企业通过这个窗口传递着信息 xff0c 这个传递信息的窗口必须稳定持续存在 xff0c 才能让更多访客看到 xff0c 为我们带来更多的流量 而使用c
  • VisualStudio配置与Matlab混合编译问题总结

    VisualStudio配置与Matlab混合编译问题总结 写这篇博客记录一下自己在配置过程中遇到的种种问题 xff0c 也做一个小小总结 xff0c 试图把整个过程讲明白 xff0c 希望对面临同样问题的人有所帮助 网上此类教程很多 xf
  • C++与C的区别(作业)

    头文件的区别 1 C 43 43 中创建源文件后缀为 cpp xff0c C语言中创建源文件后缀为 c xff0c 头文件保持不变 xff0c 后缀为 h 2 包含自己的头文件 xff0c C语言与C 43 43 无区别 包含库目录 xff
  • C++和C语言区别(二)附二级指针的动态内存申请

    结构体区别 1 定义结构体与C语言一致 2 定义变量可省略关键字struct 3 C 43 43 结构体中允许函数存在 xff08 C 43 43 在没有写构造函数和权限限定的时候 xff0c 用法和C语言一致 xff09 xff08 1
  • 自制芯片 http转串口通信模块实现手机控制加红外控制51单片机实现双控制 28BYJ-48步进电机( 13003步进电机驱动器 STC89C52RC ESP8266)

    首先你有这样的8266 这种8266自身带2个按键和烧录芯片方便调试 xff0c 综合性价比较高 还需要有一个51单片机 或者其他单片机都行 还有就是需要这样的13003步进电机驱动器 43 28BYJ 48步进电机和红外接收头以及遥控器
  • C++类和对象(附C语言与C++链表)

    类和对象的基本概念 1 类 xff1a 一系列事物的抽象 xff0c 万物皆可为类 xff08 1 xff09 属性 xff1a 事物的特征 数据类型的描述 xff08 2 xff09 行为 xff1a 事物的操作 函数描述 2 对象 xf
  • C++类的组合

    1 以另一个类的对象为数据成员 xff0c 必须采用初始化参数列表的写法 include lt iostream gt include lt string gt using namespace std class Boy public Bo
  • C++模板

    函数模板 1 把类型当作未知量 2 语法 template lt typename Ty gt Ty function Ty a Ty b return a gt b a b template lt class Ty1 class Ty2
  • C++STL容器(一)

    定长数组 include lt iostream gt include lt string gt include lt array gt using namespace std template lt class Ty size t siz
  • C++STL容器(二)

    链表 include lt iostream gt include lt string gt include lt list gt include lt functional gt 仿函数less和greater头文件 using name
  • C++正则表达式

    regex match regex replace regex search include lt iostream gt include lt regex gt include lt string gt using namespace s
  • C++时间管理和随机数

    时间段 include lt chrono gt duration TYPEDEFS typedef duration lt long long nano gt nanoseconds 纳秒 typedef duration lt long
  • C++文件系统

    filesystem include lt filesystem gt include lt iostream gt using namespace std int main 打开文件夹 filesystem path url 34 fil
  • arduino之旅——L298N驱动小车前进后退

    今天开始组装小车 xff0c 但是把小车底板 xff0c arduino mega 2560芯片 xff0c L298N xff0c 减速电机 xff0c 还有电源相应地连接好后 xff0c 从网上找了如下程序 xff08 源程序来自 xf
  • ODROID XU4 内核编译

    准备材料 一个64位的Linux系统 一份内核源码 交叉编译工具链 添加交叉编译工具链 下载链接 sudo mkdir opt toolchains sudo cp arm eabi 4 6 tar gz opt toolchains cd
  • 红外遥控器解码串口输出模块结合51单片机+oled屏幕实现遥控器红外解锁( STC89C52RC)

    需要 1 单片机 2 红外遥控器解码串口输出模块 3 oled屏幕 4 电子锁 5 继电器 有了这些我们开始吧 xff01 1 先看一段视频效果演示 xff0c 再来介绍实现步骤 红外遥控器解码串口输出模块结合51单片机 43 oled屏幕
  • 关于STM32串口收发,以及数据类型的任意转换及识别字符命令进行相应赋值。**

    关于STM32串口收发 xff0c 以及数据类型的任意转换及识别字符命令进行相应赋值 1 关于STM32串口收发 xff0c 以及数据类型的任意转换及识别字符命令进行响应赋值 对于STM32而言 xff0c 串口这个外设是十分重要的 xff