【单片机入门】(三)应用层软件开发的单片机学习之路-----UART串口通讯和c#交互...

本文由网友投稿。

作者:陈显达

原文标题:【单片机入门】(三)应用层软件开发的单片机学习之路-----UART串口通讯和c#交互

原文链接:https://www.cnblogs.com/1996-Chinese-Chen/p/16826558.html

引言

在第一章博客中,我们讲了Arduino对Esp32的一个环境配置,以及了解到了常用的一个总线通讯协议,其中有SPI,IIC,UART等,今天我为大家带来UART串口通讯和c#串口进行通讯的一个案例,以及什么是中断,中断的作用和实践,话不多说,让我们正式开始。

UART

在第一篇博客中,我们讲了UART是需要一个接收一个发送的引脚,总共两个,分别是TXD(发送引脚),RXD(接收引脚),不管是什么类型的单片机串口引脚都是这两个,可能有的是少了最后面的那个D,但是都是一样的东西,在ESP32的开发板上,是有三对UART的引脚的,也就是说板子上有三个串口可以供我们使用,如下图,Serial0对应的引脚为1和3,Serial1对应的引脚为9和10,Serial2对应的引脚为16和17,但是在我们烧录的时候,1和3是不能使用的,因为我们通过USB将单片机连接到电脑上,使用的串口引脚就是1和3,所以我们可使用串口只有两个,而Arduino IDE上面,对应的Serial也有四个静态类,分别是Serial,Serial1和Serial2以及Serial3。虽然他的数量和我们ESP32的串口数量是一样,但是只有第一个可以使用,后面两个我们是无法使用的,因为后面两个对应的引脚和我们ESP32的引脚是不相同的,我们可以从下面第二个图看到,Serial1,Serial2的 PINS是和我们ESP32的引脚是对不上的,所以我们在串口开发的时候是不使用这两个,对于第一个Serial我们是可以使用的。

f08c4813ae4e80cb2f4156f549606203.png0ee5e8ca345c522b7b93efa4d9ba2030.png

我们如果需要使用ESP32的串口开发,在ESP的开发包里,官方给我们提供了一个HardwareSerial的一个串口库,里面我们可以使用开发板上面的串口,同时将引脚指定为我们引脚图上面的引脚。这个库的位置为我们Arduino IDE目录下的hardware/espressif/esp32/cores/esp32可以找到这个库,这个文件夹下包含了一些ESP32的官方库;使用这个HardwareSerial.h文件我们可以实现使用ESP32开发板上面的串口进行开发,接下来我们在代码中去了解他如何使用。

62d6307b03de719e07bee7f67e37be47.png

编码

在下面的代码中,我们开始了一个简单的一个串口通讯,在代码第一行,是和c语言一样引入我们需要的库文件,然后在第二行,定义了HardwareSerial这个类的一个MySerial1对象,里面的构造函数的值是1代表着,我们将使用第一个串口,在下面的setup里面,我们开始启动了MySerial1这个串口对象,启动的波特率是9600,数据长度是8,校验位是NONE,停止位是1,以及串口的rx的引脚是16,tx的引脚为17。在下一行代码,我们传入了一个我们下方定义的receiveEvent的一个方法,这个方法用来接收串口接收数据的一个回调,将我们这个方法指针传入进去,在串口接收到数据之后,会进入到我们这个方法中。

最后一行代码,我们是启用了第0个串口,波特率是9600。

可能上面的代码有朋友就有疑惑了,明明16和17在引脚图中定义的串口是2,为什么这里定义的是1呢,实际上这个我们可以自己修改这个串口的定义和引脚,这个构造函数传入的参数取值范围为0,1,2,对应的是我们开发板上的三个UART串口,在begin哪里传入的引脚和这个0,1,2是没有任何关系的,但是这个传入的引脚必须是开发板上三个UART串口之一,所以我们也可以定义为MySerial2.begin(9600,SERIAL_8N1,10,9);这里的0,1,2仅对应有三对串口,不指定对应的引脚,在begin方法我们指定对应的串口的引脚。

