学习笔记|串口通信实战|简易串口控制器|sprintf函数|STC32G单片机视频开发教程(冲哥)|第二十一集(下):串口与PC通信

目录

  • 3.串口通信实战
    • 实操
      • 简易的工作原理
      • Tips:sprintf函数简介
  • 总结
  • 课后练习

3.串口通信实战

做一个简易串口控制器。发送对应指令,让板子做相应的事情,或者传输数据(文本模式下发送,不要选择HEX)。
1.串口发送字符Ax\r\n,(x表示0-7)板子点亮对应LED.\r\n也可以在串口软件中设置自动发送。
2.串口发送Bxxxx\r\n,xxxx表示一个四位数,四位数码管显示这个4位数
2.串口发送Z\r\n,板子给电脑发送“Hello STC”;
3.串口发送字符Cx\r\n,(x表示0-1)板子打开/关闭蜂鸣
4.串口发送字符D\r\n,板子通过串口发送当前温度给电脑。

实操

先把需求复制到demo.c顶部。
为实现功能1,首先要对串口接收进行处理。查看void UART2_int (void) interrupt UART2_VECTOR:

void UART2_int (void) interrupt 8
{if(S2RI)		//如果接收到数据,{S2RI = 0;    //Clear Rx flagRX2_Buffer[RX2_Cnt] = S2BUF;if(++RX2_Cnt >= UART2_BUF_LENGTH)   RX2_Cnt = 0;}if(S2TI){S2TI = 0;    //Clear Tx flagB_TX2_Busy = 0;}
}

简易的工作原理

