查看: 3163|回复: 0

Stduino 零基础入门课程系列(六) 实验四:串口通讯

[复制链接]

53

主题

55

帖子

431

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
431
发表于 2020-8-28 15:49:44 | 显示全部楼层 |阅读模式
Hello!各位同学大家好~上节课我们利用管脚输出高低电平信号,控制LED的亮灭,那么我们这节课将学会利用串口来实现计算机和Stduino的通信。

嘀嘀嘀,哒~~~,嘀嘀嘀,嘀嘀嘀,哒~~~,嘀嘀嘀。

各位同学,老师刚才已经向你们发送了一串求救信号,你们接收到了嘛?其实这是一串摩斯电码。在19世纪的时候,人们就开始通过无线电来传输信息。

无线电是一种电磁波,当你按下发射装置,就会发出无线电信号,当你松开的时候,就不会发出信号了。那么怎么利用无线电来传输信号呢?美国人莫斯利用点和划两种符号来对信息进行编码。一点是一个基本的信号单位,那么一划就相当于三点的时间长度。接下来,他设计了摩斯电码,摩斯电码将点和划与字母一一对应起来。
零基础课-06-串口通讯01摩尔斯电码.png

我们刚开始上课的时候,老师发送的信号就是:
··· ——— ···
··· ——— ···
我们利用摩斯电码对照表,可以翻译老师发送的信号是:S.O.S,其实就是国际通用的求救信号啦。

我们发现,我们需要发送的信息利用点和划两个符号就可以进行编码了。
实际上,Stduino UNO也可以将信息进行编码,并传输给电脑,电脑再按照之前的约定对接收到的编码进行翻译,就得到正确的信息。
Stduino UNO并不能传输“点”和“划”。那么怎么实现对信息的编码呢?上节课我们已经学习过,Stduino UNO能够输出高低电平。实际上,Stduino UNO就是通过高低电平来向外传输信息的。
例如,我们传递一个4”。好的,我们让Stduino发送一个“4”到电脑上。Stduino UNO管脚只能传输高低电平,我们需要把“4”转换成Stduino的语言。那么我们怎么来做呢?
方法有很多。
比如,我们输出四个单位时间长度的高电平,接着立马变成低电平。这样似乎可以。
但是,除此之外,我们需要提前和电脑约定好,我们的每个“单位时间长度”是多少。

我们在每次输出信息之前,还需要先告诉电脑:脑哥,我的信息来啦,注意查收。因此在传输的数据之前,我们应该做一个标记,告诉电脑从这里开始读取信息,在结束的时候,也做一个标记,告诉电脑信息到这里结束了。

这样我们就完成了一次数据的传输。
我们重新回到“四”的这个数据的编码上:我们以四个高电平信号代替。如果我们有八个数据位,那么按照这种方法,只能表达从0~8九个数字。因此,这种方法表达的信息有限。实际上,8位数据可以传递256个数字。
在上面的数据表达方法中,我们并没有利用上低电平信息。
如果我们利用上低电平,那么每一位有高低电平两种状态(以1代表高电平、0代表电平):
0
1
那么两位有四种状态,能够表达0~3四个数字:
对于0而言,每一位都是低电平,也就是:
0 0        
对于1而言,最低的一位加上1
0 1      
对于2而言,在最低的一位加上1,本来应该等于2,但是Stduino 只输出高低电平,因此,没有第三种状态对应2。那么怎么表示2呢?
我们想想,如果有一个两位数,个位数是9,如果加上1则应该怎么操作呢?实际上,9加上1,个位变回了0(一个位没有10这个符号!),而十位需要进位加1
与之类似,对于2而言,其实是01(十进制的1)加1,参照十进制的做法,最低位加1则为0,第二位进1,那么2为:
10
同理,3可以表示为:
11
如果需要表示4,我们发现两位是不够的,4可以表示为11加上1
100

这样我们利用三位就能够表示出4了。

仔细来看,我们可以发现:
零基础课-06-进制换算01.png
好像每一位都代表的一个2的多少次方,那么如果我们给他们补齐四位,缺的部分用0代替,就有:
零基础课-06-进制换算02.png

那么每一位有两种状态,8位的数据就能够表达256个不同的数字。分别表示0~255
零基础课-06-进制换算03.png
一般而言,我们这样做就可以传输数据了。但是,为了保险,我们有时候还会设置一个数据校验位来保证接收数据是我们想要的数据。我们这里介绍一种方法,称作“奇校验”。“奇校验”位与8位数据共九位,“奇校验”的效果就是保证9位数据中“1”的个数始终为奇数。例如对于“4”而言,8位数据码为:0000 0100,此时只有一个“1”,那么为了保证九位(8位数据码位+1位校验码)的“1”个数为奇数,校验码位设置为“0”。如果是“7”呢?68位数据编码位0000 0110,为了起到“奇校验”的作用,那么校验码位会被设置成“1”。当电脑接收到数据时,就会分析数据中的1是否为奇数个,不对就会发现数据错误。
在传输数据的过程中,只需要把信息转化为8位的高低电平信号,并按照上面的格式编码,传递给电脑即可。电脑收到我们的消息,立马按照格式要求对我们的高低电平信号进行分析,获得正确的信息。
此外,除了格式需要和电脑保持一致外,我们还需要与电脑使用同一个“单位时间长度”。信息“单位时间长度”利用“波特率”来定义。波特率实际上衡量的是1秒内能够传递多少位信息(1秒除以“单位时间长度”)。因此在传递信号前,电脑要与Stduino UNO使用同样的“波特率”。