在下面的接收到串口消息的回调中,我们第一行代码调用了available这个方法,这个方法返回的是一个int参数,当然了我们这块也可以写available()>0,也是可以的,这个方法是从串口缓存中读取我们接收到的数据长度,这个条件成立,说明我们是有接收到数据,然后在里面我们开始去读取数据。

在所有的Serial都是及程序Arduino的一个Stream的一个基础类,这个类提供了一些我们对数据处理的一个方法,所以在下面的代码中,我们将读取的数据转为字符串,然后将代码延迟暂停了一秒,随后,我们使用我们的串口对象,将接收到的数据写入缓冲区,缓冲区会把我们写入的数据,在发送出去,即将println里面传入的参数发送到我们的串口发送方,谁发的数据,谁就会收到"i am receive!!"+str。

#include <HardwareSerial.h>
HardwareSerial MySerial1(1);
void setup() {// put your setup code here, to run once:MySerial1.begin(9600,SERIAL_8N1,16,17);MySerial1.onReceive(receiveEvent);Serial.begin(9600);
}void loop() {}
void receiveEvent()
{if(MySerial1.available()){String str= MySerial1.readString(); delay(1000);MySerial1.println("i am receive!!"+str);}delay(1000);
}

Stream包括了以下方法,其中继承Stream的分别为串口,IIC通讯的Wire,SD卡的一个类,以及用于网络连接的Ethernet类,都可以使用这些方法用来对数据进行操作。

f0788c7e8cddb75f9dc8817da4f012d9.png

c#编码

C#方面的代码则简单很多,界面一个开启串口的按钮,一个发送数据的按钮和文本框,以及用来接收数据显示的文本框。

在代码中我们开启了串口,指定了打开的是哪一个串口,一些属性是需要和ESP32那边设置一样的,在上面我们设置波特率为9600,数据为是8,停止位是1,校验位是NONE,所以在c#这边我们也需要这样设置,不过校验位默认是NONE的,所以此处我们没有设置,然后开启串口,注册了一个接收到数据的一个回调,然后定义一个1024的字节数组,从串口读取数据,返回读取的数据长度,然后在对刚才定义的1024字节数组进行截取,然后通过UTF-8的格式转为字符串,然后显示到界面上的富文本框中,在发送按钮事件中,我们从输入框读取数据转为字节数组,然后将数据写入到串口中去即可。

18c1fa4866c0811e448469550183dd2a.png
public partial class Form1 : Form{private SerialPort serialPort = new SerialPort("COM6");public Form1(){InitializeComponent();}private async void button1_Click(object sender, EventArgs e){serialPort.BaudRate = 9600;serialPort.StopBits = StopBits.One;serialPort.DataBits = 8;serialPort.Open();serialPort.DataReceived += (a, b) => {var serial = a as SerialPort;var data = new byte[1024];var res=serial.Read(data,0, data.Length);data = data[..res];string st = Encoding.UTF8.GetString(data); BeginInvoke(() => { richTextBox1.Text += st; });};}private void button2_Click(object sender, EventArgs e){var str = Encoding.UTF8.GetBytes(textBox1.Text);serialPort.Write(str, 0, str.Length);}}

接线图

在此处的实例,我们需要准备一个USB转TTL的模块,四根母对母的杜邦线,在程序烧录之后,我们需要将使用杜邦线让USB转TTL模块和单片机进行连接,VCC或者5V接单片机的5V引脚,USB转TTL的GND和单片机的GND相接,然后USB转TTL的rxd引脚和单片机17引脚相接,txd引脚和单片机的16引脚相接,如下图所示接线,5v不可和gnd接反,否则可能会烧坏模块,确认接线无误后,将USB转TTL模块插入电脑中,然后代码中运行c#程序,电机开启串口,随后发送数据,可以接收到单片机的反馈。

0fdd60cf68e84281dadd7b53e981812d.pnga6cd6a953df755bf12ffd590ff0eb2ba.png

30d986224d172aaa3ba593412e479d46.png

14d91ca1c9e0024d060f16b69b058c6d.png

结语

串口通讯是物联网中,必不可少的一种通讯方式,通常情况下都是RX接TX,TX接RX,除非是模块厂商的规定,否则都是这样接线,在后面的课程中,我会依次对IIC,以及PWM,还有SPI,以及中断单独做一个讲解,欢迎大家关注,学习和探讨,我会将我所知道的都会分享,同时,后面也会有STM32系列的教程。如果有感兴趣的朋友,可以加QQ群一起来讨论822084696。

