概述
Arduino学习(二)
- 串口通信
- 波特率
- TX RX
- 连接电脑USB的线为什么可以上传程序,而电源线(DC)无法上传
- Serial(串行通信)
- Serial(串行通信)函数
- 串口发送hello,ARDUINO 串口接收到hello,world
- 通过串口的输入控制LED
串口通信
在Arduino控制器上,串口都是位于0(RX)和2(TX) 的两个引脚,Arduino的USB口通过一个转换芯片(通常为ATmegal16u2)与这两个串口引脚连接。该转换芯片会通过USB接口在计算机上虚拟出一个用于与Arduino通信的串口。
因此当使用USB线将Arduino与计算机连接时,两者之间便建立了串口连接。通过此连接,Arduino便可与计算机互传数据了。
要想使串口与计算机通信,需要先使用Serial.begin()函数初始化Arduino的串口通信功能,即
Serial.begin(speed);
其中参数speed指串口通信波特率,它是设定串口通信速率的参数。串口通信的双方必须使用同样的波特率方能正常进行通信。
波特率
波特率是一个衡量通信速度的参数,它表示每秒传送的bit的个数。例如9600波特表示每秒发送9600 bit 的数据。通信双方需要一致的波特率才能正常通信。Arduino串口通信通常会使用以下波特率:300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200.
波特率越大,说明串口通信的速率越高。
TX RX
TX和RX是串口通信的引脚.
Serial.read读的是RX针脚对应寄存器的数据,Serial.read运行在主芯片上,读不到USB的数据,只能读转换后的数据
同理Serial.print 是往TX针脚对应寄存器上写的。
连接电脑USB的线为什么可以上传程序,而电源线(DC)无法上传
USB是通用串行总线的协议,现在电脑上多数只有USB口,一般不会有串口,而Arduino使用的是avr芯片,单片机默认都会提供串口通信,所以Arduino为了解决电脑没有串口的问题,使用USB转串口的适配器把USB数据转成串口,然后再接到Arduino的TX和RX口上,USB和RX、TX上的数据是一样的,只是使用的协议不一样而已.
Serial(串行通信)
串行端口用于Arduino和个人电脑或其他设备进行通信。所有Arduino控制器都有至少一个串行端口(也称为UART或者USART)。个人电脑可以通过USB端口与Arduino的引脚0(RX)和引脚1(TX) 进行通信。所以当Arduino的引脚0和引脚1用于串行通信功能时,Arduino的引脚0和引脚1是不能做其他用的。你也可以通过Arduino开发环境软件中的串口监视器来与Arduino 控制器进行串口通信,你只需要点击Arduino IDE软件中的“串口监视器”按钮(如下图所示)就可以打开串口监视器。
Serial(串行通信)函数
1. Serial.begin()
开启串口,通常置于setup()函数中。
设置电脑与Arduino进行串口通讯时的数据传输速率(每秒传输字节数)。可使用以下速率:300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200。,你也可以根据你所使用的设备而设置其他传输速率。
语法:
Serial.begin(speed)
Serial.begin(speed, config)
参数:
speed:波特率,一般取值9600,115200等。
config:设置数据位、校验位和停止位。默认SERIAL_8N1表示8个数据位,无校验位,1个停止位。
2. Serial.end()
终止串行通讯,让RX 和 TX引脚用于Arduino的输入(INPUT)或输出(OUTPUT)功能。可调用 Serial.begin()重新打开串行通讯。
语法:
Serial.end()
3. Serial.print()
串口输出数据,写入字符数据到串口。
语法:
Serial.print(val)
Serial.print(val, format)
参数:
val: 要发送的数据(任何数据类型)
format: 输出的数据格式。BIN(二进制)、OCT(八进制)、DEC(十进制)、HEX(十六进制)。对于浮点数,此参数指定要使用的小数位数。
4. Serial.println()
串口输出数据并换行。
语法:
Serial.println(val)
Serial.println(val, format)
参数:
val:打印的值,任意数据类型。
format:输出的数据格式。
5. Serial.read()
读取串口数据,一次读一个字符,读完后删除已读数据。
语法:
Serial.read()
6. Serial.available()
返回串口缓冲区中当前剩余的字符个数。一般用这个函数来判断串口的缓冲区有无数据,当Serial.available()>0时,说明串口接收到了数据,可以读取。
举例:
while (Serial.available()>0)
{
data= Serial.read();
delay(2);
}
代码解析:
当串口接收到数据时(上面Serial.available()>0这句),反复读取串口的数据并赋值给data (上面data= Serial.read()这句),直到数据读完(即Serial.available()=0的时候)。
串口发送hello,ARDUINO 串口接收到hello,world
void setup() {
// 初始化串口
Serial.begin(9600);
}
void loop() {
// 如果缓冲区中有数据,则读取并输出
if(Serial.available()>0)
{
char ch = Serial.read();
Serial.println("hello,world");
}
}
这里遇到了问题
这里的代码中,当输入如hello,Arduino时,如何使Arduino变成world?
通过串口的输入控制LED
void setup() {
// 初始化串口
Serial.begin(9600);
pinMode(13,OUTPUT);
}
void loop() {
// 如果缓冲区中有数据,则读取并输出
if(Serial.available()>0)
{
char ch = Serial.read();
Serial.print(ch);
//开灯
switch(ch)
{
case 'a':
digitalWrite(13,HIGH);
Serial.println("turn on");
break;
case 'b':
digitalWrite(13,LOW);
Serial.println("turn off") ;
break;
case 'c':
delay(3000);
digitalWrite(13, HIGH);
Serial.println("delay turn on") ;
break;
case 'd':
delay(3000);
digitalWrite(13, HIGH);
Serial.println("delay turn off") ;
break;
default:
digitalWrite(13, HIGH);
delay(2000);
digitalWrite(13, LOW);
delay(2000);
Serial.println("LED blink") ;
break;
}
}
}
问题:
在最后的default中,LED为什么只是闪了两下就没了,为什么不会一直闪?
最后
以上就是超级咖啡为你收集整理的Arduino学习(二)串口通信Serial(串行通信)串口发送hello,ARDUINO 串口接收到hello,world通过串口的输入控制LED的全部内容,希望文章能够帮你解决Arduino学习(二)串口通信Serial(串行通信)串口发送hello,ARDUINO 串口接收到hello,world通过串口的输入控制LED所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复