添加时间:2019年05月29日 作者:单片机接口模块 来源:单片机接口模块
单片机接口模块通讯的意义是什么
串口通讯是单片机当中用到的最多的一种通讯,对我而言,它最大的一个优势就是简单,相对于I2C、SPI等,参与串口通讯的线只有两根,分别为接收端、发送端,当然还包括电源线,我们暂且不管。
单片机接口模块通讯的意义是什么
单片机工作的时候一般都是单片机与之间单片机通讯,还有一种就是单片机与电脑的通讯,与电脑通讯主要是调试单片机的时候使用,那么串口通讯到底在通讯什么呢?它主要传输一些数据,比如12345、ABCD,也可以传输汉字,但是很少有人用汉字传输数据的,你知道为什么吗?
单片机接口模块通讯的意义是什么
单片机之间为什么要串口通讯呢?是它们闲的无聊?
当然不是,它所传输的所有数据都是为控制做准备,那么这些数据怎么就能控制外设的呢?比如说LED灯。这些数据是不能直接控制LED灯开关的,比如说电脑给单片机发送“关灯”口令,LED灯就会关闭吗?不会的,单片机怎么会知道“关灯”是什么呢,但是单片机可以判断接收到的字符串,但是我们可以提前设置好,也就是给单片机编程,当单片机接收到“关灯”这两个字符时,它就给LED引脚输出低电平,以此来达到关闭LED灯的目的。
单片机接口模块通讯的意义是什么
还有我们所传输的“关灯”,在单片机看来就是一堆二进制数字,比如说“10100011”,只有它接收到10100011这一串二进制数字时,单片机才会有所动作。这么看来单片机似乎有很傻、很死板,单片机是死的,但人是活的,我们可以把我们的思想写进单片机,这就是单片机的伟大之处。还有越是智能的芯片,人的参与越多,比如说现在流行的语音控制,苹果的SIRI、小米的小艾同学,它所能听懂的每一句话,都是软件工程师提前想好人们要说什么,并且写进芯片去的,这个工程就需要庞大的人力去完成。
单片机接口模块通讯的意义是什么
Hello world
说了这么多,我们先来做一个最简单的小实验,让Arduino在电脑上打印,也就是让Arduino发送数据,电脑就收数据,并且电脑接收到数据之后打印在屏幕上。
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Hello World");
delay(1000);
}
程序中 函数Serial.begin(9600)是设置串口通讯的波特率为9600;
单片机接口模块通讯的意义是什么
函数Serial.print("Hello World")是单片机的发送端向电脑发送引号之内的数据,即Hello World;
函数delay(1000)是延时1000毫秒,也就是一秒,为什么要延时呢?如果不延时,电脑接收数据会很频繁,你根本看不过来,给让人眼花缭乱的感觉。
在不加延时的情况下,我们可以观察Arduino板上的发送端LED灯,这时候它肯定是常亮的,正常情况下是只有接收到数据,LED灯才会闪烁一次,因为无时无刻在往电脑发送数据,我们来看一下是不是这样呢?可以看到TX(发送端)的LED灯是常亮(由于动图的清晰度太低,所以用普通照片代替Gif),如果我们加上延时之后LED灯就会每隔一秒闪烁一次。
单片机接口模块通讯的意义是什么
实验现象
每隔一秒向屏幕打印Hello World,但是接收端看上去的感觉很乱,第一个Hello World和第二个Hello World收尾相接,给人很混乱的感觉,这是为什么呢?
单片机串口通讯的意义是什么
原因在于Serial.print()函数只支持单纯的打印,并不支持换行,这时候我们需要用另外一个函数Serial.println()来解决这个问题,虽然只多了两个字母,但是打印出来的字符看的就舒服多了,因为它在打印完成之后,会另起一行继续打印,也可以理解为在打印完成数据之后,给电脑发送了回车键的命令。下面来看一下Serial.println()的实验效果。
单片机接口模块通讯的意义是什么
电脑向单片机发数据
上面的实验是Arduino向电脑发送数据,我们现在让电脑向Arduino发送数据,比如发送0或者1。发送数据很简单,只需要我们在串口监视助手上面输入0或者1即可把我们想要发送的数据传给单片机。但是问题来了,我们怎么知道单片机收到数据了,从Arduino往电脑上发数据,因为电脑有屏幕,我们可以看到现象,Arduino没有屏幕怎么办呢?
这时候就需要依靠强大的Arduino库函数,比如我们前面所说的 Serial.begin(9600)、delay(1000)等都是库函数,我们可以直接调用,而无需知道他的源代码。依靠库函数可以看到我们发送数据时应有的现象,比如说我们给Arduino发送1,当Arduino收到1之后点亮LED,而收到0之后熄灭LED。
单片机接口模块通讯的意义是什么
程序
int x = 0; //定义变量x
void setup() {
pinMode(13,OUTPUT); //设置13引脚为输出模式
Serial.begin(9600); //设置波特率为9600
}
void loop()
{
if (Serial.available() > 0) //返回串口缓冲区中当前剩余的字符个数
{
x = Serial.read();//把收到的数据赋给x
if(x=='1') //如果收到的是1
digitalWrite(13,HIGH); //点亮LED
if(x=='0') //如果收到的是0
digitalWrite(13,LOW); //熄灭LED
}
}
程序里面写注释了,在这里就不多作解释。
单片机接口模块通讯的意义是什么
实验现象
当我们向Arduino发送1之后的实验现象,可以看到LED灯13亮了,然而屏幕上并没有显示任何东西,在点亮LED灯之后,Arduino是不是应该向电脑发送一些数据,比如发送“已经为你开灯”,当收到0之后,向电脑发送“已经为你关灯”。
单片机接口模块通讯的意义是什么
进阶程序
这个程序也很简单,只需要把我们最开始的串口打印函数加上就可以了, 代码基本上和上面的差不多程序如下:
int x = 0; //定义变量x
void setup() {
pinMode(13,OUTPUT); //设置13引脚为输出模式
Serial.begin(9600); //设置波特率为9600
}
void loop()
{
if (Serial.available() > 0) //返回串口缓冲区中当前剩余的字符个数
{
x = Serial.read();//把收到的数据赋给x
if(x=='1') //如果收到的是1
{
digitalWrite(13,HIGH); //点亮LED
Serial.println("已经为你开灯");
}
if(x=='0') //如果收到的是0
{
digitalWrite(13,LOW); //熄灭LED
Serial.println("已经为你关灯");
}
}
}
单片机接口模块通讯的意义是什么
实验现象
当收到1时,可以看到屏幕上的串口助手显示了“已经为你开灯”
当收到0时的实验现象
单片机接口模块通讯的意义是什么
不止0和1
除了用0和1之外,我们还可以用“汉字”开灯控制LED灯,道理是一样的,如果有功放的话,还可以做语音播报,还有现在大火的物联网领域所使用的8266WIFI模块所使用的就是串口透传,只不过那个8266WiFi模块可以无线传输,甚至可以把我们上面程序之外的0和1穿到大洋彼岸的美国。我们现在做实验可以用0和1直接控制,但是等我们真正做产品时,如果像刚才那样是断然不可以的,一般所发送的数据可能是十几位数或更多,这是为了保证数据的可靠性和防干扰。
单片机接口模块通讯的意义是什么
Final
列举一下我们用到的Arduino函数。
Serial.begin(); 设置串口波特率
Serial.print(); 不换行打印
Serial.println(); 换行打印
Serial.available() ;返回串口缓冲区中当前剩余的字符个数
Serial.read();读取一个字节
delay(); 延时函数
pinMode(); 设置引脚的输入输出
digitalWrite();给引脚高低电平
工业串口屏,单片机接口模块,HDMI触控屏,LVDS视频模块
如何使用RS232串口通信-RS485串口模块-SPI串口模块