c1004b34b9b3be0ea386f09d66d0f8d7.png

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

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

相关文章

linux中使用yum的优点,linux – 自动“yum update”以保证服务器安全 – 优点和缺点?...

这取决于根据我使用CentOS的经验,它非常安全,因为您只使用CentOS基本存储库.您是否应该偶尔尝试更新失败…是…在您应该期望出现故障的硬盘驱动器或偶尔出现故障的CPU的同一级别上.您永远不会有太多备份. &#x1f642;关于自动更新的好处是,您可以比手动修补更快(因此更安全).…

高能力成熟度软件企业中软件质量工程师的职责

随着科学技术的不断发展进步&#xff0c;企业之间的竞争越来越激烈。软件企业要想在竞争中发展生存&#xff0c;提高软件产品质量已成为必要条件。在一些高能力成熟度软件企业中&#xff0c;专门成立了质量保证和控制职能部门&#xff0c;起着提高项目管理透明性和确保软件产品…

存储过程和函数的区别

存储过程和函数的区别存储过程和函数目的是为了 可重复地 执行操作数据库的sql语句的集合。区别是写法和调用上。写法上&#xff1a;存储过程的参数列表可以有输入参数、输出参数、可输入输出的参数&#xff1b;函数的参数列表只有输入参数&#xff0c;并且有return <返回值…

机器学习案例丨基于广泛和深入的推荐 - 餐厅评级预测

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;18分钟&#xff09;Microsoft Azure Machine Learning Studio 是微软强大的机器学习平台&#xff0c;在设计器中&#xff0c;微软内置了15个场景案例&#xff0c;但网上似乎没有对这15个案例深度刨析的分析资料&#…

css linux 等宽字体,比例字体等宽字体

我们都知道等宽字体和比例字体的区别&#xff0c;就在于比例字体(Monospaced Font)即每个字母宽度是按一定比例自动调整的&#xff0c;而等宽字体(Proportional font)则是固定宽度&#xff0c;固定间距&#xff0c;字体的每一个字母和字符所占的水平空间都是相同的。比例字体&a…

三星智能家居系统频繁故障 大批用户受到影响

Shelley Powers正在她密苏里州郊区的房子中鼾睡&#xff0c;突然警铃大作将她惊醒&#xff0c;在仔细排查之后&#xff0c;发现是虚惊一场&#xff0c;是安全传感器误报。在此之后的几周&#xff0c;她的三星Smart Things智能家居系统频繁出现故障&#xff0c;比如设定的灯具不…

适用于 .NET 的开源文本差异对比组件

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具或组件&#xff0c;希望对您有用&#xff01;简介对于开发人员来说&#xff0c;Git 是我们经常使用的工具&#xff0c;在每次编写完代码并提交后&#xff0c;我们可以通过 git dif…

MySQL—查询某时间范围的数据