先清空标志位,再把数据存入RX2_Buffer[RX2_Cnt]。S2BUF(写入的数据)不断的存到RX2_Buffer中,这里用到了循环写入的方式,刚刚上电的时候RX2_Cnt是0,
写完后变成了1,变成了2,…,总长度是#define UART2_BUF_LENGTH 128,数组RX2_Buffer的最大长度是128,也就是说写入值超过127以后下一次会重新开始写。
覆盖掉0的参数,再往下写,一个一个的覆盖下去,直到覆盖到最后一个,然后又从头开始。
再去看一下串口发送,在demo.c中,if((TX2_Cnt != RX2_Cnt) && (!B_TX2_Busy)) //收到数据, 发送空闲
如果TX2_Cnt != RX2_Cnt,假设接收的数值是4,则已经写入了4个数据,如果串口发送和串口接收的数值不相等,并且不为忙碌的时候,就可以开始发送数据。
把数据写入 S2BUF,然后他也是跟着跑,每次写入一个数据,RX2CNT是每接收到一个数据,RX2CNT数值加1,加1以后,TX就不等于RX2CNT了,这种情况下,先往上写一个数据,TX2CNT也就可以开始+1,
比如说写入的是4个数据,假设TX2CNT刚上电,初始是0,即满足(TX2_Cnt != RX2_Cnt) && (!B_TX2_Busy)的条件,则先将数据(写入0)先传送出去,写完以后这里还是不等于他,把写入1也写出去,如果说还是不等于,
再接着写出去,这里其实是一个循环的队列,串口在空闲的时候就可以跟着他走,这里就是一个循环队列的演示。
本次只要接收到一个指令就可以。从指令集分析,每次接收到\r\n以后,就可以重新开始计数。
在中断函数void UART2_int (void) interrupt 8中开始改写,如果先接收到了数据,先把接收到的数据存进去,初始化的时候RX2_Cnt = 0;(刚上电的时候这个数值为0)。
添加变量bit Rec_Flag =0; //接收完成标志位。还需要在.h文件中定义一下:extern bit Rec_Flag; 增加extern关键字,主函数中也可以调用。
假设接收到4个字符:
在这里插入图片描述
先接收到A以后,没有检测到\r\n,先接收到O以后他也是没有检测到\r\n,直到检测到\n再去判断前一个数值是不是\r,如果有,说明接收完成。
处理代码为:

		if( RX2_Buffer[RX2_Cnt] == '\n' ){if( RX2_Buffer[RX2_Cnt-1] == '\r' )Rec_Flag = 1;	//接收完成标志位,RX2_Cnt = 0;		//接收完成清0}elseRX2_Cnt++;

接收完成后,在主函数里做处理。这里不需要把参数打印出来了,将接收数据处理代码注释掉或者删除。

//		if((TX2_Cnt != RX2_Cnt) && (!B_TX2_Busy))   //收到数据, 发送空闲
//        {
//            S2BUF = RX2_Buffer[TX2_Cnt];
//            B_TX2_Busy = 1;
//            if(++TX2_Cnt >= UART2_BUF_LENGTH)   TX2_Cnt = 0;
//        }

通过检测Rec_Flag位,它已经检测到了最末尾的\r\n符号。可以用switch语句,根据RX2_Buffer[0]分情况处理,比较的时候只能是单个变量或者字符:

		if(Rec_Flag == 1)	//它已经检测到了最末尾的\r\n符号{switch (RX2_Buffer[0]){case 'A':if()break;case 'B':break;case 'C':break;case 'D':break;case 'Z':break;default:break;}Rec_Flag = 0;	//执行完后Rec_Flag 清0,防止它反复执行}

下一步,判断第2个字符,根据ASCII码表,第二个数需要大于等于48,小于等于55,则这个数据有效:

if((RX2_Buffer[1] >= 48) && (RX2_Buffer[1] <= 55))

点亮灯执行,LED = (1<<(RX2_Buffer[1] - 48)) ,RX2_Buffer[1] - 48则取至范围变为0-7,如果0左移1位就是点亮LED0,左移7位就是点亮LED1.

            	case 'A':if((RX2_Buffer[1] >= 48) && (RX2_Buffer[1] <= 55)){LED = (1<<(RX2_Buffer[1] - 48));}break;

编译完,准备去下载。下载完成打开串口助手,发送A0,发现状态反了,很好处理,取反。一定要用全部取反(~):LED = ~(1<<(RX2_Buffer[1] - 48));,不是感叹号!(位取反)。
再来看第二个:

				case 'B':SEG0 = RX2_Buffer[1] - 48;SEG1 = RX2_Buffer[2] - 48;SEG2 = RX2_Buffer[3] - 48;SEG3 = RX2_Buffer[4] - 48;break;

编译下载,选择正确的串口号,发送B1234,数码管上显示了1234。
接下来第三个,选项C,如果RX2_Buffer[1]==0,直接控制蜂鸣器的引脚。

				case 'C':if(RX2_Buffer[1] == 48)BEEP = 0;elseBEEP = 1;break;

选项D,这里要新学一个函数sprintf。

Tips:sprintf函数简介

详细可参考:sprintf函数用法详解
sprintf函数的原型如下:
int sprintf(char *str, const char *format, …);
其中,str参数是指向存储输出结果的缓存区的指针,必须具有足够的容量来存储输出结果;format参数是格式控制字符串,定义了输出的格式等;其余的…参数是输出结果。
sprintf函数的返回值为输出到缓存区中的字符数量,这个值不包括字符串结尾的’\0’。
本工程中的应用,首先需要引用头文件:#include “stdio.h”。
sprintf函数与printf相比,里面的内容和后面的内容都是不变的,只是前面加了一个,把生成的字符保存到了前面,比如定义数组char str[30];将最终要显示的字符串保存在了之前定义的数组里,
int temp = 26; //这里仅做模拟,每执行一次加1,方便区分。下载执行,输入D点击发送,显示温度:0,温度1,…
再实现命令Z,代码为:PrintString2(“Hello STC!\r\n”);
完整核心代码为:

		if(Rec_Flag == 1)	//它已经检测到了最末尾的\r\n符号{switch (RX2_Buffer[0]){case 'A':if((RX2_Buffer[1] >= 48) && (RX2_Buffer[1] <= 55)){LED = ~(1<<(RX2_Buffer[1] - 48));}break;case 'B':SEG0 = RX2_Buffer[1] - 48;SEG1 = RX2_Buffer[2] - 48;SEG2 = RX2_Buffer[3] - 48;SEG3 = RX2_Buffer[4] - 48;break;case 'C':if(RX2_Buffer[1] == 48)BEEP = 0;elseBEEP = 1;break;case 'D':sprintf(str,"温度:%d\r\n",temp);PrintString2(str);temp++;break;case 'Z':PrintString2("Hello STC!\r\n");break;default:break;}Rec_Flag = 0;	//执行完后Rec_Flag 清0,防止它反复执行}

实际场景下可以做相应的UI界面规划设计,发送相应指令,执行对应程序。下位机做好指令的接收和处理。如果担心数据乱码,可以加入数据校验,判断末尾的值是否和要求的相等,相等说明命令有效。

总结

1.了解串口的接线(TX和RX相连)和扩展(232,485等硬件)
2.学会分析和移植驱动代码。
3.拓展一下sprintf的用法(变量转字符串操作很有用)
4.课外可以自己买几个串口的模块体验一下~

课后练习

用试验箱实现简易串口控制器主机。(可以用本实验性的第二组串口/另外的核心板)
1.按下按钮0-7发送字符Ax\r\n(x表示0-7)
2.按下按钮8发送B0000\r\n
3.按下按钮9发送Z\r\n
4.按下按钮A串口发送字符C0\r\n
4.按下按钮B串口发送字符C1\r\n
4.按下按钮C发送字符Dx\r\n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/109528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020年亚太杯APMCM数学建模大赛B题美国总统的经济影响分析求解全过程文档及程序

2020年亚太杯APMCM数学建模大赛 B题 美国总统的经济影响分析 原题再现&#xff1a; 美国总统选举每四年举行一次。 2020年是美国总统大选年&#xff0c;共和党候选人唐纳德特朗普和民主党对手乔拜登竞选总统。 甲乙双方候选人在金融贸易&#xff0c;经济金融治理&#xff0c;…

python爬虫实战-京东商品数据

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 今天介绍一下如何用 Python 来批量获取京东商品信息&#xff01;&#xff01; 如果有什么疑惑/资料需要的可以点击文章末尾名片领取源码 第三方库: requests >>> pip install requests 开发环境: python 3.8 py…

【iOS】——用单例类封装网络请求

文章目录 一、JSONModel1.JSONModel的简单介绍2.JSONModel的使用 二、单例类和Block传值 一、JSONModel 1.JSONModel的简单介绍 JSONModel一个第三方库&#xff0c;这个库用来将网络请求到的JSON格式的数据转化成Foundation框架下的Model类的属性&#xff0c;这样我们就可以直…

Elasticsearch基础篇(五):创建es索引并学习分析器、过滤器、分词器的作用和配置

创建es索引并学习分析器、过滤器、分词器的作用和配置 一、基础概念Elasticsearch与MySQL的类比1. ES与MySQL的结构类比图2. ES与MySQL的类比示意表格3. 索引中重要概念索引&#xff08;Index&#xff09;文档&#xff08;Document&#xff09;字段&#xff08;Field&#xff0…

2023.10.18 区别 对象 和 类对象

目录 对象 类对象 总结 对象 对象是类的实例化结果它是内存中的一块区域&#xff0c;包含了该类的属性和方法的具体值和实现对象具有唯一的标识、状态、行为通过创建类的实例&#xff0c;我们可以在程序中操作和处理具体的对象 简单实例 class Person {public int high 1…

车载开发学习——CAN总线

CAN总线又称为汽车总线&#xff0c;全程为“控制器局域网&#xff08;Controller Area Network&#xff09;”&#xff0c;即区域网络控制器&#xff0c;它将区域内的单一控制单元以某种形式连接在一起&#xff0c;形成一个系统。在这个系统内&#xff0c;大家以一种大家都认可…

Netty系列教程之NIO基础知识

近30集的孙哥视频课程&#xff0c;看完一集整理一集来的&#xff0c;内容有点多&#xff0c;请大家放心食用~ 1. 网络通讯的演变 1.1 多线程版网络通讯 在传统的开发模式中&#xff0c;客户端发起一个 HTTP 请求的过程就是建立一个 socket 通信的过程&#xff0c;服务端在建立…

VR全景图片如何拍摄制作,拍摄制作过程中要注意什么?

引言&#xff1a; VR全景图片就是通过专业的相机设备捕捉到的一个空间的高清图像&#xff0c;再经过专业工具进行拼合&#xff0c;呈现出一种环绕式的视觉效果。想象一下&#xff0c;当你站在一个完全真实的环境中&#xff0c;可以自由地转动视角&#xff0c;看到四周的景色&a…

高数定理集合啦

haha~ 最近在准备数学竞赛&#xff0c;好久没有发布笔记啦&#xff0c;今天就来一波高数里常用的定理吧&#xff0c;不全面的话后续会更新哒~ 费马定理&#xff1a;对于一个函数的局部极值点&#xff0c;如果导数存在&#xff0c;那么导数在该点处必须为零&#xff0c;即 f(x)0…

SQL数据库管理工具RazorSQL mac中文版特点与功能

RazorSQL mac是一款功能强大的SQL数据库管理工具&#xff0c;它支持多种数据库&#xff0c;包括MySQL、Oracle、Microsoft SQL Server、SQLite、PostgreSQL等。 RazorSQL mac 软件特点和功能 多种数据库支持&#xff1a;RazorSQL支持多种数据库&#xff0c;用户可以通过一个工…

基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习高级应用

查看原文>>>【案例教程】基于R语言的Meta分析【全流程、不确定性分析】方法与Meta机器学习高级应用 Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析…

安装Elasticsearch步骤(包含遇到的问题及解决方案)

注&#xff1a;笔者是在centos云服务器环境下安装的Elasticsearch 目录 1.安装前准备 2.下载Elasticsearch 3.启动Elasticsearch 非常容易出问题 第一次运行时&#xff0c;可能出现如下错误&#xff1a; 一、内存不足原因启动失败 二、使用root用户启动问题 三、启动ES自…

uniapp使用uQRCode绘制二维码,下载到本地,调起微信扫一扫二维码核销

1.效果 2.在utils文件夹下创建uqrcode.js // uqrcode.js //--------------------------------------------------------------------- // github https://github.com/Sansnn/uQRCode //---------------------------------------------------------------------let uQRCode {…

第二证券:A股三季报披露全面启动 多领域上市公司业绩表现亮点纷呈

A股上市公司三季报宣告全面发动。Wind数据闪现&#xff0c;到10月17日记者发稿&#xff0c;来自沪深北三大交易所近80家上市公司首要晒出了最新运营效果体现的“效果单”。本周&#xff0c;相关财报宣告家数也将增至270家左右。与此同时&#xff0c;10月以来&#xff0c;亦有不…

怎么把图片改成jpg格式?

怎么把图片改成jpg格式&#xff1f;大家都知道&#xff0c;随着计算机被发明到现在已经存在了很多年&#xff0c;在这么多的的技术发展过程中&#xff0c;也形成了种类非常多的图片文件格式&#xff0c;例如平时我们能接触到的图片格式有jpg、png、gif、bmp、heic、tiff、jfif、…

vcpkg manifest 的使用

最近项目上要使用 CMakeLists 管理&#xff0c;由于 Windows 版本有依赖到 vcpkg 提供的库&#xff0c;所以需要使用 vcpkg manifest 来统一设置库的版本&#xff0c;方便后续维护 推荐一个文章&#xff0c;介绍的可以说是非常全面了 VCPKG 特性 - Versioning 不过里面也有一些…

C++标准库算法整理

目录 1、数值操作 1.1、std::accumulate 1.2、std::inner_product 1.3、std::partial_sum 1.4、std::exclusive_scan 1.5、std::inclusive_scan 1.6、std::reduce 2、相邻元素 2.1、std::adjacent_difference 2.2、std::adjacent_find 2.3、std::unique 2.4、std::u…

Apache HTTPD 换行解析漏洞(CVE-2017-15715)

Apache HTTPD是一款HTTP服务器&#xff0c;它可以通过mod_php来运行PHP网页。其2.4.0~2.4.29版本中存在 一个解析漏洞&#xff0c;在解析PHP时&#xff0c;1.php\x0a将被按照PHP后缀进行解析&#xff0c;导致绕过一些服务器的安全策略。 影响范围 apache &#xff1a;2.4.0~2.…

易点易动设备管理系统帮助生产企业提升设备巡检效率

在现代制造业中&#xff0c;设备的正常运行对于生产企业的成功至关重要。然而&#xff0c;设备巡检是确保设备安全性和可靠性的关键环节&#xff0c;但却常常耗费大量时间和资源。为了解决这个问题&#xff0c;许多企业采用了现代化的设备管理系统&#xff0c;其中易点易动设备…

山西电力市场日前价格预测【2023-10-19】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-19&#xff09;山西电力市场全天平均日前电价为210.83元/MWh。其中&#xff0c;最高日前电价为337.00元/MWh&#xff0c;预计出现在18: 30。最低日前电价为0.00元/MWh&#xff0c;预计出…