江科协STM32教程——STM32 使用串口助手进行LED灯的点亮熄灭灭控制全代码过程(USART串口通信的简单应用)

这篇具有很好参考价值的文章主要介绍了江科协STM32教程——STM32 使用串口助手进行LED灯的点亮熄灭灭控制全代码过程(USART串口通信的简单应用)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        使用USART串口通信,通过上位机串口助手发送关键字符串给STM32执行LED灯点亮熄灭操作的流程。

        基本的配置如下所示,GPIO口配置的为PA9推挽输出,用于LED灯的操作。其余注意USART_ITConfig和USART_Cmd开启USART接收中断和使能USART运行。

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>

void Serial_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//开启USART1的时钟,USART1总线在APB2上,
               									//其余的都在APB1上,注意区分
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
 	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	USART_InitTypeDef USART_InitStructure;
	USART_InitStructure.USART_BaudRate=9600;//设置波特率
	USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//硬件流控制
	USART_InitStructure.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;//USART模式,发送接收全设置
	USART_InitStructure.USART_Parity=USART_Parity_No;//校验位
	USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位
	USART_InitStructure.USART_WordLength=USART_WordLength_8b;//字长
	USART_Init(USART1,&USART_InitStructure);
	
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//开启串口接收数据中断
	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
	
	NVIC_InitTypeDef NVIC_InitStructure;
	NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
	NVIC_Init(&NVIC_InitStructure);
	
	USART_Cmd(USART1,ENABLE);
}

        接下来要进行发送字符串LED_ON和LED_OFF分别执行点亮和熄灭的操作,比如串口在接受LED_ON这个字符串后,通过程序将接收到的该字符串进行比照,例如使用 strcmp()进行判断,如果接收到的字符串与设置好的字符串相同则执行对应的操作,注意strcmp()包含在#include<string.h>中,需要添加该头文件才能使用。

        可以使用数组进行接收字符串,在中断函数里使用状态机的形式进行数据的头尾判断和接收存储。

        进入中断后,将串口接收到的字符用一个数组RxData[]暂存,进入if的条件再定义一个RxState 进行判断,初始值赋0,在里面又进行判断接收到的数据是不是用于判断的头字符,定义判断字符为@,同时为了保证数据是重新开始的,加上Serial_RxFlag == 0用且判断,接收到的为@则进入接收数据的部分,注意使用else if判断,里面判断是不是尾字符(用于结束),如果不是的话就进行数据的正式接收,将接收到的字符用数组形式存放在RxData里,然后接收到结束字符后进入最后的收尾工作。

        使用"\n"进行判断进入第三步,在里面进行状态重置,记得使用USART_ClearITPendingBit进行标志位清零。状态机部分的代码到此结束。

void USART1_IRQHandler(void)
{
	static uint8_t RxState = 0;		//定义表示当前状态机状态的静态变量
	static uint8_t pRxPacket = 0;	//定义表示当前接收数据位置的静态变量
	if (USART_GetITStatus(USART1, USART_IT_RXNE) == SET)	//判断是否是USART1的接收事件触发的中断
	{
		uint8_t RxData = USART_ReceiveData(USART1);			//读取数据寄存器,存放在接收的数据变量
		
		/*使用状态机的思路,依次处理数据包的不同部分*/
		
		/*当前状态为0,接收数据包包头*/
		if (RxState == 0)
		{
			if (RxData == '@' && Serial_RxFlag == 0)		//如果数据确实是包头,并且上一个数据包已处理完毕
			{
				RxState = 1;			//置下一个状态
				pRxPacket = 0;			//数据包的位置归零
			}
		}
		/*当前状态为1,接收数据包数据,同时判断是否接收到了第一个包尾*/
		else if (RxState == 1)
		{
			if (RxData == '\r')			//如果收到第一个包尾
			{
				RxState = 2;			//置下一个状态
			}
			else						//接收到了正常的数据
			{
				Serial_RxPacket[pRxPacket] = RxData;		//将数据存入数据包数组的指定位置
				pRxPacket ++;			//数据包的位置自增
			}
		}
		/*当前状态为2,接收数据包第二个包尾*/
		else if (RxState == 2)
		{
			if (RxData == '\n')			//如果收到第二个包尾
			{
				RxState = 0;			//状态归0
				Serial_RxPacket[pRxPacket] = '\0';			//将收到的字符数据包添加一个字符串结束标志
				Serial_RxFlag = 1;		//接收数据包标志位置1,成功接收一个数据包
			}
		}
		
		USART_ClearITPendingBit(USART1, USART_IT_RXNE);		//清除标志位
	}
}

        接下来是main函数里的程序代码:

        主函数中的LED代码之前的LED代码有介绍这里不再赘述。if用strcmp进行比较,如果相同则进入循环内部执行对应要实现的操作。可以使用Serial_SendString来发送对应反馈信息给串口助手。

#include "stm32f10x.h"                  // Device header
#include "Serial.h"
#include "LED.h"
#include "string.h"//包含strcmp函数的代码