-- 查询今天的数据 select * from user where to_days(birthday) to_days(CURDATE()); -- 查询昨天的数据 select * from user where to_days(CURDATE()) - to_days(birthday)<1; -- 查询最近7天的数据 select * from user where birthday > DATE_SUB(CURDATE(),INTERVA…

box-shadow阴影合集

2019独角兽企业重金招聘Python工程师标准>>> * box-shadow可以设置6个值。其中4个可选&#xff1b;2个必须指定&#xff1a;分别是x轴偏移量和y轴偏移量&#xff0c;这2个值可以是正值&#xff0c;可以是负值&#xff0c;也可以是0&#xff0c;但不可以省略不写 阴影…

《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.5 为跨年度的个人参赛选手构造记录...

本节书摘来自华章计算机《数据科学R语言实践&#xff1a;面向计算推理与问题求解的案例研究法》一书中的第2章&#xff0c;第2.5节,作者&#xff1a;[美] 德博拉诺兰&#xff08;Deborah Nolan&#xff09;  邓肯坦普朗&#xff08;Duncan Temple Lang&#xff09;  更多章…

基于 abp 微服务架构的开源低代码平台

你好&#xff0c;这里是 Dotnet 工具箱&#xff0c;定期分享 Dotnet 有趣&#xff0c;实用的工具或组件&#xff0c;希望对您有用&#xff01;简介 ABP-MicroService是 一个基于ABP vNext微服务架构、vue-element-admin的后台管理框架&#xff0c;适用于大型分布式业务系统和企…

linux android sdk gengxinman,Android 实现增量更新

一、概述增量更新相较于全量更新的好处不言而喻&#xff0c;利用差分算法获得1.0版本到2.0版本的差分包&#xff0c;这样在安装了1.0的设备上只要下载这个差分包就能够完成由1.0-2.0的更新。比如&#xff1a;存在一个1.0版本的apkapk1.png然后需要升级到2.0版本&#xff0c;而2…

(转)yi_meng linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别

linux 下 ifcfg-eth0 配置 以及ifconfig、ifup、ifdown区别 原文&#xff1a;https://www.cnblogs.com/yi-meng/p/3214471.html这3个命令的用途都是启动网络接口&#xff0c;不过&#xff0c;ifup与ifdown仅就 /etc/sysconfig/network- scripts内的ifcfg-ethx&#xff08;x为数…

Pycharm上Django的使用 Day8

2019独角兽企业重金招聘Python工程师标准>>> 1.添加新条目 1>编写用于添加新条目的表单 在forms.py中创建一个与模型Entry相关联的表单 1处给字段text指定一个空标签 2处定义小部件widgets,widgets是一个HTML表单元素 2>定义new_entry的URL模式 在用于添加新条…

物联网创新领域的三大驱动性趋势

从设备对接到区块链&#xff0c;今天我们将介绍几项物联网开发者必须了解的最新技术趋势。 物联网正在快速改变着我们的工作与生活方式。过去十年以来&#xff0c;利用惟一IP地址实现联网早已不是难事&#xff0c;但传感器、处理器以及其它多种新兴技术的涌现真正让物联网走向了…

TensorFlow.NET 实战 -- 为.NET开发者开启机器学习之旅

在IT技术飞速发展的今天&#xff0c;云计算、人工智能、大数据和云原生应用等新兴技术的发展为我们带来一波又一波的浪潮&#xff0c;也对软件开发者提出了更高的要求&#xff0c;特别是人工智能开发领域&#xff0c;应运而生的新概念让人目不暇接。作为一个.NET开发者的你&…

Arduino I/O Expansion Shield V7.1

介绍&#xff1a; 传感器扩展板&#xff0c;目的是为初学者省去繁琐的面包板接线和故障排除&#xff0c;专注实现自己的创意想法。 扩展板V7.1不仅保留老版本的所有优点&#xff0c;改善了它的易用性&#xff0c;更重要的是它兼容Arduino新一代主控器DUE。现在V7.1以其强大的扩…

展讯康一:2020年推出5G芯片 第一桶金含金量最高

工信部部长苗圩在全球5G大会上表示&#xff0c;5G网络将2020年规模商用。对此&#xff0c;终端、芯片、网络方面准备如何&#xff1f;国产自主芯片厂商展讯通信全球副总裁康一博士在接受搜狐科技专访时透露&#xff0c;在5G方面&#xff0c;展讯投入较大&#xff0c;力争在2018…

简单的单臂路由的配置实验 (思科)

实验名称&#xff1a;简单的单臂路由的 配置实验 &#xff08;思科&#xff09;实验拓扑&#xff1a; 实验需要&#xff1a;1、按图中所示配置设网络备vlan&#xff0c;IP地址2、能够使各pc互相ping通。 实验步骤&#xff1a; 1、配置终端设备&#xff1a;pc1-pc5按照拓扑图中所…

C#实现生成Markdown文档目录树

1前言&#xff08;昨天那篇排版有点问题&#xff0c;不能忍&#xff0c;今天重发&#xff01;&#xff09;之前我写了一篇关于C#处理Markdown文档的文章&#xff1a;C#解析Markdown文档&#xff0c;实现替换图片链接操作算是第一次尝试使用C#处理Markdown文档&#xff0c;然后最…