Hello!各位同学大家好~上节课我们利用管脚输出高低电平信号,控制LED的亮灭,那么我们这节课将学会利用串口来实现计算机和Stduino的通信。
嘀嘀嘀,哒~哒~哒~,嘀嘀嘀,嘀嘀嘀,哒~哒~哒~,嘀嘀嘀。
各位同学,老师刚才已经向你们发送了一串求救信号,你们接收到了嘛?其实这是一串摩斯电码。在19世纪的时候,人们就开始通过无线电来传输信息。
无线电是一种电磁波,当你按下发射装置,就会发出无线电信号,当你松开的时候,就不会发出信号了。那么怎么利用无线电来传输信号呢?美国人莫斯利用点和划两种符号来对信息进行编码。一点是一个基本的信号单位,那么一划就相当于三点的时间长度。接下来,他设计了摩斯电码,摩斯电码将点和划与字母一一对应起来。
我们刚开始上课的时候,老师发送的信号就是: ··· ——— ··· ··· ——— ··· 我们利用摩斯电码对照表,可以翻译老师发送的信号是: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了。
仔细来看,我们可以发现: 好像每一位都代表的一个2的多少次方,那么如果我们给他们补齐四位,缺的部分用0代替,就有:
那么每一位有两种状态,8位的数据就能够表达256个不同的数字。分别表示0~255。 一般而言,我们这样做就可以传输数据了。但是,为了保险,我们有时候还会设置一个数据校验位来保证接收数据是我们想要的数据。我们这里介绍一种方法,称作“奇校验”。“奇校验”位与8位数据共九位,“奇校验”的效果就是保证9位数据中“1”的个数始终为奇数。例如对于“4”而言,8位数据码为:0000 0100,此时只有一个“1”,那么为了保证九位(8位数据码位+1位校验码)的“1”个数为奇数,校验码位设置为“0”。如果是“7”呢?6的8位数据编码位0000 0110,为了起到“奇校验”的作用,那么校验码位会被设置成“1”。当电脑接收到数据时,就会分析数据中的1是否为奇数个,不对就会发现数据错误。 在传输数据的过程中,只需要把信息转化为8位的高低电平信号,并按照上面的格式编码,传递给电脑即可。电脑收到我们的消息,立马按照格式要求对我们的高低电平信号进行分析,获得正确的信息。 此外,除了格式需要和电脑保持一致外,我们还需要与电脑使用同一个“单位时间长度”。信息“单位时间长度”利用“波特率”来定义。波特率实际上衡量的是1秒内能够传递多少位信息(1秒除以“单位时间长度”)。因此在传递信号前,电脑要与Stduino UNO使用同样的“波特率”。
好了,说了这么多,你弄清楚串口通讯的原理了么?其实际就是通过管脚输出高低电平,只不过这种高低电平是被编码过的。电脑接收到高低电平,按照此前约定好的规则进行翻译。
那么我们接下来呢,将利用按键来与电脑沟通喔。
电路和上节课一样,完全不要改变。 接下来我们只需要修改代码就好,非常简单。 这是上节课的代码: #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); }
} 我们开始使用串口通讯时,需要规定好波特率。常用的波特率有9600、115200、14400,选择哪个都可以。 #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发送来的信息。点击右侧的“小眼睛”打开“串口监视器”。 在串口监视器窗口中,选择“检测端口”,它会自动获取到Stduino UNO接到电脑上的串口。接下来选择波特率,与你刚才为Stduino UNO设定的波特率一致即可。我在这里选择的是9600。点击打开串口,你会发现什么也没有,这是因为我们没有按下按键。 当我们按下按键时,则会出现: 出现了一串又一串的“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); } } 下载成功后,就可以换行输出了: 怎么样~~是不是非常简单就能和电脑通讯了?利用串口我们把Stduino UNO和电脑连接起来,还可以做更多有意思的事情,如果你觉得很有趣,不如接着学下去吧~~趁着热乎劲~~
|