6,串口编程———通过串口助手发送数据,控制led亮灭

2024-06-02 22:36

本文主要是介绍6,串口编程———通过串口助手发送数据,控制led亮灭,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//功能:串口助手每次发送数据格式:@0000&

// 第二个字节控制LED1亮灭

// 第三个字节控制LED2亮灭

// 第四个字节控制LED3亮灭

// 第无个字节控制LED4亮灭

//要求:代码能够一直运行,能够接收多字节数据

上节讲了串口的基本发送接收数据,本节应用一下。

以上功能可写成这样:发送和接收数据的解析函数:

void DataAnaly(void)
{if(usart1flag == 1){if(Usart1buff[0]== '@' && Usart1buff[Usart1len-1]== '&'){if(Usart1buff[1]=='1')LED1(1);elseLED1(0);	if(Usart1buff[2]=='1')LED2(1);elseLED2(0);if(Usart1buff[3]=='1')LED3(1);elseLED3(0);if(Usart1buff[4]=='1')LED4(1);elseLED4(0);memset(Usart1buff,0,10);Usart1len=0;usart1flag=0;}else{memset(Usart1buff,0,10);Usart1len=0;usart1flag=0;}}}

因为功能要求代码能够一直运行,所以一般会想到把上面这个功能函数写在while(1)循环里,但是如果写在while(1)循环中,只有发数据,while循环才会跑起来,不发的话,程序会一直卡死在接收数据这里,while循环里的其他数据就不能运行了,所以要使用中断。因为在接受数据这导致其他数据不能运行,所以要使用接收中断。

1,在上节的usart.c中的void Usart_Init(void){ }函数里加一行代码,开启接收函数中断源

  //开启串口1接收中断USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); 

2,在usart.c写中断服务函数

uint8_t Usart1buff[10] = {0};
uint16_t Usart1len 		 = 0;
uint8_t  usart1flag 	 = 0;//中断服务函数按键1  不用在.h中声明 不用在main函数中调用了 
void USART1_IRQHandler(void)
{//检查指定usart中断(接收中断)发生与否if(USART_GetITStatus(USART1,USART_IT_RXNE) == SET){//将接收到的数据保存在Usart1buff[10]数组中Usart1buff[Usart1len] =  USART_ReceiveData(USART1);if(Usart1buff[Usart1len] == '&'){//判断数据是否接受完毕usart1flag=1;}//只要接收到数据就会发生中断//因为中断一直在发生,所以数据要往后偏移Usart1len++;//清除 USARTx 的中断待处理位USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}

3,在usart.c写解析函数,然后在usart.h中声明函数(省略)

void DataAnaly(void)
{//如果数据接收正确,执行对应程序if(usart1flag == 1){if(Usart1buff[0]== '@' && Usart1buff[Usart1len-1]== '&'){if(Usart1buff[1]=='1')LED1(1);elseLED1(0);	if(Usart1buff[2]=='1')LED2(1);elseLED2(0);if(Usart1buff[3]=='1')LED3(1);elseLED3(0);if(Usart1buff[4]=='1')LED4(1);elseLED4(0);//将Usart1buff所指向的内存区域的前10个字节设置为0,清除memset(Usart1buff,0,10);Usart1len=0;usart1flag=0;}//如果数据接收不正确,清除接收输入的数据的数组,数组长度和标志位清零else{memset(Usart1buff,0,10);Usart1len=0;usart1flag=0;}}}

4,在主函数的while循环里调用函数,写以下代码,然后执行代码看现象,可看到本功能执行的同时,while循环里的写的其他功能代码也可以实现(例如写的按键控制灯也能正常执行),没有发生阻塞现象。

这篇关于6,串口编程———通过串口助手发送数据,控制led亮灭的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1025278

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用