好了,说了这么多,你弄清楚串口通讯的原理了么?其实际就是通过管脚输出高低电平,只不过这种高低电平是被编码过的。电脑接收到高低电平,按照此前约定好的规则进行翻译。

那么我们接下来呢,将利用按键来与电脑沟通喔。

电路和上节课一样,完全不要改变。
零基础课-06-电路图.png
接下来我们只需要修改代码就好,非常简单。
这是上节课的代码:
#include <Arduino.h>
int BUTTON;

void setup(){
    pinMode(12,OUTPUT);
    pinMode(11,INPUT);
}

void loop()
{
    delay(15);
    BUTTON = digitalRead(11);

    if (BUTTON==HIGH){
        digitalWrite(12,HIGH);
        delay(500);
    }
    else{
        digitalWrite(12,LOW);
        delay(500);
    }

}
我们开始使用串口通讯时,需要规定好波特率。常用的波特率有960011520014400,选择哪个都可以。
#include <Arduino.h>
void setup(){
Serial.begin(9600);
    pinMode(12,OUTPUT);
    pinMode(11,INPUT);
}

接下来我们要达到的效果,就是要当按键按下的时候,向电脑传输信息:我按下啦!
这个可以使用串口通讯的打印方法实现:

void loop()
{
    delay(15);
    BUTTON = digitalRead(11);
    if (BUTTON==HIGH){
        Serial.print(“I have push this button!”);//我按下啦!
        digitalWrite(12,HIGH);
        delay(500);
    }
    else{
        digitalWrite(12,LOW);
        delay(500);
    }

}

接下来,你就可以把代码下载到Stduino UNO中了。下载后,我们需要利用串口监视器来接收Stduino UNO发送来的信息。点击右侧的“小眼睛”打开“串口监视器”。
零基础课-06-进串口监视器01.png
在串口监视器窗口中,选择“检测端口”,它会自动获取到Stduino UNO接到电脑上的串口。接下来选择波特率,与你刚才为Stduino UNO设定的波特率一致即可。我在这里选择的是9600。点击打开串口,你会发现什么也没有,这是因为我们没有按下按键。
当我们按下按键时,则会出现:
零基础课-06-串口监视器02.png
出现了一串又一串的I have push this button!”。我们现在实现了Stduino和电脑的通讯!
当然,你会发现这里每一句都连在一起,如果能够隔行输出就好了。实际上,我们可以利用Serial.println()这个方法来达到换行的目的。我们把代码调整之后,重新下载:

void loop()
{
    delay(15);
    BUTTON = digitalRead(11);
    if (BUTTON==HIGH){
        Serial.println(“I have push this button!”);//我按下啦!
        digitalWrite(12,HIGH);
        delay(500);
    }
    else{
        digitalWrite(12,LOW);
        delay(500);
    }
}
下载成功后,就可以换行输出了:
零基础课-06-进串口监视器3.png
怎么样~~是不是非常简单就能和电脑通讯了?利用串口我们把Stduino UNO和电脑连接起来,还可以做更多有意思的事情,如果你觉得很有趣,不如接着学下去吧~~趁着热乎劲~~


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

热门推荐

Stduino 零基础入门课程系列(五) 实验三:按键输入
Stduino 零基础入门课程系
Hello!各位同学大家好~上节课我们利用管脚输出高低电平信号,控制LED的亮灭,那么我
Stduino小白练习第六弹--按键控制串口通信
Stduino小白练习第六弹--
2020/01/08 星期三 作者:Astilbe 问题:我们如何通过按下按键来传输固定的信息给PC呢
37种传感器(二十九)MPU6050陀螺仪模块+Stduino Nano&UNO
37种传感器(二十九)MPU6
StduinoUno /纳米37种传感器(二十九)六轴 MPU陀螺仪模块关键词: 51 ; stm32 ; ar
stm32 最小系统 小蓝板 LED闪烁灯(三),无需刷Bootloader
stm32 最小系统 小蓝板 LE
关键词:stm32 小蓝板 STM32F103C8T6 Stduino IDE Stduino Nano LED闪烁灯 通过Stduin
Stduino IDE软件下载专区
Stduino IDE软件下载专区
Stduino IDE软件下载专区 Windows版:7月29号发布1.01, 现可
今天在文涛老大的帮助下我的stm32zet6终于把simlpefoc库跑起...
今天在文涛老大的帮助下我
[md]首先本身是刚刚从MDK转到arduino过来的新人,只因为要完开源的simplefoc,期间由
连接ADS1292模拟前端芯片,使用SPI库,导致串口不输出数据
连接ADS1292模拟前端芯片
[md]连接ADS1292模拟前端芯片,使用SPI库,导致串口不输出数据 ![QSJSBEZF83I8C907%$
©2001-2018  Stduino官网  Powered by©Discuz!   ( 皖ICP备17011998号 )
快速回复 返回顶部 返回列表