int main(void)
{
	/*模块初始化*/
	LED_Init();			//LED初始化
	Serial_Init();		//串口初始化
	

	while (1)
	{
		if (Serial_RxFlag == 1)		//如果接收到数据包
		{		
			/*将收到的数据包与预设的指令对比,以此决定将要执行的操作*/
			if (strcmp(Serial_RxPacket, "LED_ON") == 0)			//如果收到LED_ON指令
			{
				LED1_ON();										//点亮LED
				Serial_SendString("LED_ON_OK\r\n");				//串口回传一个字符串LED_ON_OK
 			}
			else if (strcmp(Serial_RxPacket, "LED_OFF") == 0)	//如果收到LED_OFF指令
			{
				LED1_OFF();										//熄灭LED
				Serial_SendString("LED_OFF_OK\r\n");			//串口回传一个字符串LED_OFF_OK

			}
			else						//上述所有条件均不满足,即收到了未知指令
			{
				Serial_SendString("ERROR_COMMAND\r\n");			//串口回传一个字符串ERROR_COMMAND

			}
			
			Serial_RxFlag = 0;			//处理完成后,需要将接收数据包标志位清零,否则将无法接收后续数据包
		}
	}
}

串口助手如何控制stm32,stm32,嵌入式硬件,单片机

(此时LED灯亮起)文章来源地址https://www.toymoban.com/news/detail-842224.html

到了这里,关于江科协STM32教程——STM32 使用串口助手进行LED灯的点亮熄灭灭控制全代码过程(USART串口通信的简单应用)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32使用printf重定向到USART(串口)并打印数据到串口助手

    我们知道我们在进行编程的时候,遇到问题,经常通过打印信息进行调试,在java中使用的是System.out.println打印到输出窗口。在C语言中使用的是printf打印到输出窗口。而我们用keil进行编程的时候也是使用的C语言所以也可以使用printf,但是我们知道,keil中没有输出窗口。那我

    2024年02月15日
    浏览(37)
  • STM32数据可视化显示——纸飞机串口调试助手的使用

    本人在开发STM32的过程中,数据都是通过XCOM串口调试助手进行展示的,但这样的话,数据就做不到图像化、多样化处理的显示,使得一些连续的数据无法通过图像来直观表达 感兴趣的朋友可以点进链接进行下载哦 http://blog.comassistant.cn/ 上图所示,为纸飞机调试助手的界面,可

    2023年04月12日
    浏览(43)
  • STM32在Keil中使用串口助手打印中文字符出现乱码问题

     问题如下,中文字符显示乱码,但数字正常。 通常这种在串口助手打印出现乱码情况: 无非是 波特率设置错误 ,不对应。就像一个滴水的水龙头,水滴进一个循环开合的容器,双方速率不能很好匹配,一定会出现水滴不能完全滴进容器,或者完全滴进或者完全滴不进的情

    2024年02月09日
    浏览(34)
  • cubmx基础操作,hal库基本配置流程之使用 stm32cubmx生成HAL库进行gpio点亮led(stm32h7xx)(超详细,小白教程)

    HAL库(硬件抽象层库)是一个提供对底层硬件操作的抽象的库,它使得开发者可以使用统一的接口进行硬件操作,而不必关心底层硬件的具体实现细节。HAL库通常由硬件厂商提供,用于支持其硬件设备,并为其提供标准化的接口。 HAL库的主要目的是简化底层硬件的操作,使得

    2024年02月20日
    浏览(47)
  • 基于STM32F103ZET6单片机驱动SM16306SJ控制8个LED灯的系统设计

    1.设计要求:使用stm32f103zet6精英开发板  采用SM16306SJ驱动8个LED灯。 2.原理图 3.代码 4.实物效果图 备注:1 硬件上有一个LED灯坏了,所以才亮了7个LED灯            2 一个SM16306SJ最多可以驱动16个LED灯            3 SM16306SJ跟MBI5020程序通用

    2024年04月17日
    浏览(43)
  • 9、基于51单片机手机APP蓝牙调试助手控制四个LED灯的开关设计

    毕设帮助、开题指导、技术解答(有偿)见文末。 目录 摘要 一、硬件方案 二、设计功能 三、实物图 四、原理图 五、PCB图 六、Proteus仿真 七、程序源码 八、资料包括 随着社会的发展人们对生活质量的要求越来越高,照明在能耗中所占的比例日益增加,因而照明工能也日显重

    2024年02月12日
    浏览(39)
  • stm32----串口通讯,通过串口控制LED灯

    1.初始化LED灯(根据原理图修改pin和gpio): 2.初始化串口 3.编译中断函数: 以下是完整代码: 效果如下

    2024年02月11日
    浏览(34)
  • stm32之串口/蓝牙控制led灯

    该文章记录学习stm32串口遇到的一些问题,完整代码地址。 一、项目描述 通过串口或蓝牙发送指令来控制led灯。 open ------ led 亮 close ------ led 灭 其它  ------- 反馈给串口或蓝牙错误指令 二、项目用到的模块 stm32 串口1,PA9(TX), PA10(RX) HC01 蓝牙模块, PA9(TX), PA10(RX) led灯,  PB8 三、

    2024年02月07日
    浏览(40)
  • 【STM32】STM32CubeMX教程一--基本使用(新建工程点亮LED灯)

    前言 在配置好CubeMX之后,就是新建工程的开始了,那么首先我们需要一些准备,本片博客我们会很详细的介绍STM32CubeMX的基本使用和如何创建一个新的工程并且点亮LED灯 在新建工程时,我们分为了具体流程1~7,如果您不想看每部分的讲解,直接按照流程操作即可,5分钟即可

    2024年02月09日
    浏览(39)
  • 使用jetson nano的串口与stm32进行通信

    首先, jetson nano可以跑python, 那就简单了: 端口就是: GND, 8, 10, 分别接到我STM32F4最小系统板子的UART2: 板子为了方便观察, 就用uart2接收, 用uart1发送, 为啥不用同一个串口呢? 嗯…我乐意… STM32的代码就如上面的, 随便写写就好了. 把UART1的TX接到usb串口上, 然后在jetson上用python运行上

    2024年02月12日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包