我是靠谱客的博主 超级咖啡,最近开发中收集的这篇文章主要介绍Arduino学习(二)串口通信Serial(串行通信)串口发送hello,ARDUINO 串口接收到hello,world通过串口的输入控制LED,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(92)

评论列表共有 0 条评论

立即
投稿
返回
顶部